要没时间了 发表于 2013-12-3 12:15:46

对于jmp什么短转移,近转移,远转移,8位,16位,32位转移神马的云里雾里,求大神指点

如题!!!!

 发表于 2013-12-3 12:36:45

我还没学到那里,你可以去问度娘啊!

qq348093088 发表于 2013-12-3 14:54:32

简单的说就是:

短转移=8位转移
近转移=16位转移
远转移=32位转移

你用debug测试下就明白了
当ip为100时
 hex码            汇编码
 EB05    jmp 105
 E9FBEE   jmp F000
 EA00020010  jmp 1000:200

短转移和近转移都是在同一个段之内转移,而远转移是跨段转移的

要没时间了 发表于 2013-12-3 16:56:32

qq348093088 发表于 2013-12-3 14:54 static/image/common/back.gif
简单的说就是:

短转移=8位转移


那8位16位32位神马的有什么区别?

1236 发表于 2013-12-3 17:17:46

短跳转 是两个字节,一个E8操作码,一个跳转的位移,因为一个字节大小是FF   而跳转是有符号,可以向上面跳转,也可以向下面跳转,所以短跳转范围是-128-127近跳转是在一个段内范围大小,因为基址一定的情况下,偏移大小只能是FFFF 也就是64K,所以近跳转范围是-32K-32k   远跳转就是64K之外了,也就是65536个字节之外

qq348093088 发表于 2013-12-3 19:35:47

要没时间了 发表于 2013-12-3 16:56 static/image/common/back.gif
那8位16位32位神马的有什么区别?

这只是二进制表示的范围
8位最大8个1
16位最大16个1
32位最大32个1

别说你连二进制是什么都不知道,那我真的……Orz

嬉皮士 发表于 2013-12-4 18:49:41

到底什么是短转移 什么是近转移 有什么含义呢?


JMP指令是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一个短(short)转移(偏移量在[-128, 127]范围内),近(near)转移(偏移量在[-32K, 32K]范围内)或远(far)转移(在不同的代码段之间转移)。

短和近转移是段内转移,JMP指令只把目标指令位置的偏移量赋值指令指针寄存器IP,从而实现转移功能。但远转移是段间转移,JMP指令不仅会改变指令指针寄存器IP的值,而且还会改变代码段寄存器CS的值。

该转移指令的执行不影响任何标志位。

例如:


next1: …
JMP next1 ;向前转移,偏移量之差为负数

JMP next2 ;向后转移,偏移量之差为正数

next2: …

在目前流行的汇编系统中,当段内转移时,有些软件把该转移指令默认为近转移,从而使指令的偏移量用一个字来表示,于是生成3个字节的指令代码,但如果程序员自己清楚转移的幅度在一个短转移的范围之内,那么,可用前置short的办法来告诉汇编程序,让它产生2个字节的指令代码。

比如:如果程序员知道在上例中的标号next2离“JMP next2”指令的偏移量不会超过127,那么,可用下面的转移方式来省掉一个字节的指令代码。

next2: …
JMP short next2 ;生成2个字节的转移指令,从而节省一个字节


书上这么写的 也就是说 短转移可以用近转移来代替 按理说 这算是"包含"罢 只不过 这个包含是以浪费为代价的 也就是 本来可以用1字节解决的问题 非用两字节来实现 浪费

看到这你应该想到了这样一点 反正我想到了 也就是 两者的区别 或 实质 其实是用多大的空间来存放地址

假设 jmp进行偏移量跳转时的机器码是eb 那 这两者的样子大概是 eb XX和 eb XX XX (都是16进制数 下同) XX就是偏移量 这也是为什么 两者跳转的范围不同的缘故 呵呵

看出来了么 你应该明白了、、、

我爱鱼C论坛 发表于 2015-2-19 21:38:28

页: [1]
查看完整版本: 对于jmp什么短转移,近转移,远转移,8位,16位,32位转移神马的云里雾里,求大神指点