Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Raspberry Pi的ARM汇编中的寄存器r0-r4中是否有函数参数的严格存储序列?_Assembly_Arm - Fatal编程技术网

Assembly Raspberry Pi的ARM汇编中的寄存器r0-r4中是否有函数参数的严格存储序列?

Assembly Raspberry Pi的ARM汇编中的寄存器r0-r4中是否有函数参数的严格存储序列?,assembly,arm,Assembly,Arm,在Raspberry Pi上的ARM汇编代码中,我们是否可以使用寄存器r1(而不是寄存器r0)来接收第一个函数参数,同时保持寄存器r0仅用于函数的返回值?或者必须将前4个功能参数按顺序严格存储在寄存器r0、r1、r2和r3中 取决于您的代码是否必须从其他代码中使用/调用。关于寄存器的使用方式、参数在调用之间的传递方式等有一些“规则”。这些规则称为ABI(应用程序二进制接口),ARM的规则可在此处找到: 这允许调用用“C”编写的代码来编写(例如)汇编程序或其他语言编写的代码,这是共享库背后的魔力的

在Raspberry Pi上的ARM汇编代码中,我们是否可以使用寄存器r1(而不是寄存器r0)来接收第一个函数参数,同时保持寄存器r0仅用于函数的返回值?或者必须将前4个功能参数按顺序严格存储在寄存器r0、r1、r2和r3中

取决于您的代码是否必须从其他代码中使用/调用。关于寄存器的使用方式、参数在调用之间的传递方式等有一些“规则”。这些规则称为ABI(应用程序二进制接口),ARM的规则可在此处找到:

这允许调用用“C”编写的代码来编写(例如)汇编程序或其他语言编写的代码,这是共享库背后的魔力的一部分


如果您正在将Raspberry编程为硬件的一部分,也就是说,您所做的软件不应与操作系统或其他应用程序接口,您可以在编写代码的过程中进行,但一般来说,在汇编程序中编程时应遵循这些规则。即使您不打算使用其他软件组件或操作系统。这将使移植代码变得更简单。

如果是您自己的代码,您可以做任何您想做的事情。如果您想与第三方代码进行互操作,显然必须遵守约定。调用者如何知道您希望参数位于不同的位置?您可以让函数获取未使用的第一个参数(伪参数)。不优雅,但不会破坏平台ABI。如果在制定输出
r0
时需要输入参数,则被调用例程必须保存
r0
。通常情况并非如此。另一种方法是使用“被调用方保存”寄存器(R4-R10)保留返回值,然后在返回前将其放入
r0
。即使它是您自己的代码,出于理智的原因,坚持一个标准也是很好的,特别是当例程是可外部调用的时候。如果它是一个汇编器助手函数,那么出于效率考虑,您可以忽略ABI。如果不使用ABI,则需要很好地记录接口。ABI混淆会产生难以发现的bug。