(1)使用DEBUG,将上面的程序写入内存,逐条执行,根据指令执行后的实际运行情况填空。
MOV AX,FFFF
MOV DS,AX
MOV AX,2200
MOV SS,AX
MOV SP,0100
MOV AX,[0] ;AX=(5BEA)
ADD AX,[2] ;AX=(5CCA)
MOV BX,[4] ;BX=(30F0)
ADD BX,[6] ;BX=(6029)
PUSH AX ;SP=(00FE);修改的内存单元的地址是(2200:00FE)内容为(5CCA)
PUSH BX ;SP=(00FC);修改的内存单元的地址是(2200:00FC)内容为(6929)
POP AX ;SP=(00FE);AX=(6029)
POP BX ;SP=(0100);BX=(5CCA)
PUSH [4] ;SP=(00FE);修改的内存单元的地址是(2200:00FE)内容为(30F0)
PUSH [6] ;SP=(00FC);修改的内存单元的地址是(2200:00FC)内容为(2F39)
(2)仔细观察图3.19中的实验过程,然后分析:为什么2000:0-2000:F中的内容会发生改变?
贴出文字代图:
C:\DEBUG
-A
0B39:0100 MOV AX,2000
0B39:0103 MOV SS,AX
0B39:0105 MOV SP,10
0B39:0108 MOV AX,3123
0B39:010B PUSH AX
0B39:010C MOV AX,3366
0B39:010F PUSH AX
0B39:0110
-E 2000:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-D 2000:0 F
2000:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 ................
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B39 ES=0B39 SS=0B39 CS=0B39 IP=0100 NV UP EI PL NZ NA PO NC
0B39:0100 B80020 MOV AX,2000
-T
AX=2000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B39 ES=0B39 SS=0B39 CS=0B39 IP=0103 NV UP EI PL NZ NA PO NC
0B39:0000 8ED0 MOV SS,AX
-T
AX=2000 BX=0000 CX=0000 DX=0000 SP=0010 BP=0000 SI=0000 DI=0000
DS=0B39 ES=0B39 SS=2000 CS=0B39 IP=0108 NV UP EI PL NZ NA PO NC
0B39:0108 B82331 MOV AX,3123
-D 2000:0 F
2000:0000 00 00 00 00 00 00 00 20-00 00 08 01 39 0B 5D 05 ....... ....9.].
-
为什么2000:0-2000:F中的内容会改变?
我们用了两次T命令,共执行了三条指令:
MOV AX,2000
MOV SS,AX ;把2000H放入SS
MOV SP,10 ;SP设为10
在第一次使用T命令后,我用D查看了2000:0的后16个单元的内容,发现并没有改变。那肯定就是第二次使用T命令的时候改变的了,但是这次关系到了SS,DUBUG连下一条命令也执行了。那究竟是哪条指令改变了内存中的值呢?我的办法是,将第三条指令重写,换成一个不相干的指令(比如MOV AX,0),将2000:0处的内容用E命令重写为0。T命令执行然后我再查看2000:0后的16个单元内容,发现已经改变了。but,跟第一次不太一样,如果不信你就自己试试。为什么改变SS的值就会向内存中写入数据呢?
我实在是考虑不出来了,还是看看答案上怎么说的吧!不要说我作弊,我真的是不知道了,下次我一定好好学习,真的。
答案上讲的是:
因为用T指令进行调试时,会产生中断。而为了保护现场,CPU则先将标志寄存器进栈、再把当前CS的值进栈,最后将IP的值进栈。<关于中断的详细内容的讨论不在此题范围>
真是很好很强大,打死我也想不出是为了保护现场啊,真是汗颜啊,没脸面见父老乡亲了!!!
BUT,还有一个问题,那就是当我将MOV SS,AX和MOV SP,0010放到一起执行时,2000:0处的内容是这样的
2000:0000 00 00 00 00 00 00 00 20-00 00 08 01 39 0B 5D 05 ....... ....9.].
但是如果将他们分开执行,就是在他们之间加几条无关的指令,当再执行到MOV SP,0010的时候,则是
2000:0000 00 00 00 00 00 00 00 00-00 00 08 01 39 0B 5D 05 ............9.].
也就是8号单元的变化,是巧合还是另有隐情?恳请路过的老师解惑。
- [lai-52sora] +瀨52sora饑渴淫蕩人妻求幹 03/12 00:39
- [lai-52sora] +瀨52sora饑渴淫蕩人妻求幹 03/12 00:39
- [lai-52sora] +瀨52sora饑渴淫蕩人妻求幹 +瀨52sora饑渴淫蕩人妻求幹 +瀨52sora饑渴淫蕩人妻 03/12 00:38
- [lai-52sora] +瀨52sora饑渴淫蕩人妻求幹 03/12 00:38
- [lai-52sora] +瀨52sora饑渴淫蕩人妻求幹 03/12 00:38
- [lai-52sora] +瀨52sora饑渴淫蕩人妻求幹 03/12 00:37
- [lai-52sora] +瀨52sora饑渴淫蕩人妻求幹 03/12 00:37
- [lai-52sora] +瀨52sora饑渴淫蕩人妻求幹 03/12 00:37
- [lai-52sora] +瀨52sora饑渴淫蕩人妻求幹 03/12 00:37
- [lai-52sora] +瀨52sora饑渴淫蕩人妻求幹 03/12 00:37
- [游客] 千喜全台外送茶賴ns771《telegram:xd713》 #清純可愛淫蕩少女#升級老司機紅牌妹 05/21 23:58
- [游客] 千喜全台外送茶賴ns771《telegram:xd713》 #清純可愛淫蕩少女#升級老司機紅牌妹 05/21 23:58
- [游客] 千喜全台外送茶賴ns771《telegram:xd713》 #清純可愛淫蕩少女#升級老司機紅牌妹 05/21 23:57
- [游客] 千喜全台外送茶賴ns771《telegram:xd713》 #清純可愛淫蕩少女#升級老司機紅牌妹 05/21 23:57
- [游客] 千喜全台外送茶賴ns771《telegram:xd713》 #清純可愛淫蕩少女#升級老司機紅牌妹 05/21 23:57
- [游客] 千喜全台外送茶賴ns771《telegram:xd713》 #清純可愛淫蕩少女#升級老司機紅牌妹 05/21 23:56
- [游客] 千喜全台外送茶賴ns771《telegram:xd713》 #清純可愛淫蕩少女#升級老司機紅牌妹 05/21 23:56
- [游客] 千喜全台外送茶賴ns771《telegram:xd713》 #清純可愛淫蕩少女#升級老司機紅牌妹 05/21 23:51
- [游客] 千喜全台外送茶賴ns771《telegram:xd713》 #清純可愛淫蕩少女#升級老司機紅牌妹 05/21 23:51
- [游客] 千喜全台外送茶賴ns771《telegram:xd713》 #清純可愛淫蕩少女#升級老司機紅牌妹 05/21 23:51
[ wisji8 发表于 2010-08-25 13:48 ]
我发现的是,当执行ss的时候,2000:0处的数据还是没有改变,但当我执行sp后,那么数据就会改变。我这个执行是在最初打开DEBUG时直接输入代码执行的。
但如果说是在SS时就改变数据的话,那么你一定不是在打开DEBUG后就直接输入代码。你一定一开始先经验后,然后把2000:0处的数据改为0,最后执行到SS处就会发现数据改变。(这点你上面说过)。
其实我不懂得的是,答案上面说的保护现场是为了什么。
[ wisji8 发表于 2010-08-25 13:53 ]
难道中断也是一个程序,当中断时就是调用另一个程序。调用另一个程序前,要把当前的现场进入栈(代码的情况),然后才调用中断。所以就是在执行中断的程序时,中断程序把2000:0地址的数据改了。
哈哈,如果真是这样,我真TM的时天才,被我顿悟出了。
[ 游客 发表于 2011-10-13 20:54 ]
你真他妈的天才
[ 游客 发表于 2011-11-17 13:16 ]
你他妈真是天才