高手们帮忙看看,一道汇编语言的考试题

以下debug的结果是多少:
C>DEBUG EXAM.EXT
-U
OB47:0000 B8470B MOV AX, 0B47
0B47:0003 8ED8 MOV DS, AX
0B47:0005 A10500 MOV AX, [0005]
OB47:0008 3B060700 CMP AX, [0007]
0B47:000C 7F03 JG 0011
0B47:000E A10700 MOV AX, [0007]
OB47:0011 A30900 MOV [0009], AX
0B47:0014 CC INT 3
0B47:0015 00800090 ADD [BX+SI+9000], AL
OB47:0019 0000 ADD [BX+SI], AL
0B47:001B C404 LES AX, [SI]
0B47:001D 8A4680 MOV AL, [BP-80]
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
EX=0B37 DS=0B48 SS=0B47 CS=0B47 IP=0005 NV UP EI PL NZ NA PO NC
-G
AX=( ) IP=( ) OF=( ) CF=( )

这题首先是U命令看代码,然后R命令看寄存器,最后是G命令执行代码,不可以用T命令验证答案,因为代码中有一个断点,用T命令只会跳过断点,下面是分析.
>DEBUG EXAM.EXT
-U
OB47:0000 B8470B MOV AX, 0B47 ;AX=0B47
0B47:0003 8ED8 MOV DS, AX ;DS=0B47
0B47:0005 A10500 MOV AX, [0005] ;AX=05A1
OB47:0008 3B060700 CMP AX, [0007] ;AX=05A1,DS:[0007]=3B00,执行后OF=0,CF=1
0B47:000C 7F03 JG 0011 ;有符号比较,大于跳,05A1小于3B00所以不跳
0B47:000E A10700 MOV AX, [0007] ;AX=3B00
OB47:0011 A30900 MOV [0009], AX ;DS:[0009]=3B00
0B47:0014 CC INT 3 ;这是一个断点,执行G命令后,到这里就断下来了.
0B47:0015 00800090 ADD [BX+SI+9000], AL
OB47:0019 0000 ADD [BX+SI], AL
0B47:001B C404 LES AX, [SI]
0B47:001D 8A4680 MOV AL, [BP-80]
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
EX=0B37 DS=0B48 SS=0B47 CS=0B47 IP=0005 NV UP EI PL NZ NA PO NC
-G
最后答案 AX=(3B00) IP=(0014) OF=(0) CF=(1)追问

0B47:0005 A10500 MOV AX, [0005] ;AX=05A1
OB47:0008 3B060700 CMP AX, [0007] ;AX=05A1,DS:[0007]=3B00,执行后OF=0,CF=1
我就是在这不太明白:为什么AX=05A1 ,DS:[0007]=3B00呢?
希望高手给我讲一讲(我会给你追加20分的),谢谢了!

追答

0B47:0005 A10500 MOV AX, [0005]
OB47:0008 3B060700 CMP AX, [0007]
这两条不要看指令 把他当成数据 那么在内存中就是
0B47:0005=A1
0B47:0006=05
0B47:0007=00
0B47:0008=3B
0B47:0009=06
0B47:0010=07
0B47:0011=00
那么很显然DS:[0005]=05A1,DS:[0007]=3B00

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-08
执行T命令,可以看到执行每一条命令之后寄存器的值。
相似回答