用汇编进行函数内压栈和出栈往往使用如下的语句:
stmfd sp!, {r0-r9, lr} ; (1)给寄存器r0-r9, lr压栈
ldmfd sp!, {r0-r9, pc}; (2)给寄存器r0-r9出栈, 并使程序跳转回函数的调用点
stmfd 代表满递减入栈,即sp指向栈顶元素,每入栈一个元素,sp的值减4;
ldmfd 代表的是满递减出栈,正确的含义是sp指向栈顶元素,每出栈一个元素,sp值加4。
用TRACE32做实验可得下面的结果。
执行(1)之前的寄存器情况如下图:

图1
R13的值为0x5801FFE8, 保存11个寄存器,则入栈后地址应该是0x5801FFE8-11*4=0x
5801FFBC。
单步执行过(1)指令后,寄存器的情况如下图:

本文详细介绍了ARM汇编中stmfd和ldmfd指令用于函数调用时的压栈和出栈操作。通过实例分析,揭示了stmfd实际执行的是stmdb(满递减入栈),而ldmfd执行的是ldmia(满递增出栈)。入栈顺序是从r9到r0再到lr,而出栈顺序则相反。这对理解ARM汇编语言的函数调用过程至关重要。

1752

被折叠的 条评论
为什么被折叠?



