assume cs:code code segment mov ax, 4c00h int 21h start: mov ax, 0 s: nop nop mov di, offset s mov si, offset s2 mov ax, cs:[si] mov cs:[di], ax s0: jmp short s s1: mov ax, 0 int 21h mov ax, 0 s2: jmp short s1 nop code ends
本质问题说的是jmp指令被编译为机器码后,机器码是 EB,后面的数据是 IP 寄存器 将要加、减的值。
代码中第一次跳转是上图中的 红圈1, EBF0被读取后, IP寄存器指向的是 076A:0018这个地址,即【IP】=18H, EBF0执行后,IP=【IP】-10H,跳转到 红圈3 处,此处两个NOP点位的两个字节此时被换为了 红圈2 处的机器码 EBF6, 加载 EBF6后,IP指向076a:000A处,即 【IP】=0AH 执行EBF0后, IP=【IP】- 0AH,即指向了076A:0000处理,代码继续执行。
这段代码表明:
1、JMP指令被编译为机器指令后,【跳转值】就已经已经确定了。
2、JMP指令影响IP寄存器的值。