我學習了32位機器,我知道子$ 12,%esp與彈出%eax和mov $ 0,%eax時的三次相同。
但我不知道爲什麼我們使用add $ 18,%rsp啓動過程調用或sub $ 18,%rsp在x86-64機器上啓動過程調用。
爲什麼編譯器將此規則用於過程調用?參數規則?
0x0000000000400df3 <main+191>: mov $0x402227,%edi
0x0000000000400df8 <main+196>: callq 0x400ab8 <[email protected]>
0x0000000000400dfd <main+201>: callq 0x4014c0 <read_line>
0x0000000000400e02 <main+206>: mov %rax,%rdi
0x0000000000400e05 <main+209>: callq 0x401139 <phase_3>
-----------------------------------------------------------------------
example:
0x0000000000401139 <example+0>: sub $0x18,%rsp
0x000000000040113d <example+4>: lea 0x8(%rsp),%rcx
0x0000000000401142 <example+9>: lea 0xc(%rsp),%rdx
0x0000000000401147 <example+14>: mov $0x40248a,%esi
0x000000000040114c <example+19>: mov $0x0,%eax
0x0000000000401151 <example+24>: callq 0x400ac8 <[email protected]>
0x0000000000401156 <example+29>: cmp $0x1,%eax
你的功能是什麼樣的? –
由於0x18和18之間的差異,你的問題值得讚賞。:) –
啊哈!我錯誤0x18 = 24大聲笑 – Silvester