程序如下所示
assume cs:codesg
codesg 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
s0:jmp short s
s1:mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
在这里就简单分析下,jmp指令的跳转情况
指令真正开始执行是在start处,然后mov di,offset s 代表的就是把标号s处的偏移地址给了di,然后mov si,offset s2 得到的就是标号s2处的偏移地址,对于mov ax,cs:[si]其实就是将s2的指令的jmp short s1给了ax,其实给的就是其对应的机器码,其实就是相当于给的是 向前 s1-s2这个指令,我们先看看s1-s2相差多少,这里其实就是相差8,这里再提一下nop指令的作用,这个指令其实就是什么都不做的指令,其实就是一个空指令,但是会占用一个指令的时间
所以在执行到s0: jmp short s处的时候会跳到s处
s处会执行的其实就是把ip寄存器的值移到mov ax 4c00h对应的起始地址,s处的地址和mov ax 4c00h之间相差了8