这个题目比较古怪.又卡了半天.最后分析如下:
-r
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=0005 NV UP EI PL NZ NA PO NC
0BF4:0005 B80000 MOV AX,0000
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=0008 NV UP EI PL NZ NA PO NC
0BF4:0008 90 NOP
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=0009 NV UP EI PL NZ NA PO NC
0BF4:0009 90 NOP
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=000A NV UP EI PL NZ NA PO NC
0BF4:000A BF0800 MOV DI,0008
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0008
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=000D NV UP EI PL NZ NA PO NC
0BF4:000D BE2000 MOV SI,0020
-t
AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=0010 NV UP EI PL NZ NA PO NC
0BF4:0010 2E CS:
0BF4:0011 8B04 MOV AX,[SI] CS:0020=F6EB
-t
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=0013 NV UP EI PL NZ NA PO NC
0BF4:0013 2E CS:
0BF4:0014 8905 MOV [DI],AX CS:0008=9090
-t
AX=F6EB BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0020 DI=0008
DS=0BE4 ES=0BE4 SS=0BF4 CS=0BF4 IP=0016 NV UP EI PL NZ NA PO NC
0BF4:0016 EBF0 JMP 0008
程序中
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
就是把s2处的内容复制到s处了.我们一步步走下来,到
s0:jmp short s 可以发现.debug里面的代码是
0BF4:0016 EBF0 JMP 0008
也就是跳到0008所在的地方.我们查看下0008的地方是什么.
-u 0bf4:0
0BF4:0000 B8004C MOV AX,4C00
0BF4:0003 CD21 INT 21
0BF4:0005 B80000 MOV AX,0000
0BF4:0008 EBF6 JMP 0000
0BF4:000A BF0800 MOV DI,0008
0BF4:000D BE2000 MOV SI,0020
0BF4:0010 2E CS:
0BF4:0011 8B04 MOV AX,[SI]
0BF4:0013 2E CS:
0BF4:0014 8905 MOV [DI],AX
0BF4:0016 EBF0 JMP 0008
0BF4:0018 B80000 MOV AX,0000
0BF4:001B CD21 INT 21
0BF4:001D B80000 MOV AX,0000
可以看到0008处的代码是jmp 0000.机器代码是EBF6.
其实这个ebf6就是刚才那四句话复制来的.也就是这个:
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s2处的内容复制到s处.而s2处的内容正好是EBF6,所以导致程序到了s处的时候会执行EBF6这个机器码.这个机器码翻译为汇编语言就是
JMP 0000,EBF6前面的EB是JMP的机器码.后面的F6是JMP的位移.F6是负数10的补码形式.所以这个EBF6的作用就是跳到ip=ip-10=0的地方.也就跳到了0BF4:0000 B8004C MOV AX,4C00,从而程序正常结束了.
- [游客] 过程的回味真是无穷! 08/05 17:57
- [kingwrcy] 多谢提示.已经过去接近4个月了.由于工作原因,汇编一直没碰了.哎.准备重新温习下. 07/31 15:09
- [younggay] 分析没有问题。加油! 04/15 16:43
- [younggay] 回答正确。 04/15 16:41
- [游客] 不知道为什么用c做code段老是报错.改成才c1就可以了.莫名其妙 我用的编辑器是masmp 04/15 15:48
- [游客] 嗯,说的很对。这里的栈操作就是一个一个的完成数据移送。 04/15 15:44
- [游客] 刚开始是这样的,弄得慢没关系,只要你努力,总会有结果的。思维是锻炼出来的,经过这程序,再有类似的思维 04/15 11:29
- [游客] 得到别人的技术,不如学会别人的思维方式。从自己参考别人的代码过程,要反思自己思维上的不足。 完 04/15 11:25
- [游客] 嗯。分析的很正确。 注意体会jmp的执行原理。 04/15 11:21
- [游客] 调程序,尤其是汇编程序,耐心是必备的。 04/15 09:37
[ 游客 发表于 2009-04-15 11:21 ]
嗯。分析的很正确。
注意体会jmp的执行原理。