aduna2:
.LFB0:
.cfi_startproc
push ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
mov ebp, esp
.cfi_def_cfa_register 5
sub esp, 16
mov DWORD PTR [ebp-4], 10
mov eax, DWORD PTR [ebp+12]
mov edx, DWORD PTR [ebp+8]
add edx, eax
mov eax, DWORD PTR [ebp+16]
add edx, eax
mov eax, DWORD PTR [ebp-4]
add eax, edx
leave
aduna:
.LFB1:
.cfi_startproc
push ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
mov ebp, esp
.cfi_def_cfa_register 5
sub esp, 28
mov DWORD PTR [ebp-4], 7
mov eax, DWORD PTR [ebp-4]
mov DWORD PTR [esp+8], eax
mov eax, DWORD PTR [ebp+12]
mov DWORD PTR [esp+4], eax
mov eax, DWORD PTR [ebp+8]
mov DWORD PTR [esp], eax
call aduna2
leave
main:
.LFB2:
.cfi_startproc
push ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
mov ebp, esp
.cfi_def_cfa_register 5
and esp, -16
sub esp, 16
mov DWORD PTR [esp+4], 6
mov DWORD PTR [esp], 5
call aduna
mov DWORD PTR [esp+4], eax
mov DWORD PTR [esp], OFFSET FLAT:.LC0
call printf
leave
我在這段代碼中有以下問題:在主要我無法弄清楚當esp 16相對於ebp。我在「adunare」和「adunare2」中遇到了這個問題。我無法弄清楚它會在ebp的相對位置。我無法弄清楚爲這個程序繪製一個堆棧,因爲我所有的堆棧在「adunare2」我得到了ebp + 8,ebp + 12,ebp + 16.這將有助於向我展示一個,因爲我不明白髮生了什麼。在每次通話時都會插入一個返回地址?如果在「adunare2」中是這樣,你如何使用+ 8,+ 12,+ 16得到提到的參數?彙編堆棧3函數
這裏是C代碼:
#include<stdio.h>
int aduna2(int a,int b,int c)
{
int d=10;
return a+b+c+d;
}
int aduna(int a,int b)
{
int c=7;
return aduna2(a,b,c);
}
int main()
{
printf("%d\n",aduna(5,6));
}
反彙編看起來不完整。 (我希望在'離開'後'ret')。你怎麼得到的?這不是一些「聰明」的反彙編輸出嗎?使用編譯器列表或正常反彙編。 – Ped7g