zoukankan      html  css  js  c++  java
  • 使用B或BL跳转时,下一条指令的地址是这样计算的

    B跳转指令:它是个相对跳转指令,其机器码格式如下:

    [31:28]位是条件码[27:24]位为“1010”0xeaffffff,表示B跳转指令,为“1011”时,表示BL跳转指令;[23:0]表示偏移地址。

    使用B或BL跳转时,下一条指令的地址是这样计算的:

    将指令中24位带符号的补码立即数扩展为32(扩展其符号位);将此32位数左移两位;将得到的值加到pc寄存器中,即得到跳转的目标地址。

    例程:

    1.text

    2.global   _start

    3_start:

    4         b step1

    5 step1:

    6         ldr pc,  =step2

    7 step2:

    8         b step2

     

    反汇编代码:

    0:  eaffffff     b   0x4

     

     

     

    4:  e59ff000   ldr pc, [pc, #0] ; 0xc

    8:  eafffffe     b   0x8

    c:  30000008  tsteq r0, #8  ; 0x8

     

    b跳转指令:它是个相对跳转指令,其机器码格式如下:

     

    [31:28]位是条件码[27:24]位为“1010”0xeaffffff为一条指令的二进制机器码,表示B跳转指令,为“1011”时,表示BL跳转指令;[23:0]表示一个相对于PC的偏移地址。

        将指令中24位带符号的补码立即数扩展为32(扩展其符号位);将此32位数左移两位;将得到的值加到pc寄存器中,即得到跳转的目标地址。

    我们看看第一条指令“b step1”的机器码0xeaffffff:

    1.24位带符号的补码为0xffffff,将它扩展为32得到:0xffffffff

    2.将此32位数左移两位得到:0xfffffffc,其值就是-4(0xfffffffc符号位不变,其余位取反再加1得到-4);

    3.pc的值是当前指令的下两条(下一条的下一条指令的地址,加上步骤2得到的-4(PC-4,即PC回退4个字节,刚好指向当前指令的下一条指令上),这恰好是第二条指令step1的地址。

        不要被被反汇编代码中的“b 0x4”给迷惑了,它可不是说跳到绝对地址0x4处执行,绝对地址得像上述3个步骤那样计算。

    学习《S3C2410完全开发流程》的一点总结...

  • 相关阅读:
    bzoj 4017: 小Q的无敌异或
    [TJOI2014] Alice and Bob
    [TJOI2014] 上升子序列
    bzoj 3261: 最大异或和
    bzoj3087: Coci2009 misolovke
    bzoj3521: [Poi2014]Salad Bar
    bzoj4032: [HEOI2015]最短不公共子串
    bzoj1027: [JSOI2007]合金
    bzoj4637: 期望
    bzoj3919: [Baltic2014]portals
  • 原文地址:https://www.cnblogs.com/laojie4321/p/4405170.html
Copyright © 2011-2022 走看看