assume cs:code

code 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//把s2处的两个字节传到s处 即把jmp short s1传到s处

s0:jmp short s

s1:mov ax,0
int 21h
mov ax,0

 s2:jmp short s1
 nop

code ends
end start

 

问题奇怪的是执行程序过程中 当执行到jmp short s处 dos显示 jmp 0008 只是没问题的 但再执行 即此时已经传过来的jmp short s1时

dos显示 jmp 0000 有没有搞错? s1明明在下面好不好!

 

解释:内部传过来的不是Jmp short s1而是其对应的ASCII码 而根据jmp short的内部转移机制 其ascii码代表的是其相对当下地址的转移地址(也是因为该原因 只能在一个字节内转移 且只需2个字节就能储存完(其中一个字节表示偏移量 一个表示jmp)) 故真正转移过来的代码 代表的意思是向上偏移8个字节(根据原来jmp short s1跳到s1算出的) 此时cp=8 故jmp 0000了