这个是自己的一点理解,首先上源代码:
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处的代码复制到s处,执行完之后代码在内存中就变成了下面的样子:
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: jmp short s1
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
然后当执行到
s0: jmp short s
的时候,然后下一条它实际执行的是:
s: jmp short s1
注意,jmp是ip的值,也就是代码执行的偏移量,在原来的代码里面
s2: jmp short s1
jmp的偏移量是-3(向上的第三条指令),也就是会跳到s0 去
但是现在实际执行的是:
s: jmp short s1
jmp依然是跳转到-3(向上的第三条指令)的指令处执行,跳转就跑到了
mov ax,4c00h
int 21h
然后正常结束