写一段简单的代码
include<stdio.h>
int Sum(int a, int b)
{
int ret = a + b;
return ret;
}
int main()
{
int a = 3;
int b = 5;
int sum = 0;
sum = Sum(a, b);
return 0;
}
在vs2013下编译,反汇编与寄存器地址与内容变化,从中可以看出函数调用过程中堆栈空间变化。
反汇编 | ebp | esp | 其他 | |||
地址 | 内容 | 地址 | 内容 | 地址 | 内容 | |
0x00AFF780 | 88 f7 af 00 | 0x00AFF734 | 99 19 bd 00 | <-按F10后ebp和esp的起始位置 | ||
push ebp | 0x00AFF730 | 80 f7 af 00 | ||||
mov ebp,esp | 0x00AFF730 | 80 f7 af 00 | ||||
sub esp,0E4h | 0x00AFF64C | 3d 5a f2 0f | ||||
push ebx | 0x00AFF648 | 00 e0 9d 00 | ebx 0x009DE000 | 00 00 01 04 | ||
push esi | 0x00AFF644 | 09 11 bd 00 | esi 0x00BD1109 | e9 72 0a 00 | ||
push edi | 0x00AFF640 | 09 11 bd 00 | edi 0x00BD1109 | e9 72 0a 00 | ||
lea edi,[ebp-0E4h] | edi 0x00AFF64C | 3d 5a f2 0f | ||||
mov ecx,39h | ecx 0x00000039 | ?? ?? ?? ?? | ||||
mov eax,0CCCCCCCCh | eax 0xCCCCCCCC | ?? ?? ?? ?? | ||||
rep stos dword ptr es:[edi] | 从 0x00AFF64C 开始到 0x00AFF72C 初始化为 cc cc cc cc | |||||
int a = 3; | ||||||
mov dword ptr [a],3 | 0x00AFF728 | 03 00 00 00 | ||||
int b = 5; | ||||||
mov dword ptr [b],5 | 0x00AFF71C | 05 00 00 00 | ||||
int sum = 0; | ||||||
mov dword ptr [sum],0 | 0x00AFF710 | 00 00 00 00 | ||||
mov eax,dword ptr [b] | eax 0x00000005 | ?? ?? ?? ?? | ||||
push eax | 0x00AFF63C | 05 00 00 00 | ||||
mov ecx,dword ptr [a] | ecx 0x00000003 | ?? ?? ?? ?? | ||||
push ecx | 0x00AFF638 | 03 00 00 00 | ||||
call _Sum (011B11EFh) | jmp Sum (0BD3C30h) | |||||
push ebp | 0x00AFF630 | 30 f7 af 00 | ||||
mov ebp,esp | 0x00AFF630 | 30 f7 af 00 | ||||
sub esp,0CCh | 0x00AFF564 | 62 00 00 40 | ||||
push ebx | 0x00AFF560 | 00 e0 9d 00 | ebx 0x009DE000 | 00 00 01 04 | ||
push esi | 0x00AFF55C | 09 11 bd 00 | esi 0x00BD1109 | e9 72 0a 00 | ||
push edi | 0x00AFF558 | 30 f7 af 00 | edi 0x00AFF730 | 80 f7 af 00 | ||
lea edi,[ebp-0CCh] | edi 0x00AFF564 | 62 00 00 40 | ||||
mov ecx,33h | ecx 0x00000039 | ?? ?? ?? ?? | ||||
mov eax,0CCCCCCCCh | eax 0xCCCCCCCC | ?? ?? ?? ?? | ||||
rep stos dword ptr es:[edi] | 从 0x00AFF564 开始到 0x00AFF62C 初始化为 cc cc cc cc | |||||
int ret = a + b; | ||||||
mov eax,dword ptr [a] | eax 0x00000003 | ?? ?? ?? ?? | ||||
add eax,dword ptr [b] | eax 0x00000008 | ?? ?? ?? ?? | ||||
mov dword ptr [ret],eax | 0x00AFF628 | 08 00 00 00 | ||||
return ret; | ||||||
mov eax,dword ptr [ret] | eax 0x00000008 | ?? ?? ?? ?? | ||||
pop edi | 0x00AFF55C | 09 11 bd 00 | edi 0x00AFF730 | 80 f7 af 00 | ||
pop esi | 0x00AFF560 | 00 e0 9d 00 | esi 0x00BD1109 | e9 72 0a 00 | ||
pop ebx | 0x00AFF564 | cc cc cc cc | ebx 0x009DE000 | 00 00 01 04 | ||
mov esp,ebp | 0x00AFF630 | 30 f7 af 00 | ||||
pop ebp | 0x00AFF730 | 80 f7 af 00 | 0x00AFF634 | 80 1a bd 00 | ||
ret | 0x00AFF628 | 03 00 00 00 | ||||
add esp,8 | 0x00AFF640 | 09 11 bd 00 | ||||
mov dword ptr [sum],eax | 0x00AFF628 | 08 00 00 00 | ||||
return 0; | ||||||
xor eax,eax | eax 0x00000000 | ?? ?? ?? ?? | ||||
pop edi | 0x00AFF644 | |||||
pop esi | 0x00AFF648 | |||||
pop ebx | 0x00AFF64C | |||||
add esp,0E4h | 0x00AFF730 | |||||
cmp ebp,esp | ||||||
call __RTC_CheckEsp (0BD113Bh) | ||||||
mov esp,ebp | ||||||
pop ebp | ||||||
ret |