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

时间: 2024-11-24 05:58:09

arm跳转指令对应的机器码的相关文章

ARM中跳转指令BL/BLX偏移值计算规则

4字节对齐arm指令 ????规则:偏移=( 跳转地址-(指令地址+8) )/4 原因: 指令地址 + 8:因为ARM的流水线使得指令执行到当前指令处时,PC实际的值是A+8. 跳转指令 - 上一步得到地址:得到跳转指令与当前PC处的差值. ÷4:因为ARM的指令是4对齐的,即最低两位为00,于是将这个值右移两位. ? 执行时: 取出偏移,左移两位,加入PC,这时PC的值刚好为目标处的地址值,即目标地址指令进入取值,流水线前两级被清空. ? 实例测试: .text:0000126C 90 00

ARM指令集——跳转指令

ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST或者TEQ指令中使用S后缀.这些比较指令总是会更新标志位. 在Thumb模式下,所有数据处理指令都更新CPSR中的标志位.有一个例外就是:当一个或更多个高寄存器被用在MOV和ADD指令时,此时MOV和ADD不能更新状态标志. 几乎所有的ARM指令都可以根据CPSR中的ALU状态标志位来条件执行.参见

关于ARM的B,BL跳转指令

.text:00001260 A3 04 00 EB                             BL      sub_24F4 当前地址+ (偏移 << 2 + 8) = 目标地址 0x1260 + 0x4A3 * 4 + 8 = 24F4 偏移 = (目标地址 - 当前地址 - 8) >> 2 偏移 = (0x24F4 - 0x1260 - 8) / 4 = 0x4A3 假设跳转指令处的地址是A,跳转目标处的地址是B.B,BL指令保存的是偏移地址,这个地址的计算方

arm学习之汇编跳转指令总结

目前所知道的跳转指令有 b,bl,bep,bne.他们共同点是都是以b开头,首先从字面上分析:b:是Branch,表示分支.bl:是Branch Link表示带连接的分支.bep:Branch ,Equalbne:Branch ,Not Equal. B或BL指令引起处理器转移到"子程序名"处开始执行.两者的不同之处在于BL指令在转移到子程序执行之前将其下一条指令的地址拷贝到R14(LR,链接寄存器).由于BL指令保存了下条指令的地址因此使用指令"MOV PC,LR&qu

Android 图解逆向工程中ARM常用汇编指令(一)

我们走得太快,灵魂都跟不上了. 微小的幸福就在身边,容易满足就是天堂. 在逆向和爆破中我们经常会在IDA中接触到汇编,一般做安卓的不会太了解VB回编等,不太了解的同学可以先查看上篇文章<Android ARM常用的汇编指令合集> 再来继续我们的学习,我们先来看张图. 这个view里面有 PUSH/LDR/SUB/MOVS/BLX/SUBS/BEQ/CMP ,这些差不多都是常见的,不过也不需要看得懂,理解这个指令即可,接下来我们就来分析下这些指令分别有什么作用吧. 先引入 概念性 东西,免得大家

汇编中的跳转指令

能修改CS以及IP的指令都是转移指令.它分为段内转移,段间转移. 段内转移:只修改IP的值 段间转移:同时修改CS以及IP的值 段内转移根据转移的距离远近分为:短转移,近转移 短转移:转移范围为-128 – 127 近转移:转移范围为-32768 –32767 根据转移情况又分为: 无条件转移指令 条件转移指令 循环指令 过程 中断 <1> jmp short xxx(行号) 这个是短转移指令,实现段内的转移,在翻译成机器码的时候,码内并没有目标地址,有的只是转移位移,这样做的好处就是防止目标

ARM重要汇编指令记录

IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的EXPORT ,表示本程序里面用到的变量提供给其他模块调用的.以上两个在汇编和C语言混合编程的时候用到 ENDP    表示PROC所定义的过程结束. (end procedure)ENDS    表示SEGMENT定义的段结束.   (end segment)END     程序结束. B.BL.BX.BLX 和 BXJ跳转.带链接跳转.跳转并切换指令集.带链接跳转并切换指令集.跳转并转换到 Jazelle 状态. 状态寄存器传

汇编:jmp系列跳转指令总结

助记方法: J:跳转C: 进位位置位N: 否S: 符号位置位o: 溢出位置位Z: 零标志位置位E: 等于P:奇偶位置位A: AboveB: BelowL: Less (Little的比较级)G: Greater (Great的比较级) (SF^OF)=1 --> SF=0, OF=1 --> a < b SF=1, OF=0 --> a < b (SF^OF)=0 --> SF=1, OF=1 --> a > b SF=0, OF=0--> a >

ARM指令集----杂项指令

ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load.Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种是直接向PC寄存器写入目标地址的值 通过直接向PC寄存器写入目标寄存器的数字可以实现在4GB 地址空间的任意跳转,这种跳转又称为长跳转,如果在残肢令前面使用MOV LR,PC等指令,可以保存返回来的地址值,这样就实现了在4GB空间中的子程序调用 ARM的跳转指令可以从当前指令向前或者是向后的32位的