博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(三)ARM 常用汇编指令(2)之ARM堆栈保护/恢复现场分析
阅读量:4125 次
发布时间:2019-05-25

本文共 1077 字,大约阅读时间需要 3 分钟。

3.4 ARM堆栈保护/恢复现场分析

3.4.1 堆栈的分类

根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(DecendingStack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式,ARM 微处理器支持这四种类型的堆栈工作方式,即:

(1) Full descending 满递减堆栈

堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。

ARM-Thumb过程调用标准和ARM、Thumb C/C++编译器总是使用Full descending 类型堆栈。

(2) Full ascending 满递增堆栈

堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。

(3) Empty descending 空递减堆栈

堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向下一个将要放入数据的空位置。

 (4) Empty ascending 空递增堆栈

堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向下一个将要放入数据的空位置。

在ARM中,一般是满堆栈,堆栈生长方向是从上向下递减的(51相反为递增)。

3.4.2 堆栈保护/恢复现场代码分析

在写ARM裸板我们会经常写如下代码:

保护现场:

mov ip,sp

stmfdsp!,{fp,ip,lr,pc} 等价于 push {fp, ip, lr, pc}

sub fp,ip,#4

恢复现场

sub sp,fp,#12

ldmfd sp,{fp,sp,pc}

       mov ip,sp 将sp栈指针寄存器保存在ip寄存器中,stmfd sp!(fp,ip,lr,pc)将fp ip lr pc依次入栈,这样注意高编号对应高地址入栈,!表示sp也依次偏移(减),sub fp,ip,#4 ip是入栈前sp指向位置的地址,减4是向低地址偏移4个字节的位置的地址,保存在fp寄存器中,也就是fp保存堆栈的头部的地址。 

sub sp,fp,#12保护现场后sp可能发生变化,通过fp-12可以准确找到保存现场时sp指向的位置保存到sp中,ldmfdsp,{fp,sp,pc},从sp指向的位置出栈,fp保存到fp寄存器中(依然是堆栈的头部的地址),ip(入栈前sp指向位置的地址)保存到sp中,相当于恢复了sp的值,lr(下下条指令的地址)保存到pc中,然后程序从pc指向的位置执行。图示分析如下:

你可能感兴趣的文章
shell编程----目录操作(文件夹)
查看>>
机器学习-----K近邻算法
查看>>
HBASE安装和简单测试
查看>>
关于程序员的59条搞笑但却真实无比的编程语录
查看>>
搞笑--一篇有趣的文章编译自一篇西班牙博客。有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她…
查看>>
非常不错 Hadoop 的HDFS (Hadoop集群(第8期)_HDFS初探之旅)
查看>>
Tomcat启动错误,端口占用
查看>>
laravel 修改api返回默认的异常处理
查看>>
高德坐标转换百度坐标 javascript
查看>>
tp5封装通用的修改某列值
查看>>
laravel控制器与模型名称不统一
查看>>
vue登录拦截
查看>>
npm配置淘宝镜像仓库以及electron镜像
查看>>
linux设置开机自启动脚本的最佳方式
查看>>
VUE SPA 单页面应用 微信oauth网页授权
查看>>
phpstorm 集成 xdebug 进行调试
查看>>
npm和node升级的正确方式
查看>>
laravel事务
查看>>
springcloud 连续请求 500
查看>>
vue复用新增和编辑表单
查看>>