我正在寻找一个表,该表显示用于将参数传递给函数的寄存器,以及在函数结束后必须保存的寄存器。
顺便说一句,如果我在函数的开头看到
push r5-r9
,在函数的结尾看到pop r5-r9
,那些寄存器被保存了吗?#1 楼
所有这些都记录在ARM体系结构过程调用标准(AAPCS)ARM IHI0042中。可能会有更新的版本。简短的版本:R0-R3用于传递参数,R12是暂存寄存器,用于过程调用(链接器内容等),其他所有内容都必须由使用它的函数保留。#2 楼
通常,push r5-r9
指令是一种将这些寄存器(即r5
,r6
,r7
,r8
,r9
)的内容保存在堆栈上的方法,然后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
评论
您是否具有Arm程序要求标准(AAPCS)Arm IHI 0042F doc的链接?我想看看
– julian♦
18年10月10日在3:30