先看一下错误思路
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop ;4.此时执行汇编指令jmp short s1
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si] ;1.此时ax存了两个字节,这两个字节表示jmp short s1
mov cs:[di],ax ;2.此时s段中的两个nop变成了一个jmp short s1
s0: jmp short s ;3.跳转到s段
s1: mov ax,0 ;5.啊怎么又到这里了,接下来该怎么办?
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
正确思路是这样的
assume cs:codesg
codesg segment
mov ax,4c00h ;5.正好跳转到这里,位移转移时要特别注意这一点
int 21h
start: mov ax,0
s: nop ;4.此时执行jmp short s1所表示的含义,这个含义是向上方跳转8个字节
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si] ;1.此时ax存了两个字节,这两个字节表示jmp short s1所表示的含义
mov cs:[di],ax ;2.此时s段中的两个nop变成了一个jmp short s1所表示的含义
s0: jmp short s ;3.跳转到s段
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start