首页 > 编程语言 > 汇编 > 汇编JMP理解
2012
05-28

汇编JMP理解

格式:   JMP 目标地址

无条件转移指令JMP:

这种跳转指令有三种方式:短(short),近(near)和远(far)。短是指要跳至的目标地址与当前地址前后相差不超过128字节。近是指跳转的目标地址与当前地址在同一个段内,即CS的值不变,只改变EIP的值。远指跳到另一个代码段去执行,CS/EIP都要改变。短和近在编码上有所不同,在汇编指令中一般很少显式指定,只要写 jmp 目标地址,几乎任何汇编器都会根据目标地址的距离采用适当的编码。远转移在32位系统中很少见到,由于有足够的线性空间,一个程序很少需要两个代码段,就连用到的系统模块也被映射到同一个地址空间。

 

JMP举例:

jmp的操作数自然是目标地址,这个指令支持直接寻址和间接寻址。间接寻址又可分为寄存器间接寻址和内存间接寻址。

jmp 8E347D60 ;直接寻址段内跳转

jmp EBX ;寄存器间接寻址:只能段内跳转

jmp dword ptr [EBX] ;内存间接寻址,段内跳转

jmp dword ptr [00903DEC] ;同上

jmp fward ptr [00903DF0] ;内存间接寻址,段间跳转

 

JMP深入理解:

在32位系统中,完整目标地址由16位段选择子和32位偏移量组成。因为寄存器的宽度是32位,因此寄存器间接寻址只能给出32位偏移量,所以只能是段内近转移。在内存间接寻址时,指令后面是方括号内的有效地址,在这个地址上存放跳转的目标地址。比如,在[00903DEC]处有如下数据:7C 82 59 00 A7 01 85 65 9F 01 。内存字节是连续存放的,如何确定取多少作为目标地址呢?dword ptr 指明该有效地址指明的是双字,所以取0059827C作段内跳转。反之,fward ptr 指明后面的有效地址是指向48位完全地址,所以取19F:658501A7 做远跳转。 注意:在保护模式下,如果段间转移涉及优先级的变化,则有一系列复杂的保护检查。

 

在反汇编中E9指令的理解:

E9是段内相对转移指令,   后面跟的是个相对当前指令的下一条指令的地址的偏移量,   不是目标地址的绝对值.   即转移去的目的地址是该指令中的偏移值再加上本转移指令的下一条指令的地址。如对于以下指令:

0040130F   > E9 E4020000    JMP program.004015F8

E9后接E4020000,根据little endian的方式E9后面的值是2E4,当 程序执行到0040130F时,EIP=00401314,所以E9这种间接跳转的地址就是EIP+2E4=004015F8

最后编辑:
作者:NINE
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。