【发布时间】:2020-12-04 11:02:30
【问题描述】:
我对 esp 指针有一些误解。
以下是以前的考试中显示的代码。 返回值为 1。
func: xor eax,eax
call L3
L1: call dword[esp]
inc eax
L2: ret
L3: call dword[esp]
L4: ret
现在,我将解释我的想法,并希望有人纠正我或批准我。 当我知道答案是什么时,我就是这样想的,所以我不确定我的想法是否正确。
- eax = 0
- 我们推送到堆栈返回地址,即下一行,即标签 L1。
- 我们跳到 L3。
- 我们推送到堆栈返回地址,即下一行,即标签 L4。
- 我们跳到 L1。
- 我们推送到堆栈返回地址,即下一行,即 inc eax。
- 我们跳到 L4。
- 我们跳转到 inc eax 所在的行,堆栈现在为空。
- eax = 1。
- 我们到此结束(在标签 L2 处)并返回 1。
【问题讨论】:
-
为什么问题被否决?请告诉我,我会改进的。
-
我认为
eax= 2 并且 func 的调用者在 L1 的指令中被调用一次。 -
第10步后需要继续。10.返回到哪里?
-
retn表示“将 dword 从堆栈顶部弹出到eip”。它不会无条件地“返回调用该函数的函数”,而是返回到堆栈顶部的任何地址。此外,您的第 8 步“堆栈现在为空”的评论是错误的。 -
这不是一个有效的函数;不能说它“返回”,因为它最终调用它的返回地址,并在堆栈上用 2 个额外的双字(包括原始返回地址)跳转到那里,而不是它是否返回。跨度>
标签: pointers assembly x86 stack nasm