【问题标题】:ARM assembly - access parameter vs return value?ARM 程序集 - 访问参数与返回值?
【发布时间】:2018-05-06 14:40:54
【问题描述】:

我有一个函数原型int Palindrome(const char *c_style_string);

在 ARM v8 汇编中,我相信参数存储在寄存器 w0 中。不过,这不也是ret输出值的寄存器吗?

如果是这样,我需要做什么才能使值不会被覆盖?我在代码的开头想了类似mov w0, w1 这样的东西,所以每当我解析它时,我将 c_style_string 称为 w1,然后编辑 w0 以存储一个 int ......这是对的吗?

谢谢!

【问题讨论】:

  • 顺便说一句,函数调用的寄存器选择是编译器的决定,而不是汇编语言的问题。编译器可能会在 R8 中传递一个参数。
  • ARM 语法是mnemonic dst, src,所以您希望mov w1, w0 复制w0(您的第一个参数)。
  • 输出没有理由不能覆盖输入寄存器。进入函数的指针是按引用传递的,但它是仅为该函数放在那里的地址的副本,如果该函数调用另一个函数,它也会覆盖该参数寄存器,然后继续,所有嵌套的返回功能将在备份途中覆盖。可以使用堆栈,或者如果不需要参数,则只需覆盖。
  • AT&T 语法是我所知道的唯一将 dest 放在末尾的语法
  • @phuclv:m68k 语法也将 dst 放在最后。 AT&T 语法受到 PDP-11 语法的启发,它也可以做到这一点。

标签: c++ assembly cpu-registers arm64 calling-convention


【解决方案1】:

恕我直言,您最好的解决方案是编写 C 函数或最小函数,然后告诉编译器输出汇编语言。这将显示函数的调用界面。

您还可以在编译器的文档中查找寄存器传递约定。

如果要保留寄存器值,则应使用 PUSH 指令(或等效的指令,具体取决于 ARM 模式或 Thumb 模式)。还要记住在函数结束之前弹出寄存器。

【讨论】:

    【解决方案2】:

    您可能希望编写符合ABI for ARM 64-bit Architecture 的汇编代码。
    在上面的示例中,您可以将 c_style_string 的地址保存在“Callee-saved”寄存器 (X19-X29)' 中,并在每次调用 Palindrome() 时将其复制到 x0/w0 - 我在这里假设 Palindrome( ) 是一个 C 函数,因此它本身符合 ARCH 64 位 ABI。
    一个理想的副作用是您的 C 代码可以始终调用您的汇编代码,反之亦然。

    【讨论】:

      猜你喜欢
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多