代码在debug中对应机器指令如下:
C:\DOCUME~1\ADMINI~1>debug e:\code\testJmp.exe
-U
0C16:0005 B80000 MOV AX,0000
0C16:0008 90 NOP
0C16:0009 90 NOP
0C16:000A BF0800 MOV DI,0008
0C16:000D BE2000 MOV SI,0020
0C16:0010 2E CS:
0C16:0011 8B04 MOV AX,[SI]
0C16:0013 2E CS:
0C16:0014 8905 MOV [DI],AX
0C16:0016 EBF0 JMP 0008
0C16:0018 B80000 MOV AX,0000
0C16:001B CD21 INT 21
0C16:001D B80000 MOV AX,0000
0C16:0020 EBF6 JMP 0018
0C16:0022 90 NOP
0C16:0023 B206 MOV DL,06
-
代码分析如下:
assume cs:codesg ;实验8主要考察对jmp本质含义的理解:跳转相对位移
codesg segment
mov ax,4c00h
int 21h
start: ;程序入口处
mov ax,0
s:
nop ;nop指令占一个字节
nop
mov di,offset s ;di 指向标号s的偏移地址
mov si,offset s2 ;si 指向标号s2的偏移地址
mov ax,cs:[si] ;将CS:[SI]即s2处的指令存储到ax中 ,也就是jmp short s1,就我这次运行过程而言,对应机器指令:EBF6,
;机器指令EBF6解释:EB即jmp,F6(1111 0110 )最高位为1,表示往回跳,
;(看s1发现,实际就是往前跳两条mov指令+一条int 21h指令),
mov cs:[di],ax ;将ax处存储的指令EBF6存储到cs:[di]即标号s的起始处,覆盖掉两个nop(两个字节),
;需要明白EBF6的本质含义是往回前跳三条指令(两条mov+ 一条int),而不是如s2中表面显示的jmp s1,
;实际这时是jmp到 codesg 段的起始处:mov ax,4c00h
s0:
jmp short s ;至此,跳回s,首先执行s起始处的EBF6,程序往前跳三条指令,依次执行mov ax,4c00h int 21h,程序正常结束,退出
s1:
mov ax,0
int 21h
mov ax,0
s2:
jmp short s1
nop
codesg ends
end start