https://fishc.com.cn/thread-27458-1-1.html
(借鉴的网站)
如:
首先我们能计算出 jmp short s 的 位移量 为 0008-0018 = -10(注意这里是十六进制的-10 --> (二进制)-16)
则执行 jmp short s 后ip 应该 == 0018 + (-10) == 0008 --> 恰好对应 s 的偏移地址
其次我们也能计算处 jmp short s1 的 位移量 为 0018-0022 = -10(注意这里是十六进制的-10 --> (二进制)-16)
由于 s 中的 jmp short s1 是复制过去的所以位移量不变 == 0018-0022 = -10 所以当执行 s 中的 jmp short s1 时
ip == 000A + (-10) = 0
可能的问题:s 中不是有两个 nop(nop指,这是一条空语句) 吗?为什么复制过后一个都没了呢? --> 这个跟机器码所占的字节有关,nop 所占的字节为 1,两个恰好是2字节,而jmp short s1 这条指令所占的字节为2字节,刚好覆盖了两个nop
此种格式的jmp指令实现的是段内短转移
对IP的修改范围为 -128 ~ 127
即向前转移最多可以越过128个字节
向后转移最多可以越过127个字节
该实现的是段内近转移
对IP的修改范围为 -32769 ~ 32767
即向前转移最多可以越过32769个字节
向后转移最多可以越过32767个字节
实现的是段间转移 --> 远转移
功能:IP = (16位寄存器所存的值)
(1)jmp word ptr 内存单元地址(段内转移)
该内存单元地址处开始存放着一个字(数据),该字(数据)就是转移的目的偏移地址
()mp dword ptr 内存单元地址(段间转移)
该内存单元地址处开始存放着一个两个字(数据),高地址处的字(数据)是转移的目的的段地址,低地址处的字(数据)是转移的目的的偏移地址(第一个字(数据)为低地址,第二个字(数据)为高地址)
如果 cx = 0 那么转移到标号处执行
反之,则执行该语句的下一条指令,即跳过jcxz指令
如果 cx != 0 那么转移到标号处执行
反之,则执行该语句的下一条指令,即跳过jcxz指令