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
如上的程序可以正确返回。
分析程序如下:
(1)
首先,
mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
这四条指令的作用是将s2处的指令一条指令拷贝到s处。
(2)
我们就要分析这条拷贝的指令
jmp short s1 ;E8 F6
该指令为短转移,是根据位移进行转移的指令。
jmp short s1对应的机器码为E8F6,位移为F6(-10)。
在s2处,E8F6代表向前跳转到S1处。
当将E8F6拷贝到s处,向前跳转10个字节,即跳转到mov ax, 4c00h指令处。
(3)
完成指令拷贝后,
程序顺序执行到标号s0处,
然后跳转到s处,
然后继续跳转到
mov ax, 4c00h
int 21h
程序正确返回。 |