我正在反转ARM Thumb2代码。

我正在寻找一个表,该表显示用于将参数传递给函数的寄存器,以及在函数结束后必须保存的寄存器。

顺便说一句,如果我在函数的开头看到push r5-r9,在函数的结尾看到pop r5-r9,那些寄存器被保存了吗?

#1 楼

所有这些都记录在ARM体系结构过程调用标准(AAPCS)ARM IHI0042中。可能会有更新的版本。简短的版本:R0-R3用于传递参数,R12是暂存寄存器,用于过程调用(链接器内容等),其他所有内容都必须由使用它的函数保留。

评论


您是否具有Arm程序要求标准(AAPCS)Arm IHI 0042F doc的链接?我想看看

– julian♦
18年10月10日在3:30

#2 楼

通常,push r5-r9指令是一种将这些寄存器(即r5r6r7r8r9)的内容保存在堆栈上的方法,然后pop r5-r9在离开函数堆栈帧之前会还原保存的值。 >
当您要在堆栈框架内操作非易失性寄存器并符合ABI规范时,这是非常常见的行为。在编译器生成的汇编代码中经常看到这种方式。

评论


那么这些通常是用于将参数传递给函数的寄存器吗(问题的第一部分!)?

– 0xC0000022L♦
18年6月15日在18:54

这取决于ABI,这个问题不够精确,无法正确回答。我们需要知道所使用的OS(以及所使用的ABI)。

–恐怖
18年6月15日在19:04

@perror,我说的是没有操作系统的嵌入式

– Keystone
18年6月16日在19:04