我目前正在学习 x86 汇编语言(我正处于课程的开始阶段),并且在理解堆栈在一个特定情况下的工作方式时遇到了一些问题。
假设我有这个代码:
double(entier n) { return n + n; }
Run Code Online (Sandbox Code Playgroud)
我试图将其转换为 x86 代码,结果是这样的:
push ebp #save old pointer stack
mov ebp, esp #put new pointer stack
mov ebx, dword[ebp + 8] #get argument n and put it in ebx
add ebx, dword[ebp + 8] #add n to ebx
Run Code Online (Sandbox Code Playgroud)
但是后来我完全被阻止了,无法找到如何返回ebx. 我在互联网上找到了一个解决方案,如下所示:
mov [ebp + 12], ebx
pop ebp
ret
pop ebp
ret
Run Code Online (Sandbox Code Playgroud)
我不明白它是如何工作的。不是ebp+12第二个参数的值吗?(就我而言,没有)。pop 用于移动esp指针,但为什么在这种情况下我们需要 2 pop 和 2 return?是否只是删除函数声明期间使用过的值?