ARM的BX指令

bx的语法格式
BX{<cond>} <Rm>
<cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。
<Rm>该寄存器中为跳转的目标地址。当<Rm>寄存器的bit[0]为0时,目标地址处的指令为ARM指令;
当<Rm>寄存器的bit[0]为1时,目标地址处的指令为Thumb指令。

看一段简单程序的片段,不用考虑省略号的内容,看框架就可以了!

    EXPORT LEDTEST
    AREA testasm,CODE,READONLY
    CODE32
LEDTEST
    。。。。。。。。。。
    。。。。。。。。。
    。。。。。。。。
    。。。。。。。。。
    。。。。。。。。。。。
ledon
    ...............
    ...............
    。。。。。。。。。。。。
    。。。。。。。。。。。
    adr r4,delay1+1
    bx r4

ledoff
    ..............
    ...............
    .............
    .............
    .............
    ..............

    AREA testasm,CODE,READONLY
    CODE16
delay1
    ............
    ...........
    .............
    ldr r1,=ledoff
    bx   r1
    ........
    .............
    .............
END

关于delay1+1:
ARM指令是字对齐(指令的地址后两位为[1:0]=0b00),Thumb是半字对齐(指令的地址后两位为[1:0]=0bx0,x为0或1)。指令的地址的最后一位必为0。
因此bx(不管往ARM还是往Thumb跳转)的跳转指令必须保证指令地址的最后一位为0,上例中bx指令能自
动地将目标地址值置为r4的值和0xFFFFFFFE的与后的结果,就会使指令地址的最后一位必为0了。
那么delay+1的这个1不就被0与掉了么,就没有什么作用了?其实,在执行bx指令时,它是首先判
断指令地址的后一位为0或1(这样就知道要跳转的地方是ARM还是Thumb指令。0跳转arm,1跳转thumb。),然后再PC=r4 AND 0xFFFFFFFE。这样,当我们需要要跳转到Thumb指令处执行时,必须将指令地址的最后以为置1。

而bx再跳转到ARM指令时就无需考虑这些了,就不用像上面的+1处理了。


====

http://hi.baidu.com/dsfire/item/9ba3f500dc4c1b16cc34ea5e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值