分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这种结果?
通过这个程序加深对相关内容的理解。
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0 ;ax=0
s: nop ;占一字节,机器码90
nop ;占一字节,机器码90
mov di,offset s ;(di)=s偏移地址
mov si,offset s2 ;(si)=s2偏移地址
mov ax,cs:[si] ;(ax)=jmp short s1指令对应的机器码EBF6偏移地址
mov cs:[di],ax ;jmp short s1覆盖s处指令2条nop指令
s0: jmp short s ;执行s0, 直接跳回mov ax,4c00h了
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
调试:
当指令执行到s0:jmp short s时,该指令得到执行,编译器算出的ip位移量为8-18h=-16(补码F0),(ip)=(ip)+位移量=18h+(-16)=8,cs:8指向s;
当指令执行到s标段jmp命令时,第1个字节中的机器码为EBF6,给出的ip位移量为-10(补码F6),(ip)=(ip)+位移量=ah+(-10)=0,cs:0指向第一条指令。