【发布时间】:2015-05-05 19:29:52
【问题描述】:
我有三个汇编代码片段,我应该为每个片段确定正确的调用约定(CDECL、STDCALL、FASTCALL)。为了识别调用约定,我正在寻找调用者或被调用者的堆栈清理器。但是,如果我找不到我认为看起来像“add esp, 8”的清理代码怎么办。我的方法错了吗?我必须搜索其他调用约定特征吗?下面是代码片段。
片段 1
push ebp
mov ebp , esp
sub esp , 0x8
mov [ ebp-0x4 ] , eax
mov [ ebp-0x8 ] , edx
mov eax , [ ebp-0x8 ]
mov edx , [ ebp-0x4 ]
add edx , eax
mov eax , ecx
add eax , edx
leave
ret
片段 2
push ebp
mov ebp , esp
mov eax , [ ebp+0xC]
mov edx , [ ebp+0x8 ]
add edx , eax
mov eax , [ ebp+0x10 ]
add eax , edx
pop ebp
ret 0xC
片段 3
push ebp
mov ebp , esp
mov eax , [ ebp+0xC]
mov edx , [ ebp+0x8 ]
add edx , eax
mov eax , [ ebp+0x10 ]
add eax , edx
pop ebp
ret
【问题讨论】:
-
wtb 在 stackoverflow 上的汇编代码高亮 :(
-
add esp...不是唯一的方法,ret also works -
所以在
ret的情况下,返回地址从堆栈中弹出并放入eip。所以由调用者来清理堆栈,对吧? -
使用 stdcall 和 fastcall 调用约定,从堆栈中弹出参数是函数的工作。您的一个函数在堆栈上没有任何参数,其中一个从堆栈中弹出参数,其中一个不从堆栈中弹出参数。
标签: assembly nasm calling-convention