【发布时间】:2019-04-20 13:14:33
【问题描述】:
我目前正在学习 x86 汇编语言(我刚开始学习课程),但在理解堆栈在一个特定情况下的工作方式时遇到了一些问题。
假设我有这个代码:
double(entier n) { return n + n; }
我尝试将其转换为 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
但后来我完全被阻止了,无法找到如何返回ebx 的值。我在互联网上找到了以下解决方案:
mov [ebp + 12], ebx
pop ebp
ret
pop ebp
ret
我不明白它是如何工作的。 ebp+12 不是第二个参数的值吗? (在我的情况下没有)。 pop 用于移动esp 指针,但为什么我们需要 2 pop 和 2 return 在这种情况下?是不是只去掉函数声明时已经使用过的值?
【问题讨论】:
-
什么是
entier?这种情况下的调用约定是在eax中返回一个返回值。你应该在谷歌上搜索为你运行的任何平台编写一个汇编程序,这样你就可以获得基础知识。而且您有两个ret语句按顺序仅由pop ebp分隔,我认为这是一个印刷错误? -
它是一个整数。 (抱歉忘记正确编辑)
-
如果你在 C 中,那么它应该是
int。你还没有说你正在使用什么高级语言或你在什么平台上。它可以有所作为。它看起来像 C,但我不想假设。特别是因为您使用 C 关键字 (double) 作为函数名,这通常不是一个好主意。 -
返回值进入
eax。函数返回时,eax中的内容就是返回值。 -
@LoloGiordano 我无法告诉您您在互联网上找到的随机代码的作用。这似乎是荒谬和错误的。我建议您(至少在开始时)从教程或书籍中学习,而不是在互联网上找到随机的 sn-ps 代码。