【发布时间】: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