ARM 汇编 内存访问指令
一。 单个寄存器操作读写内存
内存访问指令格式:<opcode><cond> Rd, [Rn]
Rn 中保存的是一个内存的地址值
1. 内存写指令 【 str,strb,strh 】单个寄存器
1) 【 str 】写 4 个字节
ldr r0, =0x12345678 @
mov r1, #0x40000000
str r0, [r1] @ 将r0中的数据写入 r1 指向的内存中; str写4个字节
2)【 strb 】写 1 个字节
strh r0, [r1] @ 把 r0 中的低字节,写入 r1 指向的低地址中
3) 【 strh 】 写 2 个字节
strh r0, [r1] @ 把 r0 中的 低2个字节,写入 r1指向的 2个低地址中
2. 读内存指令 【 ldr,ldrb,ldrh 】 单个寄存器
1) 【 ldr 】 读 4 个字节
ldr r0, =0x12345678 @ 此处 ldr 是伪指令, ldr 还可以是读内存的指令
mov r1, #0x40000000
str r0, [r1] @ 先把r0 中的数据写到r1指向的地址中
ldr r2, [r1] @ 读取 r1 指向的地址中的数据,读取 4 个字节
2)【 ldrb 】 读 1 个 字节
ldrb r3, [r1] @ 读 1个字节, 读低位
3)【 ldrh 】读 2 个字节
ldrh r4, [r1] @ 读取低 2 位 的2 个字节
二. 操作多个寄存器读写内存 【 写内存: stm , 读内存: ldm 】
指令格式 : <opcode><cond> Rn{!} {register_list}
Rn 中保存一个 内存地址值
{!} 表示是否更新 Rn 中的地址值
{register_list} 寄存器列表
1. 【 stm 】 多个寄存器中的值写入内存中
mov r0, #0x40000000
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333
ldr r4, =0x44444444
stm r0!, {r1,r2,r3,r4} @ 把 此条指令改为 stm r0,{r1,r2,r3,r4} 不会更新r0中的地址值
对于多个寄存器的操作指令【stm】说明:
(1)加 ! 表示更新 r0 中的地址值
(2)寄存器列表中是连续的寄存器可以用 - 连接 如 {r1, r2, r3, r4, r6} 可以表示为 {r1-r4, r6}
(3)编号晓得寄存器数据,保存到低地址中
(4)编号大的寄存器数据,保存到高地址中
2. 操作多个寄存器 读内存数据
mov r0, #0x40000000
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333
stm r0, {r1-r3} @把寄存器 r1-r3 中的值写入 r0 指向的内存地址中 ldm r0!, {r5-r7} @读出r0指向的内存地址中的放在寄存器 r5-r7 中
三。栈操作指令 【入栈: stmfd,出栈:ldmfd 】
栈的 4 种特性 Full满栈 Empty空栈 Ascend增栈 Descend降栈
组合 4 种栈:
stmfa fa 满 增
stmfd fd 满 降 ARM 汇编默认使用
stmea ea 空 增
stmed ed 空 减
指令格式:<opcode><cond> sp! {register_list} : sp 堆栈指针 r14
ldr sp, =0x40000100 @初始化栈指针
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333 stmfd sp!, {r1-r3} @把数据 入栈 到sp指向的地址, 增满栈类型, sp指针跟着更新
ldmfd sp!, {r4-r6} @出栈, 把栈内数据弹出到 r4-r6寄存器中
出栈时只是把数据 , 弹出到相应的寄存器中去 , 并没有把 栈指针指向的数据清空 所以还可以看到相应的地址中有数据 , 使用局部变量不初始化 , 就会得到一个 随机的数据
例子:
ldr sp, =0x40000100 @初始化栈指针
mov r0, #0x12
mov r1, #0x11
bl add_fun
5 mov r2, #0x22
6 mov r3, #0x33
7 b loop add_fun:
stmfd sp!, {r0-r3, lr} @ 入栈 r0-r3 ,lr指向跳转此处的吓一跳指令,也就是跳转到 , 第5行
mov r0, #0x1
mov r1, #0x2
add r4, r0, r1
ldm sp!, {r0-r3, pc} @ 出栈,把 lr 的地址弹到 pc指针中执行
loop:
b loop
ARM 汇编 内存访问指令的更多相关文章
- linux下arm汇编的常用指令解析
1. ldr 和 str : (1) ldr 作为指令,叫做寄存器加载指令.将内存中的值加载到寄存器中. (2) ldr 作为伪指令,实现一个32位常数或地址值加载到寄存器中.后面加载的常量或地址值标 ...
- ARM汇编之MOV指令
http://blog.csdn.net/lsywk/article/details/8799837 一.指令格式 MOV{条件}{S} 目的寄存器,源操作数 二.指令详解 MOV指令可完成从另一个 ...
- GNU汇编 存储器访问指令
.text .global _start _start: mov r0,#0xff str r0,[r1] ldr r2,[r1]
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
- ARM指令集——条件执行、内存操作指令、跳转指令
ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST ...
- ARM汇编指令特点
根据朱有鹏老师课程笔记整理而来: (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器 ...
- ARM 汇编的一些规范
A.5.1 文件格式 ARM 源程序文件(即源文件)为文件格式,可以使用任一文本编辑器编写程序代码. 在一个项目中,至少要有一个汇编源文件或C 程序文件,可以有多个汇编 ...
- linux驱动系列之arm汇编
在arm平台学习linux时,会遇到arm汇编指令,arm汇编指令与8086汇编指令很多地方都不同,在此记下来以免后面忘了,同时在学习了汇编指令之后分析一些汇编指令编写的代码. 一.相对跳转指令b.b ...
- ARM 汇编 简单介绍
1. 汇编文件说明 : 汇编文件以 [.s]结尾的文件格式 注释:多行注释 /* */ : 单行注释 @ 2. 符号说明: 1) 汇编指令,一条指令对应一个机器码,完成一定的功能 2) 伪指令, ...
随机推荐
- python面试题之下面这些是什么意思:@classmethod, @staticmethod, @property?
回答背景知识 这些都是装饰器(decorator).装饰器是一种特殊的函数,要么接受函数作为输入参数,并返回一个函数,要么接受一个类作为输入参数,并返回一个类. @标记是语法糖(syntactic s ...
- redis 学习入门篇
基本概念 redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库(非关系性数据库). redis的特点 速度快,因为数据存在内存中,读写数据的时候都不 ...
- Rabbitmq的延时队列的使用
配置: spring: rabbitmq: addresses: connection-timeout: username: guest password: guest publisher-confi ...
- esxi主机用命令行强行关闭通过前端界面无法关闭的ESXI虚拟机
环境:esxi5.1-esxi6.5 背景:如果esxi下面某一台vm死机了,并且esxi的控制台卡死不能用,为了不影响同一个esx下其他的vm正常使用,那么我们只能用命令行来单独重启此vm,保证一定 ...
- teb教程8
融合动态障碍物 简介:考虑怎样把其他节点发布的动态障碍物考虑进来 1.本部分演示了动态障碍物该如何被包含到teb_local_planner中. 2.写一个简单的动态障碍物的发布器publish_dy ...
- ZOJ3531: [SDOI2014] 旅行
Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. ...
- element 点击切换按钮的颜色
1.html <el-button-group label="时间"> <el-button @click="seeHour" :type=& ...
- ajax验证用户名是否存在,手机号是不是匹配
<label class="col-sm-2 control-label font">用户名</label> <div class="col ...
- Read Committed
在Read Committed隔离级别下,一个事务可能会遇到不可重复读(Non Repeatable Read)的问题. 不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一 ...
- iOS 7 认识 TextKit
本文由 伯乐在线 - 和谐老约翰 翻译自 Max Seelemann.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. iOS7 的发布给开发者的案头带来了很多新工具.其中一个就是 TextKit( ...