监测点3.2 第一问:补全程序,使其可以将10000~1000F中的8个字逆序拷贝到20000~2000F中。
下面是我在自己的机器上进行测试的过程,最后CS在我没有修改的情况下改变了,造成测试失败。我想知道为什么我没有主动修改CS,CS值在没有执行完我指定的命令后就改变?
-r //各个寄存器的初始状态
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B21 ES=0B21 SS=0B21 CS=0B21 IP=0100 NV UP EI PL NZ NA PO NC
0B21:0100 0080FF02 ADD [BX+SI+02FF],AL DS:02FF=C7
-e 1000:0 //在1000:0~1000:F输入1~16
1000:0000 01. 00.2 00.3 00.4 00.5 00.6 00.7 00.8
1000:0008 00.9 00.10 00.11 00.12 00.13 00.14 00.15 00.16
-d 1000:0 f //察看一下输入是否有误
1000:0000 01 02 03 04 05 06 07 08-09 10 11 12 13 14 15 16 ................
-a
0B21:0100 mov ax,1000 //此处我没有特意安排指令在那一块内存,只是按照默认的地址进行输入指令
0B21:0103 mov ds,ax
0B21:0105 mov ax,2000
0B21:0108 mov ss,ax
0B21:010A mov sp,0010
//以上三条指令是我解题的答案,不知道是不是正确的?
0B21:010D push [0]
0B21:0111 push [2]
0B21:0115 push [4]
0B21:0119 push [6]
0B21:011D push [8]
0B21:0121 push [a]
0B21:0125 push [c]
0B21:0129 push [e]
0B21:012D
-t //开始执行指令,此时的CS=0B21。
AX=1000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B21 ES=0B21 SS=0B21 CS=0B21 IP=0103 NV UP EI PL NZ NA PO NC
0B21:0103 8ED8 MOV DS,AX
-t
AX=1000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1000 ES=0B21 SS=0B21 CS=0B21 IP=0105 NV UP EI PL NZ NA PO NC
0B21:0105 B80020 MOV AX,2000
-t //设置栈段指向
AX=2000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1000 ES=0B21 SS=0B21 CS=0B21 IP=0108 NV UP EI PL NZ NA PO NC
0B21:0108 8ED0 MOV SS,AX
-t //设置好栈以后开始压栈,SS=2000
AX=2000 BX=0000 CX=0000 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000
DS=1000 ES=0B21 SS=2000 CS=0B21 IP=010D NV UP EI PL NZ NA PO NC
0B21:010D FF360000 PUSH [0000] DS:0000=0201
-t
AX=2000 BX=0000 CX=0000 DX=0000 SP=000E BP=0000 SI=0000 DI=0000
DS=1000 ES=0B21 SS=2000 CS=0B21 IP=0111 NV UP EI PL NZ NA PO NC
0B21:0111 FF360200 PUSH [0002] DS:0002=0403
-t
AX=2000 BX=0000 CX=0000 DX=0000 SP=000C BP=0000 SI=0000 DI=0000
DS=1000 ES=0B21 SS=2000 CS=0B21 IP=0115 NV UP EI PL NZ NA PO NC
0B21:0115 FF360400 PUSH [0004] DS:0004=0605
-t
AX=2000 BX=0000 CX=0000 DX=0000 SP=000A BP=0000 SI=0000 DI=0000
DS=1000 ES=0B21 SS=2000 CS=0B21 IP=0119 NV UP EI PL NZ NA PO NC
0B21:0119 FF360600 PUSH [0006] DS:0006=0807
-t
AX=2000 BX=0000 CX=0000 DX=0000 SP=0008 BP=0000 SI=0000 DI=0000
DS=1000 ES=0B21 SS=2000 CS=0B21 IP=011D NV UP EI PL NZ NA PO NC
0B21:011D FF360800 PUSH [0008] DS:0008=1009
-t
AX=2000 BX=0000 CX=0000 DX=0000 SP=0006 BP=0000 SI=0000 DI=0000
DS=1000 ES=0B21 SS=2000 CS=0B21 IP=0121 NV UP EI PL NZ NA PO NC
0B21:0121 FF360A00 PUSH [000A] DS:000A=1211
-t
AX=2000 BX=0000 CX=0000 DX=0000 SP=0004 BP=0000 SI=0000 DI=0000
DS=1000 ES=0B21 SS=2000 CS=0B21 IP=0125 NV UP EI PL NZ NA PO NC
0B21:0125 FF360C00 PUSH [000C] DS:000C=1413
直到此时,CS还是0B21,SP的变化也算正常
-t //执行PUSH [000E]的时候毛病出来了:
C:\windows\system32\debug.exe
NTVDM CPU 遇到无效的指令
CS:0000 IP:012b OP:f0 15 ab 00 f0
我不明白CS的值怎么从0B21变成0000了?这样的话我的指令PUSH [000E]没有被执行。
请高手指点一下。 |