zoukankan      html  css  js  c++  java
  • arm跳转指令对应的机器码

    ARM:

    常见跳转指令机器码:

    B:0xEA

    BL:0xEB

    偏移地址计算过程:

    (目标地址 - 指令地址 - 8)/ 4 = 偏移

    // 减8,指令流水造成。

    // 除4,因为指令定长,存储指令个数差,而不是地址差。

    完整指令:

    假设上一步得到的偏移为0x00000C

    跳转指令为:B

    则完整指令为:0C 00 00 EA

    THUMB:

    Thumb指令都是2字节。BL看起来像4字节指令,其实是一个误解,因为长跳转是由两条跳转指令组成的。

    0~11位表示11位地址,具体含义如下:

    11位为0,偏移高位(off0)

    11位为1,偏移低位(off1)

    例子:

    1.向后跳转

    0012 00F001F8   bl .Lhelo

    .Lhelo:

    0018 05F0D1F7   pld [r1, r5]

    解析偏移:

    取高位 f000, 取后11位 => 000

    取低位 f801, 取后11位 => 001

    计算偏移:

    000 << 12) | (001 << 1) = 2

    由于这个最高位符号位为0,代表向后跳转,只需要保留该值2即可。

    目标地址:

    0x0012 + 4 + 2 = 0x0018

    2.向前跳转

    00001164 FF F7 BE FF    BL _Z4testv

    _Z4testv:

    000010E4 07 B5        PUSH {R0-R2,LR}

    解析偏移:

    取高位 f7ff, 取后11位 => 7ff

    取低位 ffbe, 取后11位 => 7be

    计算偏移: 

    7ff << 12) | (7be << 1) = 7fff7c

    由于这个最高位符号位为1,代表向前跳转,需要-1,然后取反,得到值为: ff800084,取84即可。

    目标地址: 

    0x1164 + 4 - 0x84 = 0x10e4

  • 相关阅读:
    创建视图与触发器
    Ubuntu 安装JDK
    Ubuntu maven 配置
    Ubuntu Navicat for MySQL安装以及破解方案
    jquery input 选择器
    eclipse maven编译项目
    Eclipse @override报错
    jQuery Ajax 实例 ($.ajax、$.post、$.get)
    如何防止表单重复提交(转)
    用bit字段来判断性别等
  • 原文地址:https://www.cnblogs.com/luzhiyuan/p/4598691.html
Copyright © 2011-2022 走看看