我已通過以下一系列文章讀拆卸線: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