ldr命令语法
ldr有两种用法,分别是正常指令和伪指令
正常指令
ldr{条件} 目的寄存器 ,<存储地址>
- ldr r0 ,0x12345678 - 将地址为0x12345678的存储单元中的值存入r0寄存器
ldr指令用于从存储器中将值存入寄存器中
-ldr pc,_underfine_instruction
* _underfine_instructionz*这是一个地址标号
将这个地址里的值付给pc,这样我们的就会根据pc进行跳转执行
伪指令
- 伪指令是针对arm汇编中存在的真指令而言,伪指令即是在arm汇编中不存在的指令,最终伪指令会转换为真指令。
- 在ldr中若存在=,该ldr即为伪指令
- ldr r0,=0x12345678 把0x12345678这个之赋给r0,而不是把0x12345678中的值赋给r0,
- ldr伪指令与mov指令相似,但mov指令的操作数是有限制的。以通过0x00-0xFF中某个数,循环右移偶数位而产生,就是合法的mov的操
作数,否则就是非法的mov的操作数,当ldr的操作数对于mov合法,伪指令ldr就是转换为mov指令,若非法时,伪指令ldr就会采用偏移的方法,即去一个地址标号中取值给目的寄存器。
adr指令
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄
存器中。
在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败
- adr r0, _start
的意思其实很简单,就是将_start的地址赋值给r0.但是具体实现的方式就有点复杂了,对于用adr指令实现的话,说明_start这个地址,相对当前PC的偏移,应该是很小的,意思就是向前一段后者向后一段去找,肯定能找到_start这个标号地址的
这样的代码,所处理的值,都是相对于PC的偏移量来说的,这样的代码中,没有绝对的物理地址值,都是相对的值,利用产生位置无关代码