汗 一开始还以为是死循环呢,后来DEBUG了下发现能正常返回,可是自己琢磨的又不对然后查看论坛才知道了为什么会正常返回了。说下小弟的理解
assume cs:codesg
codesg segment
mov ax,4c00H
int 21H
start:
0B55:0005 mov ax,0
:0008 s: nop(通过复制这时0008就变成了EBF6,其内容是jmp short s1,因为short是8位位移,
:0009 nop 所以,不予考试s1. F6就是8位位移的位置,用补码计算也就是是-10.这时候IP的指向指的是000A{不明白为什么指向000A的看下P179页}。而jmp short 标记功能为:IP=IP+8位位移。 也就是说A+ -10那IP地址是0所以也就指向了mov ax,4c00H)
:000A mov di,offset s
mov si,offset s2 (把S2里面的数据EBF6复制给SI)
mov ax,cs:[si] (把SI内容复制给ax)
mov cs:[di],ax (把ax内容复制给DI,因为DI默认是指向S:的,而且一个nop占用一个字节,就把s2:处jmp short s1拷贝到s处,即覆盖2个nop(正好2个字节))
s0: jmp short s (把IP地址指向S处)
s1:
mov ax,0
int 21H
mov ax,0
s2:
jmp short s1
nop
codesg ends
end start |