__cdecl 调用方式的add函数:
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,40h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-40h]
0040102C mov ecx,10h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
00401038 mov eax,dword ptr [ebp+8]
0040103B add eax,dword ptr [ebp+0Ch]
0040103E pop edi
0040103F pop esi
00401040 pop ebx
00401041 mov esp,ebp
00401043 pop ebp
00401044 ret
__stdcall 调用方式add函数:
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,40h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-40h]
0040102C mov ecx,10h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
00401038 mov eax,dword ptr [ebp+8]
0040103B add eax,dword ptr [ebp+0Ch]
0040103E pop edi
0040103F pop esi
00401040 pop ebx
00401041 mov esp,ebp
00401043 pop ebp
00401044 ret 8
这里比对一下, 除了最后一条指令不一样,其它都一样,
__cdecl栈外平衡, 所以, 直接ret
__stdcall栈内平衡, 所以ret 8
ret指令相当于:
pop eip
ret 8 指令相当于:
pop eip
add esp, 8
因为调用的时候, 先push参数的, 再push返回地址的:
push y
push x
push 返回地址
jmp add函数地址
对应的ret应该是完全相反的:
pop eip ; pop返回地址到eip
pop x
pop y
后面pop x; popy两条合成一条: add esp, 8
当然实际上pop eip指令是不对的, cpu不支持, 但是意思是这样的, ret指令的作用是这样的