【发布时间】:2016-10-07 07:48:57
【问题描述】:
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
我在这段代码中有以下问题:主要是我无法弄清楚当 sub esp 16 相对于 ebp 时 esp 的去向。我在“adunare”和“adunare2”中有这个问题。我无法弄清楚它相对于 ebp 的位置。我无法弄清楚为这个程序绘制一个堆栈,因为我所有的堆栈都在“adunare2”中卡住了我得到 ebp+8,ebp+12,ebp+16。给我看一个会很有帮助,因为我不明白发生了什么。并且在每次调用时都会插入一个返回地址?如果在“adunare2”中是,如何使用 +8,+12,+16 获得提到的参数?
这里是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在leave之后)。你是如何得到的?这不是一些“智能”的反汇编输出吗?使用编译器列表或正常反汇编。