汇编网首页登录博客注册
hygf99的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
文章收藏
友情链接

[2010-01-18 19:11] 《汇编语言》第三章实验2

(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号单元的变化,是巧合还是另有隐情?恳请路过的老师解惑。
评论次数(9)  |  浏览次数(1745)  |  类型(汇编作业) |  收藏此文  | 

[  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  ]

你他妈真是天才

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码