当创建ARM汇编函数,我通常推内容LR
登记到r4-r5
在beggining和功能完成后我弹出r4-r5
来PC
:
.global myfunc
.type myfunc, %function
myfunc:
push {r4-r5,lr}
... do stuff...
pop {r4-r5,pc}
Run Code Online (Sandbox Code Playgroud)
但是,我已经读过使用stmfd
和ldmfd
一个可能会获得更好的性能:
myfunc:
stmfd sp!,{r4-r11,lr}
...do stuff...
ldmfd sp!,{r4-r11,pc}
Run Code Online (Sandbox Code Playgroud)
到底是什么sp
?我认为保存所有寄存器并不值得r4-r11
,以防我实际上没有使用它们myfunc
,对吧?那么push-pop变体在这种情况下会更好吗?
PUSH {...}
是Thumb指令的Thumb等价物 STMDB SP!,{...}
POP {...}
是Thumb指令的Thumb等价物 LDMIA SP!,{...}
STM意味着存储多个.
DB表示递减之前,即在这种情况下递减每个商店之前的目标地址.
IA表示递增后,即在每种加载后递增源地址.
!意味着将最终地址写回源/目标地址寄存器.例如,如果SP
是0x100,那么之后STMDB SP!,{R0-R2}
你就会有0xF4 SP
.
SP是别名R13
,用作ARM处理器上的堆栈指针.