Ubantu16 32位 X86 gcc版本及优化选项不同汇编代码的区别

 环境:Ubantu 16    32位  

 参考书籍:《深入理解计算机系统》

 这是一小段C代码块

void comp(char x,int *p)
{
	if(p && x<0)
	  *p+=x;
}
  1. 在gcc 5.4 版本下

     (1)用优化选项-O2编译

 

 得到的.s 文件打开后部分截图为

 

反汇编.o文件得到的指令为

(2)用优化选项-O0编译

        得到的.s文件部分截图为

 反汇编.o文件得到的指令为

 

其他的还分别尝试了优化选项-O1 -O3 都和-O2差不多

2.我还分别尝试了gcc 4.7 4.8 4.9版本下汇编出来的指令,发现版本引起的变化并不大,编译优化选项引起变化比较大。

关于gcc不同版本切换的问题,请参见如下,博主写得非常详细

https://www.cnblogs.com/uestc-mm/p/7511063.html#undefined

 

 附:上面汇编指令的注释

movl  8(%esp), %edx

R[edx]<---M[R[esp]+8] 把函数comp的第二个参数p复制到寄存器edx

movl  4(%esp), %eax

R[eax]<---M[R[esp]+4] 把函数comp的第一个参数x复制到寄存器eax

testl    %edx, %edx

根据pp相“与”的结果置标志

 je  .L1

p=0 ,则转L1处执行

testb   %al, %al

根据xx相“与”的结果置标志

jns .L1

x>=0,则转L1处执行

movsbl    %al, %eax

R[al]符号扩展送到R[eax]

addl   %eax, (%edx)

M[R[edx]]<---R[eax]+ M[R[edx]] p所指向的内容与x相加得到的结果赋给P指向的内存

.L1:

 

 寄存器al 是寄存器eax的低8位,因为是char类型

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值