原创 ARM的BX指

2011-3-15 10:01 2970 5 5 分类: 工程师职场

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处理了。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条