这里有点小意思。我重复了该链接下的代码的实验,得到了两种不同的汇编代码。区别在于,第一种,变量b的地址比a的要“小”(downward),而我得出的却是相反(upward)。还有,按帖子说地址-0x4(%rbp)
是一种“clang的隐藏变量”,好神秘!
结论,clang与gcc的差别不小。或者,谁能告诉我更多细节?
Simple代码
int main()
{
int a = 5;
int b = a + 6;
return 0;
}
原文给出的汇编代码(Mac OS,Clang)
(gdb) disassemble
Dump of assembler code for function main:
0x0000000100000f50 <main+0>: push %rbp
0x0000000100000f51 <main+1>: mov %rsp,%rbp
0x0000000100000f54 <main+4>: mov $0x0,%eax
0x0000000100000f59 <main+9>: movl $0x0,-0x4(%rbp)
0x0000000100000f60 <main+16>: movl $0x5,-0x8(%rbp)
0x0000000100000f67 <main+23>: mov -0x8(%rbp),%ecx
0x0000000100000f6a <main+26>: add $0x6,%ecx
0x0000000100000f70 <main+32>: mov %ecx,-0xc(%rbp)
0x0000000100000f73 <main+35>: pop %rbp
0x0000000100000f74 <main+36>: retq
End of assembler dump.
b的地址在-0xc(%rbp)
我得到的汇编代码(Ubuntu下,gcc)
(gdb) disassemble
Dump of assembler code for function main:
0x00000000004004d6 <+0>: push %rbp
0x00000000004004d7 <+1>: mov %rsp,%rbp
0x00000000004004da <+4>: movl $0x5,-0x8(%rbp)
0x00000000004004e1 <+11>: mov -0x8(%rbp),%eax
0x00000000004004e4 <+14>: add $0x6,%eax
0x00000000004004e7 <+17>: mov %eax,-0x4(%rbp)
0x00000000004004ea <+20>: mov $0x0,%eax
0x00000000004004ef <+25>: pop %rbp
0x00000000004004f0 <+26>: retq
End of assembler dump.
b的地址在-0x4(%rbp)