对于jmp什么短转移,近转移,远转移,8位,16位,32位转移神马的云里雾里,求大神指点
如题!!!! 我还没学到那里,你可以去问度娘啊! 简单的说就是:短转移=8位转移
近转移=16位转移
远转移=32位转移
你用debug测试下就明白了
当ip为100时
hex码 汇编码
EB05 jmp 105
E9FBEE jmp F000
EA00020010 jmp 1000:200
短转移和近转移都是在同一个段之内转移,而远转移是跨段转移的 qq348093088 发表于 2013-12-3 14:54 static/image/common/back.gif
简单的说就是:
短转移=8位转移
那8位16位32位神马的有什么区别? 短跳转 是两个字节,一个E8操作码,一个跳转的位移,因为一个字节大小是FF 而跳转是有符号,可以向上面跳转,也可以向下面跳转,所以短跳转范围是-128-127近跳转是在一个段内范围大小,因为基址一定的情况下,偏移大小只能是FFFF 也就是64K,所以近跳转范围是-32K-32k 远跳转就是64K之外了,也就是65536个字节之外 要没时间了 发表于 2013-12-3 16:56 static/image/common/back.gif
那8位16位32位神马的有什么区别?
这只是二进制表示的范围
8位最大8个1
16位最大16个1
32位最大32个1
别说你连二进制是什么都不知道,那我真的……Orz 到底什么是短转移 什么是近转移 有什么含义呢?
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就是偏移量 这也是为什么 两者跳转的范围不同的缘故 呵呵
看出来了么 你应该明白了、、、
页:
[1]