assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start:
mov ax,0
s:
nop ;现在还没有用,一会将被覆盖。
nop
mov di,offset s ;把标号s的偏移地址赋给di
mov si,offset s2 ;把标号s2的偏移地址赋给si
mov ax,cs:[si] ;[si]是s2的偏移地址,该语句把标号s2
;处的语句jmp short s1(机器码:EBF6)
;赋给了ax。
mov cs:[di],ax ;[di]是s的偏移地址,把寄存器ax中的数
;据EBF6赋给cs:[di],呵呵,看到了吧:
;标号s处的两个nop被覆盖了。
s0:
jmp short s ;现在跳到标号s处,从标号s处执行程序。
;注意,标号s处的内容已被改变为EBF6。
......
......
貌似现在要转到标号s处执行jmp short s1语句,这样看来,又要跳到标号s1去了(头晕眼花了吧)。可这是汇编语句,实际计算机要执行的是机器码:EBF6,计算机在编译时计算好了位移,它可不会再次跳到S1处,要警惕呀,别被王爽老师忽悠了。
执行EBF6,看出来了吧,程序要位移F6位,F6为10进制的246,不符合短转移的-128~+127要求,因此只能是负数。256-246=10,所以要向后(执行了EBF6后)位移10个IP。数数IP吧,它将跳到mov ax,4c00h语句。
上机实验,呵呵.....正确。