MOV
- 可以寄存器与寄存器之间传递数据
- 可以把立即数移动到寄存器中(常数不能超过32位)
LDR
- 可以地址与寄存器之间的数据传递
- 也可以常数传递到寄存器中
实例:
1、r1与r2寄存器之间传递就只能用MOV
:
MOV r1,r2
2、常数传递到寄存器可以使用MOV
和ldr
:
MOV r0,#0
ldr r0,=0
3、寄存器与地址0X00000000
之间传递数据只能用ldr
:
ldr r0,=0X30000000
ldr r0,0X00000000
LDR指令:
ldr r0, 0x12345678 // 就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中。
ldr r0,r1 //表示把r1寄存器中的值放入r0
ldr r0,[r1] // [r1]表示r1中值对应内存的地址,所以是把r1中的数当作一个地址,把这个地址中的值放入r0.
LDR伪指令:
ldr r0, =0x12345678` //例1(立即数):
这样,就把0x12345678
这个地址写到r0
中了。所以,ldr
伪指令和K是比较相似的。只不过mov
指令限制了立即数的长度为8位
,也就是不能超过512。而ldr
伪指令没有这个限制。如果使用ldr
伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。
ldr r0, =_start //将指定标号的值赋给r0
这里取得的是标号 _start
的绝对地址,这个绝对地址(链接地址)是在链接的时候确定的。它要占用 2 个 32bit的空间,一条是指令,另一条是文字池中存放_start
的绝对地址。