;王爽老师《汇编语言》第二版程序分析,P187页
;用DEBUG装载《第九章:实验八 分析一个奇怪的程序》
;装入程序尚未运行的反汇编展现
-r
AX=0000 BX=0000 CX=0072 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=217C ES=217C SS=218C CS=2191 IP=0004 NV UP EI PL NZ NA PO NC
2191:0004 B80000 MOV AX,0000
-u 2191:0000 0022
2191:0000 B44C MOV AH,4C
2191:0002 CD21 INT 21
start: 2191:0004 B80000 MOV AX,0000
s: 2191:0007 90 NOP
2191:0008 90 NOP
2191:0009 BF0700 MOV DI,0007 ;取s的偏移地址放入DI中
2191:000C BE1F00 MOV SI,001F ;取s2的偏移地址放入SI中
2191:000F 2E CS:
2191:0010 8B04 MOV AX,[SI] ;把偏移地址[001F]的代码‘EBF6’放入AX中
2191:0012 2E CS:
2191:0013 8905 MOV [DI],AX ;偏移地址[0007]中放入了‘EBF6’,代替了原先的两个‘NOP’代码‘90’
s0: 2191:0015 EBF0 JMP 0007 ;程序跳转到s处
s1: 2191:0017 B80000 MOV AX,0000
2191:001A CD21 INT 21
2191:001C B80000 MOV AX,0000
s2: 2191:001F EBF6 JMP 0017
2191:0021 90 NOP
;在DEBUG下装入并单步运行该程序,但是不要执行完,执行到s0处即可,再反汇编看下
-u 2191:0000 0022
2191:0000 B44C MOV AH,4C
2191:0002 CD21 INT 21
start: 2191:0004 B80000 MOV AX,0000
s: 2191:0007 EBF6 JMP FFFF ;当跳转到这里要执行的时候,IP预取下一条指令,所以IP=0009
2191:0009 BF0700 MOV DI,0007
2191:000C BE1F00 MOV SI,001F
2191:000F 2E CS:
2191:0010 8B04 MOV AX,[SI]
2191:0012 2E CS:
2191:0013 8905 MOV [DI],AX
s0: 2191:0015 EBF0 JMP 0007
s1: 2191:0017 B80000 MOV AX,0000
2191:001A CD21 INT 21
2191:001C B80000 MOV AX,0000
s2: 2191:001F EBF6 JMP 0017
2191:0021 90 NOP
;上面s:处的‘2191:0007 EBF6 JMP FFFF’,JMP的跳转并不是0,而是FFFF,如何计算的喃:首先IP=0009,其次相对偏移为F6
;则跳转的真实地址:IP=0009+F6=FF(F6是-10的补码,和09相加后是-1,-1的补码就是FF)
;为什么我们看到的是JMP FFFF而不是JMP FF,这可能是编译处理的结果。
;分析下来,程序应该不能正常执行,但王爽老师的真实含义应该是能跳转到CS:0处执行退出。
;若要正常能结束,我认为应该在start:的前面增加一条‘NOP’指令就可以了,大家可以试下,有错拍砖。 |