【问题标题】:ASM Function Call & Ret - What does ret 0xC do? [duplicate]ASM 函数调用和 Ret - ret 0xC 有什么作用? [复制]
【发布时间】:2015-09-03 04:27:00
【问题描述】:

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

【问题讨论】:

标签: assembly x86 stdcall


【解决方案1】:

简而言之,ret 00Ccall File.exe+333330 之后清理堆栈。在调用之前,您将三个 4 字节的值压入堆栈(eaxecxedx 的内容)。 4 * 3 = 12 = 0xC(十六进制)。如果您有没有值的ret,它会从您的子例程返回,但根本不会清理堆栈。如果您有ret 4,它只会清除其中一个值。 ret 12ret 0xC 负责这三个方面。

请参阅here 了解类似问题。

【讨论】:

  • 正是我想要的。谢谢 :) 。此外,该链接也非常好读。双重感谢
  • 有没有人注意到ret 0c 前面有一个pop esi?其次,如果你没有正确清理堆栈,它很可能不会从函数返回并崩溃,因为返回位置很可能是垃圾。
  • 不,这是一个更大的函数的底部;它清理其调用者的堆栈,以便调用者不需要add esp, 12。大概File.exe+333330 也是stdcall 或thiscall 并使用ret 12 本身为您清理args。
猜你喜欢
  • 1970-01-01
  • 2017-07-27
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多