jmp转移指令的超界检测

时间:2021-08-18 04:49:35
1.我们知道,短转移范围-128~127,近转移-32768~32767,但是以下检测代码为什么能正常实现?

code segment
start:
        mov dx,1213h
jmp near ptr s
db 32768 dup (0)
     s:mov ah,4ch
        int 21h
code ends
end start

2.另外对于16位位移之内的转移,直接写jmp时,编译器自动根据位移大小转换为机器语言EB、E9,也就是说自动转换为短转移和近转移,那么在编写程序时直接写jmp,不加short、near算标准吗?

6 个解决方案

#1


这区人也太少了,还是我结贴率太低了。以前的号丢了,这个是新号第一帖,求懂的大哥解答一下。

#2


1. 可以理解为现在地址+偏移=目标地址,偏移是 16 位的,非符号数吧;加运算结果进位了就形成回绕,到自己的低位去了,成了偏移为负数的效果。
2. jmp 不加 short 或 near,一直是这样的吧,特殊情况才加的,否则容易出错而且少有必须使用特定类型转移的情况的。

#3


刚刚debug了一下,看到指令jmp所在的位置IP=0003h,然后jmp 8006h,中间是有32768db的位置。近转移的操作数是IP的值,应该是无符号的,所以应该最大是FFFFh吧。还有近转移是在一个段内跳转,所以一个段有多大应该都能跳到吧。
jmp转移指令的超界检测

#4


结合楼上的截图,我们可以知道,并没 有越界,你看JMP 8006左边对应的机器码为E90080,这个的意思就是下一条指令的地址0006H加上与目标之间指令地址(8006H)之间的差值-32768D(十六进制表示为8000H)不正好为-32762D吗?也就是从0006这条指令反绕-32672D以后,就正好指向了无符号数8006H指向的地址。由此可知,汇编JMP指令中的地址是以无符号数表示的。但机器指令E9中的地址差值是以有符号数表示的。当向后跳转到的指令地址超出正32767,采用负数反绕来得到目标地址。同理,当向前跳转的指令地址超出-32768D时,采用正数反绕来得到。由此可知,楼主的代码里面的跳转指令不存在越界。只要目标地址是在同一代码段(64KB)的范围内,就总可以得到目标地址,不管是正绕还是反绕。

#5


由于有些教科书上确实写着段内近转移的范围为-32678-32767,所以,我结合实际并根据自己的理解作出了上述解释。
对于楼主的第二问,二楼是正解。

#6


你怎么理解都行:
无符号的话:8000H就是32768,就是0006H + 8000H = 8006H
有符号的话:8000H就是-32768,就是0006H + 8000H = 8006H
也就是说,本来偏移地址应该是+32768,那么你可以理解成无符号的+32768,也可以理解成有符号的-32768。
在汇编中,运算本身就带有这两种含义。
王爽书上确实说得是-32768~32767,那么你就要把偏移理解成-32768了。

#1


这区人也太少了,还是我结贴率太低了。以前的号丢了,这个是新号第一帖,求懂的大哥解答一下。

#2


1. 可以理解为现在地址+偏移=目标地址,偏移是 16 位的,非符号数吧;加运算结果进位了就形成回绕,到自己的低位去了,成了偏移为负数的效果。
2. jmp 不加 short 或 near,一直是这样的吧,特殊情况才加的,否则容易出错而且少有必须使用特定类型转移的情况的。

#3


刚刚debug了一下,看到指令jmp所在的位置IP=0003h,然后jmp 8006h,中间是有32768db的位置。近转移的操作数是IP的值,应该是无符号的,所以应该最大是FFFFh吧。还有近转移是在一个段内跳转,所以一个段有多大应该都能跳到吧。
jmp转移指令的超界检测

#4


结合楼上的截图,我们可以知道,并没 有越界,你看JMP 8006左边对应的机器码为E90080,这个的意思就是下一条指令的地址0006H加上与目标之间指令地址(8006H)之间的差值-32768D(十六进制表示为8000H)不正好为-32762D吗?也就是从0006这条指令反绕-32672D以后,就正好指向了无符号数8006H指向的地址。由此可知,汇编JMP指令中的地址是以无符号数表示的。但机器指令E9中的地址差值是以有符号数表示的。当向后跳转到的指令地址超出正32767,采用负数反绕来得到目标地址。同理,当向前跳转的指令地址超出-32768D时,采用正数反绕来得到。由此可知,楼主的代码里面的跳转指令不存在越界。只要目标地址是在同一代码段(64KB)的范围内,就总可以得到目标地址,不管是正绕还是反绕。

#5


由于有些教科书上确实写着段内近转移的范围为-32678-32767,所以,我结合实际并根据自己的理解作出了上述解释。
对于楼主的第二问,二楼是正解。

#6


你怎么理解都行:
无符号的话:8000H就是32768,就是0006H + 8000H = 8006H
有符号的话:8000H就是-32768,就是0006H + 8000H = 8006H
也就是说,本来偏移地址应该是+32768,那么你可以理解成无符号的+32768,也可以理解成有符号的-32768。
在汇编中,运算本身就带有这两种含义。
王爽书上确实说得是-32768~32767,那么你就要把偏移理解成-32768了。