• 使用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完全开发流程》的一点总结...

  • 相关阅读:
    Joomla-2.5安装配置
    Drupal-7.x安装配置
    【Linux导论】Linux发行版安装(Linux Distribution Installation)
    【深度学习】卷积神经网络(Convolutional Neural Networks)
    【Linux导论】Linux引导流程(The Boot Process)
    【Linux导论】Linux文件系统基础(Linux Filesystem Basics)
    【Linux导论】Linux术语(Linux Terminology)
    【Linux导论】Linux发行版本(Linux Distributions)
    【Linux导论】Linux哲学(Linux philosophy)
    hashCode equals
  • 原文地址:https://www.cnblogs.com/laojie4321/p/4405170.html
Copyright © 2020-2023  润新知