分析这个程序的运行过程
assume cs:codesg
codesg 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
codesg ends
end start
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
上面这四行代码把s2的jmp short s1
复制到s段的前两个字节处。s的前两个字节是nop nop,这两个空命令就变成了jmp short s1
翻译成的机器指令EBF6
,注意jmp指令翻译成机器指令中的那个数字F6是相对位移(会跳到相对当前指令的下一条指令之前的位移为F6处的指令处执行),不再是标号s1的地址。F6是补码,对应十进制是-10,相对位移是-10。将由s的第一个指令的下一条指令地址上溯10个字节的位移,正好到段开始的指令,执行
mov ax,4c00h int 21h
,程序结束。