参照图片和注释吧
assume cs:codesg codesg segment mov ax,4c00h int 21h start: mov ax,0 //程序入口点 s: nop //这个位置的内容稍后被替换了(当这里第二次执行时,就是那句EBF6了) nop //这个位置的内容稍后被替换了(当这里第二次执行时,就是那句EBF6了。 //先往下走一步至1419:000A,然后jmp,往前跳10个字节,走到了1419:00 // 00) mov di,offset s //di=0008H mov si,offset s2 //si=0020H mov ax,cs:[si] //s2处的指令(EBF6)拿过来了,复制给ax. mov cs:[di],ax //ax再传给cs:[8],即s处被改动,上图中1419:0020处的EBF6被复 //制到了s处(1419:0008),EBF6是两个字节大小,正好把 //1419:0008、1419:0009都填满了 s0:jmp short s //马上调回到s处 s1:mov ax,0 //此处以下没有被执行到 int 21h mov ax,0 s2:jmp short s1 //这里最初已经计算出了s2和s1之间的距离, //18H - 20H = -10(十进制)= F6(十六进制补码的) nop codesg ends end start