ldr - ShenYj/ShenYj.github.io GitHub Wiki
从内存中装载(读取)数据
ldr(load register)指令,将数据从内存中读出来,存到寄存器中
格式: LDR{条件} 目的寄存器 <存储器地址>
第一操作数是目标寄存器,第二操作数是内存地址
- 内存的表示方式有:
立即数
,寄存器
,或寄存器加偏移
- 寄存器,加个
[]
,如[r1]
, 偏移的话[r1,r2]
, 或者[r1,#4]
,[r1,LSL #4]
等,都差不多,就是把寄存器里的数当成地址。
- 寄存器,加个
找到存储器的地址,将值读取后传入目的寄存器;取值范围由目的寄存器决定
如:x通常是64bit(8个字节),w是32bit(4个字节)
这里会涉及到 ARM汇编的寻址方式 处理器的寻址方式
-
基址变址寻址
- 有
[]
一般表示是取值的意思,[R2]
表示取出R2所存的内存地址比如是 0x10000 所对应的值比如是66。 -
LDR R0 [R1,#0x4]
: 寄存器 R1 的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器 R0 中。 -
LDR R0,[R1,#0x4]!
: 将寄存器 R1 的内容加上 4 形成操作数的有效地址,从而取得操作数存入寄 存器 R0 中,然后,R1 的内容自增 4 个字节,即会改变R0寄存器的值,也会改变R1的值。 -
LDR R0,[R1] ,#0x4
: 以寄存器 R1 的内容作为操作数的有效地址,从而取得操作数存入寄存器 R0 中,然后,R1 的内容自增 4 个字节。 -
LDR R0,[R1,R2]
: 将寄存器 R1 的内容加上寄存器 R2 的内容形成操作数的有效地址,从而取得 操作数存入寄存器 R0 中。
- 有
在 Xcode 中查看汇编代码可以发现,当右边立即数是负数时,对应的是 ldur
指令,如果立即数是正数,对应的是 ldr
指令