汇编指令的学习4——ldm/stm指令、栈的处理
1、为什么需要多寄存器访问指令?
ldr/str每周期只能访问4字节内存,如果需要批量读取、写入内存时太慢,解决方案是stm/ldm
ldm (load register mutiple)
stm(store register mutiple)
2、举例:stmia sp, {r0 - r12}(注意这里的-号不是减,而是范围)
(1)将r0存入sp指向的内存处(假设为0x30001000);然后地址+4(即指向0x30001004),将r1存入该地址;然后地址再+4(指向0x30001008),将r2存入该地址······直到r12内容放入(0x3001030),指令完成。即将r0~r12的内容存入以sp为起始地址的内容空间里。
(2)一个访存周期同时完成13个寄存器的读写。
3、8种后缀(相对于入栈来说,比较简单)
先(后)传输的,肯定是空栈(满栈),然后看地址是增还是减
- ia(increase after)先传输,再地址+4
- ib(increase before)先地址+4,再传输
- da(decrease after)先传输,再地址-4
- db(decrease before)先地址-4,再传输
- fd(full decrease)满递减堆栈
- ed(empty decrease)空递减堆栈
- fa(·······) 满递增堆栈
- ea(·······)空递增堆栈
4、四种栈
(1)空栈:栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;而取出时需要先移动一格才能取出。(因为空所以可以直接存入再移动)
(2)满栈:栈指针指向栈中最后一格数据,每次存入时需要先移动栈指针一格再存入;取出时可以直接取出,然后再移动栈指针。(因为满所以应该移动后再存入)
(3)增栈:栈指针移动时向地址增加的方向移动的栈。(相对于入栈来说?)
(4)减栈:栈指针移动时向地址减小的方向移动的栈。(相对于入栈来说?)
5、!的作用
ldmia r0, {r2 - r3}
ldmia r0!, {r2 - r3}
感叹号的作用就是r0的值在ldm过程中发生的增加或者减少最后写回到r0去,也就是说ldm时会改变r0的值。
6、^的作用
ldmfd sp!, {r0 - r6, pc}
ldmfd sp!, {r0 - r6, pc}^
^的作用:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用于从异常模式返回。
汇编指令的学习4——ldm/stm指令、栈的处理相关推荐
- arm ldm stm指令解析
(1)LDR:L表示LOAD,LOAD的含义应该理解为:Load from memory into register LDR R1, [R2] R1<--[R2] 就是把R2所指向的 ...
- Vue学习(入门实例、常用指令)-学习笔记
文章目录 Vue学习(入门实例.常用指令)-学习笔记 实例 常用指令 v-on v-bind v-for v-html v-if event v-model 双向数据绑定实现 - defineProp ...
- 汇编指令的学习2——常用的ARM指令
一.常用ARM指令1:数据处理指令 (1)数据传输指令 mov mvn(源目标按位取反后赋给目标) (2)算术指令 add sub rsb adc sbc rsc (3)逻辑指令 and orr eo ...
- LDM与STM指令详解
title: LDM与STM指令详解 date: 2019/2/26 17:58:00 toc: true --- LDM与STM指令详解 指令形式如下,这里的存储方向是针对寄存器的 Load Mul ...
- 【单片机】汇编指令入门学习|单片机启动代码汇编
目录 汇编指令入门学习 [汇编指令]MSP430汇编指令 IAR下的汇编/单片机启动代码汇编 ARM 汇编&ARM 指令集 学习笔记 汇编指令入门学习 在进行汇编程序设计时,MSP430 ...
- 寄存器内存读写指令(二) —— 多寄存器读写 LDM / STM
有的时候,CPU可能会遇到 a++; b++; c++,这个时候为了提升效率,CPU可能会一次将多个寄存器里的变量保存到内存中.这个时候之前介绍的 LDR / STR 指令虽然也能实现,但只能操作一个 ...
- 汇编达人视频学习6(汇编眼中的函数、CALL指令执行函数、堆栈传参、堆栈平衡、外平栈、内平栈)
title: 汇编达人视频学习6 date: 2021年8月4日 15点15分 tags: 汇编达人 categories: 汇编达人 21.汇编眼中的函数 1.什么是函数 函数就是一系列指令的集合, ...
- java虚拟机指令初步学习
先做一个最简程序:然后反汇编一下: public class hello {public static void main(String[] args) { int a = 101;} } 然后来学习 ...
- 学mysql是学指令吗_学习Mysql (二) 常用指令
环境搭建OK.可视化查看看得我一脸懵逼,还是命令行学习下. 常用指令: 1. 登录: mysql -h 主机名 -u 用户名 -p 注:本机localhost的话,-h部分可以省略.-p后面不写密码的 ...
最新文章
- Open Flash Chart组件的使用 及 与 jfreechart, FusionCharts 的比较
- 通过反射获取子类和父类定义的属性
- js切换换class
- Interview:算法岗位面试—11.06早上上海某智能驾驶科技公司(创业)笔试+面试之手撕代码、项目考察、比赛考察、图像算法的考察等
- Java二分查找、折半查找
- 玩转短视频?守护视频安全?AI智能提速?一分钱体验? 阿里云视频点播大招盘点...
- SpringBoot 自定义线程池
- 深度学习与人工智能革命:part IV
- android 邮件发送html,如何发送HTML电子邮件
- openSUSE安装WPS
- 微信支付app支付怎么快速开通
- APA 论文的 格式 及 样式标准
- 简谈几种常用的库函数
- 借助Mendix打造敏捷开发和移动端应用的数字化维修服务平台
- 面试官都叫好的Synchronized底层实现,这工资开多少一个月?
- python数列求和,怎样在python求和
- TAP-Win32 Adapter OAS“的网络适配器删除后总是出现(kms激活器及win10激活)
- 【CV】MobileNet:使用深度可分离卷积实现用于嵌入式设备的 CNN 架构
- Ubuntu的ldconfig详解(解决*.so不是符号连接)
- 内嵌资源html,go 1.16 embed 实现资源文件(html, css, js等)内嵌