Assembly ASM函数调用&;Ret-Ret 0xC做什么?

Assembly ASM函数调用&;Ret-Ret 0xC做什么?,assembly,x86,stdcall,Assembly,X86,Stdcall,ret做什么?为什么这里需要ret 0xC?如果只是ret而不是ret 0xC,或者0x4呢 mov eax,[esp+10] // param3 mov ecx,[esp+0C] // param2 mov edx,[esp+08] // param1 push eax push ecx push edx mov ecx,esi call File.exe+333330 pop esi ret 000C 简而言之,ret00c在调用File.exe+33333 0之后清理堆栈。在调用之前

ret做什么?为什么这里需要ret 0xC?如果只是ret而不是ret 0xC,或者0x4呢

mov eax,[esp+10] // param3
mov ecx,[esp+0C] // param2
mov edx,[esp+08] // param1
push eax
push ecx
push edx 
mov ecx,esi
call File.exe+333330 
pop esi
ret 000C

简而言之,
ret00c
在调用File.exe+33333 0之后清理堆栈。在调用之前,您将三个4字节的值压入堆栈(eax、
ecx
和edx的内容)。4*3=12=0xC(十六进制)。如果您的
ret
没有值,它将从您的子例程返回,但根本不会清理堆栈。如果您有
ret4
,它将只清除其中一个值
ret 12
ret 0xC
处理所有三个问题


有关类似问题,请参阅。

您需要阅读。了解尾声和序言、调用约定和函数返回类型。我投票决定把这个问题作为离题的问题来结束,因为没有任何研究努力来得到解决方案。这正是我想要的。谢谢:)。此外,该链接也是一本非常好的读物。双重感谢:()()()()()()()()()()()()()()))?其次,如果没有正确清理堆栈,它很可能不会从函数返回并崩溃,因为返回位置可能是垃圾;它会清理调用者的堆栈,这样调用者就不需要
添加esp,12
。大概
File.exe+33333 0
也是stdcall或thiscall,并使用
ret 12
本身为您清除args。