assume cs:codesg
codesg segment
mov ax,4c00H
int 21H
start: mov ax,0
s: nop
nop
mov di,offset s ; 把s的地址存入di
mov si,offset s2 ; 把s2地址存入si
mov ax,cs:[si] ; 把s2地址的机器码存入ax,即ax里面是语句“jmp short s1”的机器码
mov cs:[di],ax ; 把这个机器码放到s地址处,相当于把两个nop指令替换成了jmp short s1 语句
; 但是实际上机器码存的并不是s1的地址,而是IP的偏移量,也就是S2关于S1的地
; 址偏移量,现在来计算一下,mov指令占3字节,int占2字节,jmp短转移2字节
; 共10字节。那么从s语句处向上偏移10字节的距离,恰好IP指向第一条语句
s0: jmp short s ; 机器码占2字节
s1: mov ax,0 ; 机器码占3字节
int 21H ; 机器码占2字节
mov ax,0 ; 机器码占3字节
s2: jmp short s1 ; 机器码占2字节
nop
codesg ends
end start
程序在执行当前语句时IP已经做了++操作,指向了下一条指令