arm与thumb的状态转换及地址装载

本文探讨了ARM与Thumb状态间转换的问题,特别是在使用ADR指令时遇到的限制。当从Thumb状态跳转到ARM状态时,如果目标地址位于当前指令之前,则无法使用ADR加载地址,而必须采用LDR指令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ARM汇编中,关于arm/thrumb状态转换以及地址装载的问题:
问题描述:
从thumb指令跳转到arm指令区:
若要跳转的arm指令区的标号在本thumb指令区的前面,

也就是标号相对于当前pc的偏移量是负值,如果用adr

r1, expr来装载要跳转到地址,那么这时候会出错,说

是地址偏移超出范围,如果用ldr来装载地址则没有问

题;
若要跳转到arm指令区的标号在本thumb指令区的后面,

也就是标号相对于当前的pc的偏移量为正值,这时候无

论用adr还是ldr都没有问题。
相反,若从arm指令区跳转到thumb指令区,两种情况无

论是用ldr或者adr都没有问题。

造成这些区别的原因是什么呢?


下面的代码,预测一下结果:

    area    jump,code,readonly
    
    entry
   
    code32

start32
    nop
    nop
    adr r0,thumb16+1
    bx    r0
    nop
    nop
    nop
   
    code16
thuumb16
    nop
    nop
    nop
    nop
    ldr r0,=next32
    bx r0

    code32
next32
    nop
    nop
    nop
    adr r0,thu+1
    bx r0
   
   
    end

结果是从arm模式下用adr装载地址+1可以回跳到thumb

模式下(即使地址是负偏移),而在thumb模式下用adr

跳转则只能往后跳,不能往前跳,这个原因是因为在

thumb下,操作数的范围比arm模式的小,在这段代码里

,如果把thumb模式下的ldr r0,=next32修改成adr

r0,=start32,那么我们预计的结果应该是回跳,但是这

样做不行,在模拟器上运行,得到的相对地址是负数,

0xFFFFFFF6,越界了,所以不能这样做,而在arm模式

下操作数范围大些,所以可行。


在thumb状态下,    ADR的表达式ADR register,expr,

其中,expr是地址表达式,偏移量必须是正数并小于

1kB。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值