【发布时间】:2014-09-07 00:29:12
【问题描述】:
Assembly 的总数为 n00b,但我觉得我已经掌握了窍门。不过,我有一个关于在函数中使用寄存器的最佳实践的问题。
据我了解:在 ARM11 上的 13 个可用通用寄存器中,按照惯例,寄存器 0-3 用于传递参数(0 和 1 也用于返回值),而 4-12用于在函数执行期间存储工作值。
但是,我也看到了代码示例,其中人们也使用寄存器 0-3 来存储工作值,只要它们中的任何一个可用,因为它们不需要将前一个值推送和弹出到堆栈上。
虽然我可以理解为什么有人可能想要避免额外的推送和弹出步骤,但似乎将 r0-r3 用于除了将值传入和传出函数之外的任何事情都可能会导致问题(因为你有不保证您调用的任何函数都会保留它们的值)。
那么这里的最佳做法是什么?我什么时候应该(如果有的话)使用寄存器 0-3 作为工作值,什么时候应该使用寄存器 4-12?
【问题讨论】:
-
在纯汇编中,“遵循既定的调用约定”和“随心所欲”之间并没有真正的区别,但显然“最佳实践”的概念仅适用于其中之一。
-
很公平。您对我如何改进它或避免犯这个错误有什么建议吗?还是您只是认为应该从文档中收集到一些东西?
-
关于“收集文档”,这些事情很难,除非它是您日常工作的一部分。您应该始终将文档放在手边,了解其中包含的内容并在需要澄清时检查它们。
标签: assembly arm cpu-registers armv6