【ARM 常见汇编指令学习 7 - 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 参数介绍

相关推荐
杨如画.8 个月前
x-zse-96安卓端纯算,魔改AES还原
ida·安卓逆向·arm汇编·x-zse-96·unidbg·白盒aes·魔改aes