我已通过以下一系列文章读拆卸线:http://www.altdevblogaday.com/2011/11/09/a-low-level-curriculum-for-c-and-cOSX 64位C++通过线
所示的反汇编代码和反汇编代码我管理,以产生同时运行相同的代码变化相当显著和我缺乏解释差异的理解。
有没有人可以逐行浏览它,也许可以解释它在每个步骤中做了什么?我从周围搜索中得到了感觉,我已经完成了前几行与帧指针有关的事情,在我的反汇编代码中似乎还有一些额外的行,以确保在将新值写入它们之前寄存器是空的(缺席从文章中的代码)
我在OSX(原作者使用Windows)上使用g ++编译器从XCode 4中运行此操作。我真的无法知道这些差异是由于操作系统,体系结构(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
通过在线故障提供全系列将是非常有启发但任何帮助理解这一点,将不胜感激。
谢谢你 - 绝对清除了一些我不明白的东西!事实上,这是一个不同的语法,完全解释了许多以及你对不同偏移的看法。 – GeoffK 2013-02-22 22:43:12
原文似乎很好。在x86上,'argc'和'argv'将被调用者推送,因此相对于'ebp'处于* positive *偏移量(ebp + 0是旧BP,ebp + 4是返回地址,ebp + 8是第一个参数...)。在x86_64 OSX上,前两个参数传入'rdi'(在这种情况下是'edi',因为它是一个int)和'rsi'。它看起来像是用'-O0'编译的,所以参数会立即保存到堆栈中。 – 2013-02-22 23:03:02
对此不以为然 - 但我如何启用这些优化?肯定会喜欢用/不用,并且比较 – GeoffK 2013-02-22 23:05:56