我将画出内存中内容来解释这个实验,易于理解。
进入debug模式,最开始各个寄存器的状态:
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B15 ES=0B15 SS=0B25 CS=0B25 IP=0005 NV UP EI PL NZ NA PO NC
0B25:0005 B80000 MOV AX,0000
在执行到 mov di,offset s之前,内存是这样的:
即从0b25:5执行到0b25:9。
0b25:a-ob25:15这段代码实际上是将s2开始的两个字节复制到s开始的两个字节中,即覆盖了s中的两个nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
执行完这段之后,内存如下
继续执行,IP寄存器指向0b25:16(即S0),执行jmp指令后会跳回到S处。再执行S处的jmp指令,用当前指令后的第一个字节a加上偏移F6,得到00,即会跳转到0b25:0,执行mov ax,4c00h int 21,正常结束程序。