无条件短转移机器码为EBxx,其中EB00~EB7F是向后转移(高址方向),EB80~EBFF是向前转移(低址方向),因为80~FF的二进制为1000 0000~1111 1111,高位为“1”代表负数。
转移指令的机器码 = “转移类别机器码” + “位移量”
位移量 = 目的地址 - 起始地址 - 跳转指令本身长度
跳转后执行EIP位于跳转指令下一行,这时应执行EIP + “位移量”处的指令,如下例:
向后转移:
汇编指令:
...
:401000 jmp 401005
...
:401005 xor eax,eax
...
内存中:
:00401000 | EB | jmp指令 |
:00401001 | 03 | jmp指令 |
:00401002 | ... | 位移量 |
:00401003 | ... | 位移量 |
:00401004 | ... | 位移量 |
:00401005 | 33 | xor指令 |
:00401006 | c0 | xor指令 |
向前转移: 汇编指令: ... :401000xor eax,eax ... :401005 jmp 401000 ... 内存中:
:00401000 | 33 | xor指令-位移量 |
:00401001 | c0 | xor指令-位移量 |
:00401002 | ... | 位移量 |
:00401003 | ... | 位移量 |
:00401004 | ... | 位移量 |
:00401005 | EB | jmp指令-位移量 |
:00401006 | F9 | jmp指令-位移量 |
无条件长转移于此类似,只是跳转指令占5个字节,E900000000~E97FFFFFFF 表示向后转移(高址方向),E980000000~E9FFFFFFFF 表示向前转移(低址方向)。