我有一个函数原型int Palindrome(const char *c_style_string);
在ARM v8程序集中,我相信该参数存储在寄存器w0中。但是,这也是ret
输出值
如果是这样,我需要做什么才能使值不被覆盖?我在代码的开头想到了mov w0, w1
这样的东西,所以每当我解析它时,我都会将c_style_string称为w1,然后编辑w0来存储一个int ......这是对的吗?
谢谢!
答案 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)
您还可以在编译器的文档中查找寄存器传递约定。
如果要保留寄存器值,则应使用PUSH指令(或等效指令,具体取决于ARM模式或Thumb模式)。还记得在函数结束之前POP寄存器。