代码在debug中对应机器指令如下:
C:\DOCUME~1\ADMINI~1>debug e:\code\testJmp.exe-U0C16:0005 B80000 MOV AX,00000C16:0008 90 NOP0C16:0009 90 NOP0C16:000A BF0800 MOV DI,00080C16:000D BE2000 MOV SI,00200C16:0010 2E CS:0C16:0011 8B04 MOV AX,[SI]0C16:0013 2E CS:0C16:0014 8905 MOV [DI],AX0C16:0016 EBF0 JMP 00080C16:0018 B80000 MOV AX,00000C16:001B CD21 INT 210C16:001D B80000 MOV AX,00000C16:0020 EBF6 JMP 00180C16:0022 90 NOP0C16:0023 B206 MOV DL,06-
代码分析如下:
assume cs:codesg ;实验8主要考察对jmp本质含义的理解:跳转相对位移codesg segment mov ax,4c00h int 21h start: ;程序入口处 mov ax,0s: 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 endsend start