环境:Ubantu 16 32位
参考书籍:《深入理解计算机系统》
这是一小段C代码块
void comp(char x,int *p)
{
if(p && x<0)
*p+=x;
}
- 在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 | 根据p与p相“与”的结果置标志 |
je .L1 | 若p=0 ,则转L1处执行 |
testb %al, %al | 根据x与x相“与”的结果置标志 |
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类型