关于arm汇编入栈和出栈的总结
来源:互联网 发布:手绘地图软件生成器 编辑:程序博客网 时间:2024/04/30 19:16
用汇编进行函数内压栈和出栈往往使用如下的语句:
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)指令后,寄存器的情况如下图:
图2
注意R13 已经变成了0x5801FFBC.
再来看出栈后寄存器的情况,如下图:
图3
出栈以后R13值变回0x5801FFE8。 所以我们可以知道ldmfd 事实上是递增的。 用TRACE32可以看到stmfd和ldmfd这两个助记符对应的汇编指令,如下图:
图4
stmfd 对应的汇编指令,实际上是stmdb。
ldmfd对应的汇编指令,实际上是ldmia。
另外如果您认为入栈的顺序是从r0开始到r9再到lr您就错了。真正的顺序是正好相反的。这一点您可以观察图2看到寄存器入栈的真实顺序,r0的值0x08005000是位于栈顶的。
总结一下:
stmfd和ldmfd是配对使用的,stmfd=stmdb, ldmfd=ldmia
在“{}”中括着的寄存器的入栈顺序是从后向前,出栈顺序是从前向后。
- 关于arm汇编入栈和出栈的总结
- UINavigationController的出栈和入栈
- 入栈和出栈
- 栈的入栈和出栈操作的实现
- 栈的入栈和出栈操作
- (四)顺序栈的入栈和出栈
- 函数的入栈和出栈,自定义函数
- 链表栈的入栈和出栈操作
- 链表实现队列的出队和入队,栈的入栈和出栈
- 栈--出栈和入栈
- 出栈和入栈方向
- 出栈和入栈方向
- 剑指offer02--入栈和出栈
- java方法入栈和出栈
- 汇编的压栈(PSHM)和出栈(POPM)
- 栈的入栈/出栈操作
- 关于“扇出”和“扇入”
- 汇编参数入栈的理解
- 好高兴
- 常用存储过程集锦
- 硬盘数据拯救
- 查找有故障的配件的方法
- Simulating Ocean Water
- 关于arm汇编入栈和出栈的总结
- 34步优化sql语句
- java做的“JEGE图像生成器”
- 物理磁盘卷转换为虚拟机镜像文件那点破事
- 经典SQL语句集锦(收藏版) (转)
- 【小阅读^大脑袋】0621 NO.377
- c#操作EXCEL文件
- 如何用VS2005制作Web安装程序
- 8830插卡成功,更新PRL的简便方法