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寄存器中

出栈时只是把数据 , 弹出到相应的寄存器中去 , 并没有把 栈指针指向的数据清空 所以还可以看到相应的地址中有数据 , 使用局部变量不初始化 , 就会得到一个 随机的数据

例子:

 1    ldr sp, =0x40000100  @初始化栈指针
 2    mov r0, #0x12
 3    mov r1, #0x11
 4    bl add_fun
 5    mov r2, #0x22
 6    mov r3, #0x33
 7    b loop
 8
 9    add_fun:
10        stmfd sp!, {r0-r3, lr} @ 入栈 r0-r3 ,lr指向跳转此处的吓一跳指令,也就是跳转到 , 第5行
11        mov r0, #0x1
12        mov r1, #0x2
13        add r4, r0, r1
14        ldm sp!, {r0-r3, pc} @ 出栈,把 lr 的地址弹到 pc指针中执行
15    loop:
16        b loop

原文地址:https://www.cnblogs.com/electronic/p/11019914.html

时间: 2024-10-08 16:36:28

ARM 汇编 内存访问指令的相关文章

linux下arm汇编的常用指令解析

1. ldr 和 str : (1) ldr 作为指令,叫做寄存器加载指令.将内存中的值加载到寄存器中. (2) ldr 作为伪指令,实现一个32位常数或地址值加载到寄存器中.后面加载的常量或地址值标号前面必须有一个 “=” ,编译器会将伪指令替换成指令实现. (3) str 将寄存器中的值保存到内存单元中. 2. .long 伪操作,给数值分配内存单元. start: virable: .long start 如上,表示将start表示的值存到virable所代表的内存中. virable:

【嵌入式Linux+ARM】ARM体系结构与编程(ARM汇编指令)

自己的一些简单的总结,也是最常用的ARM汇编指令,之后也会不断的补充完善. 1. 汇编系统预定义的段名 .text    @代码段 .data   @初始化数据段 .bss    @未初始化数据段 需要注意的是,源程序中.bss段应该在.text之前. 2.定义入口点 汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点. .text .global _start _start: 3 .word用法 word expression就是在当前位置放一个wo

ARM汇编指令汇总

1.ARM汇编的格式:    在ARM汇编里,有些字符是用来标记行号的,这些字符要求顶格写:有些伪码是需要成对出现的,例如ENTRY和END,就需要对齐出现,也就是说他们要么都顶格,要么都空相等的空,否则编译器将报错.常量定义需要顶格书写,不然,编译器同样会报错.    2.字符串变量的值是一系列的字符,并且使用双引号作为分界符,如果要在字符串中使用双引号,则必须连续使用两个双引号.    3.在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同

ARM汇编指令特点

根据朱有鹏老师课程笔记整理而来: (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串1 0组成的机器码,由CPU读取执行. (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码. 两种不同风格的ARM指令 ARM官方的ARM汇编风格:指令一般用大写.Windows中IDE开发环境(如ADS.MDK等)常用.如: LDR R0, [R1] GNU风格的ARM汇编:指令一般用小写字母.linux中常用.如:

X86汇编3.内存访问

最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时. 1.内存中字的存储8086CPU中,用16位寄存器来存储一个字,高8位存放高字节,低8位存放低字节.在内存中存储时,由于内存单元是字节单元,一个单元存放一个字节,那么一个字(2字节,16位)应该用两个连续的存储单元(内存地址)来存储,低字节存放在低地址,高字节存放在高地址,这就是我们所说

ARM指令集——跳转指令

ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST或者TEQ指令中使用S后缀.这些比较指令总是会更新标志位. 在Thumb模式下,所有数据处理指令都更新CPSR中的标志位.有一个例外就是:当一个或更多个高寄存器被用在MOV和ADD指令时,此时MOV和ADD不能更新状态标志. 几乎所有的ARM指令都可以根据CPSR中的ALU状态标志位来条件执行.参见

linux驱动系列之arm汇编

在arm平台学习linux时,会遇到arm汇编指令,arm汇编指令与8086汇编指令很多地方都不同,在此记下来以免后面忘了,同时在学习了汇编指令之后分析一些汇编指令编写的代码. 一.相对跳转指令b.bl b.bl指令都实现短跳转,bl指令执行后会在链接寄存器r14中保存下一条指令的地址. 二.数据传送指令mov mov指令会把一个寄存器的数赋值给另一个寄存器,或者把一个常数传递给另一个寄存器. 如:mov  r0,r1  //将r1中的值传递给r0,mov r0,#0xff //将常数0xff传

arm汇编

(汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行.(汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码. ARM官方的ARM汇编风格:指令一般用大写.Windows中IDE开发环境(如ADS.MDK等)常用.如: LDR R0, [R1] GNU风格的ARM汇编:指令一般用小写字母.linux中常用.如:ldr r0, [r1] ARM采用RISC架构,CPU本身

ARM 汇编 简单介绍

1. 汇编文件说明 : 汇编文件以 [.s]结尾的文件格式 注释:多行注释 /* */   : 单行注释 @ 2.  符号说明: 1) 汇编指令,一条指令对应一个机器码,完成一定的功能 2) 伪指令,一条指令对应多条机器码,完成一个稍微复杂的功能 3) 伪操作,不会生成机器码,为了协助编译器,进行编译的,如:条件编译等 3. ARM 汇编指令分类: 1) 数据处理指令. 2) 内存访问指令. 3) 跳转指令 b  bl. 4) 状态寄存器(CPSR)访问指令. 5) 异常产生指令 swi 4.