【问题标题】:x86 assembly functionsx86 汇编函数
【发布时间】:2012-01-22 21:32:35
【问题描述】:

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

现在假设funct1 开头如下:

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!

【问题讨论】:

  • 你的代码来自哪里?你是从 C 源代码生成的吗?
  • 减少堆栈指针可能意味着局部变量被分配在堆栈上。
  • To 4:可能返回值在栈上,因为在调用 read_input 之后的指令中将栈顶与 0 进行比较。
  • @Giorgio 是使用 objdump -d 从 C 源代码生成的。
  • @Giorgio 我只能访问 C 代码的 main 函数,其余的对我隐藏。我不应该看到它。

标签: function assembly x86-64


【解决方案1】:

您的代码似乎正在使用 Linux/AMD ABI。我会在这种情况下回答你的问题。

  1. 不,rbx 是一个被调用者保存的(非易失性)寄存器。您的函数正在保存它,以免干扰调用者的价值。它没有在您显示的代码中恢复,但那是因为您没有显示整个功能。如果这个函数有更多,我认为有,那是因为rbx 稍后会在这个例程中的某个地方使用。
  2. 是的,堆栈上正在为 0x28 字节的数据腾出空间。假设read_input 将字符串作为参数,您的描述是合理的。然而,它不一定准确。除了分配给read_input的缓冲区之外,其中一些数据可能用于其他局部变量。
  3. 此指令将指向新分配的堆栈缓冲区的指针放入rsirsi 是 AMD x64 调用约定的第二个参数寄存器。这意味着您将使用传递给 this 函数的第一个参数以及指向新堆栈缓冲区的指针来调用 read_input
  4. rax 中,如果它是一个64 位或更小的值,在raxrdx 如果它更大。或者如果它是浮点数,在xmm0ymm0st(0) 中。您可能应该查看您的调用约定的描述以了解这些内容 - this link 有一个很棒的 PDF 文件。查看表 4。

【讨论】:

    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2014-02-22
    • 2019-02-13
    • 2013-04-21
    相关资源
    最近更新 更多