;分析下面这个代码的骚操作,看看能能否成功返回。
assume cs:code
code segment
mov ax,4c00h
int 21h
start: mov ax,0 ;程序将从这里开始执行
s: nop ;nop什么都不干,但是它需要1个时钟周期。
nop
mov di,offset s ;di指向s这个位置
mov si,offset s2 ;si指向s2这个位置
mov ax,cs:[si] ;
mov cs:[di],ax ;把jmp short s1指令放在s这个位置,取代两个nop操作。指令意义不变,仍旧是向前跳8个字节。
s0: jmp short s ;跳到标号s处,然后在向前跳8个字节,就到了mov ax,4c00h处,成功返回。
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1 ;由于短跳转是基于IP的偏移,而不是绝对地址。这里的意思是向前跳8字节。
nop
code ends
end start
这个程序能成功返回。结果如下图: