问:以下代码,程序为什么能正常结束?
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
执行s部分后,s改写后为:
jmp s-8
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
所以 jmp short s 再执行s 的时候就跳到cs:0000的位置,也就是
mov ax,4c00h
int 21
所以会正常结束。
知识点是:转移指令是在编译的时候变成相对偏移地址,这里EBF6是从s2里跳到s1的时候是反向跳8个字节的意思。
同一个表示跳转的命令代码EBF6在
s2:
jmp short s1
nop
中是jmp short s1
而在
s:
jmp 0000
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
时是jmp 0000