LDR、STR指令

LDR(load register)指令将内存内容加载入通用寄存器

STR(store register)指令将寄存器内容存入内存空间中

#define GPJ0CON 0xE0200240

_start:

 ldr r0, =0x11111111  // 将立即数/非法立即数,赋值给r0

 ldr r1, =GPJ0CON // 将GPJ0CON的地址赋给r1

 str r0, [r1] // 寄存器间接寻址。把r0中的数写入到r1中的数为地址的内存中去

 ldr r0,[r1] //将r1的值赋给r0,ARM是RISC结构,数据从内存到CPU之间的移动只能通过LDR/STR指令来完成。 但想把数据从内存中某处读取到寄存器,只能使用ldr ,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,如 MOV r0,#0是将立即数0放到r0中

1、LDR与MOV的不同:ldr能将数据从内存读到CPU,或者从内存中某处读取到寄存器中,而mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,如 MOV r0,#0是将立即数0放到r0中;

2、MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器。但不是所有立即数都可以传递的,这个立即数要符合一个8位数循环右移偶数位的取值。 原因是,MOV本身就是一条32bit指令,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值乘以2),8bit用来表示要移位的一个基数。而对于ldr伪指令,可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:  ldr r0, =0x12345678  这样,就把0x12345678这个地址写到r0中了。ldr伪指令和mov是比较相似,但mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为 mov指令的。

3、LDR指令的寻址方式实例分类:

LDR R0,[R1]                //将存储器地址为R1的数据读入寄存器R0

LDR R0,[R1,R2]            //将存储器地址为R1+R2的数据读入寄存器R0

LDR R0,[R1,#8]            //将存储器地址为R1+8的数据读入寄存器R0

LDR R0,[R1],R2            //将存储器地址为R1的数据读入寄存器R0,并将R1+R2的值存入R1

LDR R0,[R1],#8            //将存储器地址为R1的数据读入寄存器R0,并将R1+8的值存入R1

LDR R0,[R1,R2]!           //将存储器地址为R1+R2的数据读入寄存器R0,并将R1+R2的值存入R1

LDR R0,[R1,LSL #3]        //将存储器地址为R1*8的数据读入寄存器R0

LDR R0,[R1,R2,LSL #2]    //将存储器地址为R1+R2*4的数据读入寄存器R0

LDR R0,[R1,,R2,LSL #2]!  //将存储器地址为R1+R2*4的数据读入寄存器R0,并将R1+R2*4的值存入R1

LDR R0,[R1],R2,LSL #2    //将存储器地址为R1的数据读入寄存器R0,并将R1+R2*4的值存入R1

LDR R0,Label            //Label为程序标号,Label必须是当前指令的-4~4KB范围内

时间: 2025-01-04 23:04:11

LDR、STR指令的相关文章

ARMv7 ldr/str指令详解

因为ARM的算术运算不支持直接操作内存地址,所以要把内存里的数据先加载进寄存器.ldr指令就是干这事的,称为间接取址模式. 一共有3*3九种模式,先是直接偏移,先偏移,后偏移三大类,指的是如何对源操作数操作,是直接使用,还是在加载前对源操作数操作(比如地址加个数值),还是在加载后对操作数操作 每个大类里分三个小类,分别指源操作数是立即数,寄存器,还是标量寄存器(比如对寄存器里的数向左偏移两位,即乘4) 汇编指令和对应的C代码如下 1 Immediate offset: 2 3 LDR R0, [

ARM汇编中的LDR/STR

在ARM架构下,  数据从内存到CPU之间的移动只能通过LDR/STR指令来完成.而MOV只能在寄存器之间移动数据,或者把立即数移动到寄存器中,并且数据的长度不能超过8位 LDR,STR 的第一操作数是目标寄存器,第二操作数是内存地址, LDR 内存 --> 寄存器; STR 寄存器 --> 内存 内存的表示方式有:立即数,寄存器,或寄存器加偏移,立即数:内存的物理位置,前面加个#,如0x56000050 寄存器,加个[],如[r1],偏移的话[r1,r2],或者[r1,#4],[r1,LSL

ARM汇编-str指令

STR指令的格式为:STR{条件}  源寄存器,<存储器地址>STR指令用亍从源寄存器中将一个32位的字数据传送到存储器中.该指令在程序设计中比较常用,丏寻址方式灵活多样,使用方式可参考指令LDR. 指令示例:STR R0,[R1],#8             :将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1.STR R0,[R1,#8]             :将R0中的字数据写入以R1+8为地址的存储器中.” STR     r1, [r0]          

arm汇编:ldr,str,ldm,stm,伪指令ldr

ldr,str,ldm,stm的命名规律: 这几个指令命名看起来不易记住,现在找找规律. 指令 样本 效果 归纳名称解释 ldr Rd,addressing ldr r1,[r0] addressing to Rd [mem to reg] load to register str Rd,addressing str r1,[r0] Rd ro addressing [reg to mem] store register ldm Rn,reglist ldmfd sp!,{r0-r7,pc} *

ARM LDR/STR, LDM/STM 指令

这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令, 关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作时的注意事项. (1)LDR:L表示LOAD,LOAD的含义应该理解为:Load from memory into register.下面这条语句就说明的很清楚: LDR   R1,     [R2] ; R1<——[R2] 就是把R2所指向的存储单元的内容的值(一个memory地址内的值),读取到

ARM汇编- LDR加载指令,LDR伪指令

1,ldr加载指令LDR指令的格式为:LDR{条件}  目的寄存器,<存储器地址>LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中.该指令通常用亍从存储器中读取32位的字数据到通用寄存器,然后对数据迕行处理.当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转.该指令在程序设计中比较常用,丏寻址方式灵活多样,请读者认真掌握.指令示例: LDR R0,[R1]                                     

【转】arm汇编—ldr加载指令,ldr伪指令

1,ldr加载指令 LDR指令的格式为:LDR{条件}  目的寄存器,<存储器地址>LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中.该指令通常用亍从存储器中读取32位的字数据到通用寄存器,然后对数据迕行处理.当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转.该指令在程序设计中比较常用,丏寻址方式灵活多样,请读者认真掌握.指令示例:LDR R0,[R1]         :将存储器地址为R1的字数据读入寄存器R0.LDR R0

arm指令中mov和ldr的区别

ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令. 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中. 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方. x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中. 另外还有一个就是l

ARM汇编中ldr伪指令和ldr指令(转载)

转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中.而mov不能实现这个功 能,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯