我一直在阅读以下系列文章:http ://www.altdevblogaday.com/2011/11/09/a-low-level-curriculum-for-c-and-c
显示的反汇编代码和我在运行相同代码时设法生成的反汇编代码差异很大,我缺乏解释差异的理解。
有没有人可以逐行遍历它,也许可以解释它在每一步都在做什么?我从我所做的搜索中得到感觉,前几行与帧指针有关,在我的反汇编代码中似乎还有一些额外的行,以确保在将新值放入寄存器之前寄存器是空的(不存在来自文章中的代码)
我正在使用 XCode 4 中的 g++ 编译器在 OSX(原作者使用 Windows)上运行它。我真的不知道这些差异是否是由于操作系统、架构(可能是 32 位与 64 位?)或编译器本身。它甚至可能是我猜的代码——我的代码包含在主函数声明中,而原始代码没有提及这一点。
我的代码:
int main(int argc, const char * argv[])
{
int x = 1;
int y = 2;
int z = 0;
z = x + y;
}
我的反汇编代码:
0x100000f40: pushq %rbp
0x100000f41: movq %rsp, %rbp
0x100000f44: movl $0, %eax
0x100000f49: movl %edi, -4(%rbp)
0x100000f4c: movq %rsi, -16(%rbp)
0x100000f50: movl $1, -20(%rbp)
0x100000f57: movl $2, -24(%rbp)
0x100000f5e: movl $0, -28(%rbp)
0x100000f65: movl -20(%rbp), %edi
0x100000f68: addl -24(%rbp), %edi
0x100000f6b: movl %edi, -28(%rbp)
0x100000f6e: popq %rbp
0x100000f6f: ret
原文章的反汇编代码:
mov dword ptr [ebp-8],1
mov dword ptr [ebp-14h],2
mov dword ptr [ebp-20h],0
mov eax, dword ptr [ebp-8]
add eax, dword ptr [ebp-14h]
mov dword ptr [ebp-20h],eax
完整的逐行细分将非常有启发性,但对于理解这一点的任何帮助将不胜感激。