您浏览的页面不存在
我的图书馆
信息提示:
您要浏览的文章不存在,5秒后将自动跳转到“360doc个人图书馆”的首页,您可以继续浏览其它好文章,也可以&
&当前页面。比较两个数的大小, 用C语言写很容易
int compare1(int x, int y)
if (x & y)
else if (x == y)
return -1;
用gcc生成powerPC ppu汇编指令, 用默认的-O选项
生成的汇编代码:
.compare1:
stdu 1,-80(1)
std 31,72(1)
stw 0,128(31)
stw 9,136(31)
lwz 9,128(31)
lwz 0,136(31)
cmpw 7,9,0
stw 0,48(31)
lwz 0,128(31)
lwz 9,136(31)
cmpw 7,0,9
stw 9,48(31)
stw 0,48(31)
lwz 9,48(31)
ld 11,0(1)
ld 31,-8(11)
blr当然这么多指令, 很多都不太清楚, 但是有点写操作当中是有些压栈了的,下面就用gcc 的-O3 选项就行优化
.compare1:
cmpw 7,3,4
ble 7,.L11
b .L6这样得到的代码还是明显少了很多, 但是我用if语句, 跳转比较多, 大家都知道跳转是比较耗时的
所以我就写了另外的一种写法:
int compare2(int x, int y)
return x & y ? -1 : x == y ? 0 : 1;
}上面的代码非常简洁, 我们看一下gcc -O3汇编出来的代码, 默认-O选项的代码我就不列出了, 读者可以自己试试以下
.compare2:
// r3 = x, r4 = y
cmpw 7,3,4
srawi 11,0,31 // r0算术右移31位
xor 3,11,0
subf 3,3,11
// 这个指令的意思是说r3 = r11 - r3
blt 7,.L15
srwi 9,3,31
// r9 = r3 逻辑右移31位
blr我大概知道了编译是怎么做, 所以我自己根据编译的做法, 自己也写了一个:
// r9 = -1
r6, r3, r4
cr7, r6, 0
// cal the diff
// jump to store -1
r6, r6, r7
// cal 0 - diff, if the diff = 0, then r6 = 0, diff & 0, r6 & 0
// mov the sign bit to r9,
// r3 是存储返回值的寄存器
以上就是比较两个数的大小的C和汇编的分析, 但是用if语句的话跳转比较多。
另外比较有两个比较常用的功能就是求两个数的最大值或者是最小值
inline int max(int x, int y)
if (x &= y)
inline int min(int x, int y)
if (x & y)
inline int max(int x, int y)
return x &= y ? x :
inline int min(int x, int y)
return x & y ? x :
inline int max(int x, int y)
int buf[] = {x, y};
int shif = sizeof(int) * 8 - 1;
// get the number for shif bits
unsigned int sign = 0 ^ (((unsigned int)(x - y)) && shif);
// if x & y, then sign = 0, then return x
return buf[sign];
inline int min(int x, int y)
int buf[] = { x, y };
int shif = sizeof(int) * 8 - 1;
// get the number for shif bits
unsigned int sign = 1 ^ (((unsigned int)(x - y)) && shif);
// if x & y, then sign = 0, then return x
return buf[sign];
}对于上面的三种方法, 大家可以反汇编一下, 看看那个生成的指令比较少, 也可以比较一下性能, 看看那个比较快, 可以把结果添加评论告诉我。
有误请指出, 分享请标明出处, 谢谢!
本文已收录于以下专栏:
相关文章推荐
DATAS SEGMENT;此处输入数据段代码
W DB 100,10
DATAS ENDS
STACKS SEGMENT;此...
网上有较多的帖子讨论一些面试的题目,其中有一道就是“定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句”
从原理上将,一个int整形变量,最高位是正负位,只要知道两者差值最高位是正还是...
人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..
C. The Big Race
time limit per test
memory limit per test
256 megabytes
下面简单介绍sqlserver2008两个常用的存储过程
1、比较两个日期大小的存储过程
2、获取当前月份的最大天数的存储过程
1、创建比较两个日期大小的存储过程
1)创建比较两个日期大...
CodeForces 602A Two Bases(简单题,比较两个不同进制数的大小)----Codeforces Beta Round #333 (Div. 2)
本片博文整理自网上的资料,再次一并谢谢:
http://blog.csdn.net/zhanxuw/article/details/4489715
http://tangyuan1314.it...
DATAS SEGMENT
mess db 'please
input 3 nums (0-9)',0dh,0ah,'$'
mess1 db 0dh,0ah, 'result:',0dh,0ah...
1 #include &stdafx.h&
// 包含stdio.h头文件
int main(){
int i, total = 0;
// 声明两个整型变量
他的最新文章
讲师: 许鹏
讲师:董付国
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)