我正在反转 ARM Thumb2 代码。
我正在寻找一个表格,显示哪些寄存器用于将参数传递给函数,哪些寄存器必须在函数结束后保存。
顺便说一句,如果我push r5-r9
在函数的开头和函数pop r5-r9
的末尾看到,那些寄存器是否保存了?
我正在反转 ARM Thumb2 代码。
我正在寻找一个表格,显示哪些寄存器用于将参数传递给函数,哪些寄存器必须在函数结束后保存。
顺便说一句,如果我push r5-r9
在函数的开头和函数pop r5-r9
的末尾看到,那些寄存器是否保存了?
这一切都记录在 ARM 体系结构过程调用标准 (AAPCS) ARM IHI0042 中。可能有更新的版本。简短版本:R0-R3 用于传递参数,R12 是用于过程调用(链接器事物等)的临时寄存器,其他所有内容都必须由使用它的函数保留。
通常,该push r5-r9
指令是一种将这些寄存器的内容(即r5
, r6
, r7
, r8
, r9
)pop r5-r9
保存在堆栈上的方法,然后在离开函数堆栈帧之前恢复保存的值。
当您想要在堆栈框架内操作非易失性寄存器并符合 ABI 时,这是非常常见的行为。在编译器生成的汇编代码中经常看到这些方式。