文章目录
-
-
- [LDR 指令](#LDR 指令)
- LDR伪指令
- LDR伪指令与MOV区别
-
上篇文章:ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或)
下篇文章:ARM 常见汇编指令学习 8 - dsb sy 指令及 dsb 参数介绍
LDR指令 与 LDR伪指令 两者虽然名字相同但是作用却不相同,区分两者的方法就是看第二个参数,如果有等号,就是LDR伪指令。
LDR 指令
c
ldr r0, 0x80000000
上面语句的作用是将地址0x80000000
中的内容赋值给 r0
寄存器,需要注意的是 不能使用mov
指令来做这个事情,因为mov
指令只能将数据在寄存器之间移动,或者把立即数移动到寄存器中:
c
mov r1, #0
mov r0, r1
LDR伪指令
c
ldr x7, =0x18bc0100
mov x8, xzr
ldr w9, =0xffffff00
ldr w8, [x7, #0x3c]
and w8, w8, w9
str w8, [x7, #0x3c]
dsb sy
isb
如上面arm汇编代码是将地址 0x18bc010
写入到 x7
寄存器中,将数据0xffffff00
写入到 w9
(x9 32bit形式)中。
LDR伪指令与MOV区别
mov 指令限制了立即数的长度为8位,立即数范围是0-255
,而ldr伪指令没有这个限制,如果使用ldr伪指令后面的立即数没有超过8位,那么汇编将会使用mov指令去替换LDR伪指令。
mov 后面的立即数可以进行位移操作,位移的位数范围是0-30
,步长为2,所以实际上可以表示的立即数范围更大。例如,
c
MOV R0, #1<<30
可以将R0
寄存器的值设置为0x40000000
。
上篇文章:ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或)
下篇文章:ARM 常见汇编指令学习 8 - dsb sy 指令及 dsb 参数介绍