uboot移植第五天——ldr和adr的用法

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的偏移量来说的,这样的代码中,没有绝对的物理地址值,都是相对的值,利用产生位置无关代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值