ARM | LDR &ADR

LDR 是ARM中的指令,也是伪指令。

当用 LDR r, =imd // r 为寄存器, imd为立即数

LDR 是一条伪指令。编译器会根据 立即数的大小,决定用 ldr 指令或者是mov或mvn指令。

当imd能用mov或者mvn操作时,就将它翻译成一条mov或mvn指令。当imd大于mov或mvn能够操作的数时,编译器会将imd存在一个内存单元中,然后再用一条ldr指令加载这个内存单元的的值到寄存器中。

LDR r, label 和 LDR r, =label的区别:

LDR r, =label 会把label表示的值加载到寄存器中,而LDR r, label会把label当做地址,把label指向的地址中的值加载到寄存器中。

譬如 label的值是 0x8000, LDR r, =label会将 0x8000加载到寄存器中,而LDR r, label则会将内存0x8000处的值加载到寄存器中。

ADR 和 ADRL 伪指令:

ADR 和 ADRL 伪指令用于将一个地址加载到寄存器中。

ADR为小范围的地址读取伪指令。ADR指令将基于PC相对偏移的地址值读取到寄存器中。在汇编编译源程序时,ADR伪指令被编译器替换在一条合适的指令,通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能使用一条指令实现,则产生错误。其能加载的地址范围,当为字节对齐时,是-10201020,当为非字对齐时在-255255之间。

ADRL是中等范围的地址读取指令。会被编译器翻译成两条指令。如果不能用两条指令表示,则产生错误。

ADRL能加载的地址范围当为非字节对齐时是-64K-64K之间;当为字节对齐时是-256K~256K之间。

ADRL是不能自动更改LSB的,所以这牵扯到在跳转的时候assembler选择ARM指令和Thumb指令的问题。

ARM与Thumb间的切换

  • 由arm状态切换到thumb状态
    将寄存器的最低位设置为1
    BX指令:R0[0]=1,则执行BX
    R0指令将进入thumb状态
  • 由thumb状态切换到ARM状态
    寄存器最低位设置为0
    BX指令:R0[0]=0,则执行BX
    R0指令将进入arm状态
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值