不多说,直接上程序
程序示例
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
- 程序执行效果:最终正确return,效果如图
程序运行分析
需要了解的知识点
- jmp short xxx最终会被编译成
jmp 具体数值
,具体数值的范围为[-128,127] - nop无意义,占一个字节
我们来看其中一小段
s1:
mov ax,0
int 21h
mov ax,0
s2:
jmp short s1
nop
jmp short s1
最终被翻译成:EBF6
,其中EB表示jmp,F6(此为补码)即为-10,即向前jmp 10个字节地址,也就是代码中的mov ax,0
.
而,
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
mov cs:[di],ax
将s2的jmp short s1
(也就是EBF6
)写入了s开头的两个nop中,而在程序执行到s0中的jmp short s
时,将执行插入的EBF6
,又跳转到了mov ax,4c00h
,然后程序结束.