首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86装配函数

x86装配函数
EN

Stack Overflow用户
提问于 2012-01-22 21:32:35
回答 1查看 833关注 0票数 2

我有一个由main调用的函数。假设该函数的名称为funct1funct1调用另一个名为read_input的函数。

现在假设funct1以如下方式启动:

代码语言:javascript
复制
push %rbp
push %rbx
sub $0x28, %rsp
mov $rsp, %rsi
callq 4014f0 read_input
cmpl $0x0, (%rsp)
jne (some terminating function)

所以,我只问几个问题:

  1. 在这种情况下,read_input是否只有一个参数,即%rbx
  2. 此外,如果堆栈指针正在被0x28缩小,这意味着一个大小为0x28的字符串被推到堆栈上?(我知道这是一根线)。
  3. 在调用函数之前,mov %rsp, %rsi的意义是什么?
  4. 最后,当read_input返回时,返回值在哪里?

谢谢你,很抱歉我的问题,但我才刚刚开始学习x86!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-22 21:47:54

看起来您的代码使用的是Linux/AMD ABI。我会在这个背景下回答你的问题。

  1. 不,rbx是一个被调用保存(非易失性)寄存器.您的函数正在保存它,这样它就不会影响调用者的值。它不是在您显示的代码中恢复的,但这是因为您没有显示整个函数。如果这个函数还有更多,我认为是这样的,这是因为在这个例程后面的某个地方使用了rbx
  2. 是的,堆栈上正在为0x28字节的数据创建空间。假设read_input将一个字符串作为参数,您的描述是合理的。然而,这并不一定是准确的。其中一些数据可能用于其他局部变量,除了分配给read_input的缓冲区之外。
  3. 该指令将指向新分配的堆栈缓冲区的指针放入rsi中。rsi是AMD x64调用约定的第二个参数寄存器。这意味着您将使用传递给该函数的第一个参数以及指向新堆栈缓冲区的指针调用read_input
  4. rax中,如果它是64位值或更小,则在rax & rdx中,如果它更大。或者是浮点,以xmm0ymm0st(0)表示。您可能应该看看您的调用约定的描述,以获得这个东西的处理-在此链接有一个很好的PDF文件。请看表4。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8964889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档