当前位置: 代码迷 >> 汇编语言 >> 王爽 编译语言第二版 实验8 代码详细分析
  详细解决方案

王爽 编译语言第二版 实验8 代码详细分析

热度:2486   发布时间:2013-02-26 00:00:00.0
王爽 汇编语言第二版 实验8 代码详细分析

代码在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


  相关解决方案