从ARM程序集中的过程返回

Num*_*our 1 assembly arm

当创建ARM汇编函数,我通常推内容LR登记到r4-r5在beggining和功能完成后我弹出r4-r5PC:

.global myfunc
.type   myfunc, %function

myfunc:
push {r4-r5,lr}
... do stuff...
pop {r4-r5,pc}
Run Code Online (Sandbox Code Playgroud)

但是,我已经读过使用stmfdldmfd一个可能会获得更好的性能:

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变体在这种情况下会更好吗?

Mic*_*ael 6

PUSH {...} 是Thumb指令的Thumb等价物 STMDB SP!,{...}

POP {...} 是Thumb指令的Thumb等价物 LDMIA SP!,{...}

STM意味着存储多个.
DB表示递减之前,即在这种情况下递减每个商店之前的目标地址.
IA表示递增后,即在每种加载后递增源地址.
!意味着将最终地址写回源/目标地址寄存器.例如,如果SP是0x100,那么之后STMDB SP!,{R0-R2}你就会有0xF4 SP.
SP是别名R13,用作ARM处理器上的堆栈指针.