ARM程序集 - 访问参数vs返回值?

时间:2017-11-22 18:41:26

标签: c++ assembly arm cpu-registers armv8

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

在ARM v8程序集中,我相信该参数存储在寄存器w0中。但是,这也是ret输出值

的寄存器

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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