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

我的博客

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

[2008-07-06 13:31] 第二章实验内容结果(终于将所有实验内容全部实验了一下)

(1)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。
-a 1000:0<enter> (对了,这里的CS和IP值是自己随意选的,选择不同,后面的CS和IP值也不同)
1000:0000 mov ax,4E20(注意H应略掉)<enter>
1000:0003 add ax,1416<enter>
1000:0006 mov bx,2000<enter>
1000:0009 add ax,bx<enter>
1000:000B mov bx,ax<enter>
1000:000D add ax,bx<enter>
1000:000F mov ax,001A<enter>
1000:0012 mov bx,0026<enter>
1000:0015 add al,bl<enter>
1000:0017 add ah,bl<enter>
1000:0019 add bh,al<enter>
1000:001B mov ah,0<enter>
1000:001D add al,bl<enter>
1000:001F add al,9c<enter>
1000:0021<enter>
    接着输入-t命令时,输入一次,执行一步。在此不对所有CPU寄存器存储的内容一一列出,而只列出相关寄存器的内容。每次执行时根据CS×16+IP算出内存单元的物理地址,从而从内存中取出指令并修改IP(便于取下一条指令),再执行指令。
    为了使得以上指令得以执行必须更改当前的CS和IP,使得它们指向这段程序的起始处,即1000:0000。
-r cs<enter>
CS 139C(我这边是139C,不同机器这个可以是不同的)
:1000<enter>
-r ip<enter>
IP 0102(我这边是0102,不同机器这个可以是不同的)
:0000<enter>
即可完成修改。
注意IP是在从内存取好一条指令后,就修改IP值,再执行指令,下面的每步操作中,就不再一一说明。
-t<enter>(执行第一条指令,即mov ax,4E20)
AX=4E20 BX=0000 CS=1000 IP=0003(IP=IP+3=0000+3=0003)
-t<enter>(执行第二条指令,即add ax,1416)
AX=6236 BX=0000 CS=1000 IP=0006(IP=IP+3=0003+3=0006)
-t<enter>(执行第三条指令,mov bx,2000)
AX=6236 BX=2000 CS=1000 IP=0009(IP=IP+3=0006+3=0009)
-t<enter>(执行第四条指令,add ax,bx)
AX=8236 BX=2000 CS=1000 IP=000B(IP=IP+2=0009+2=000B)
-t<enter>(执行第五条指令,mov bx,ax)
AX=8236 BX=8236 CS=1000 IP=000D(IP=IP+2=000B+2=000D)
-t<enter>(执行第六条指令,add ax,bx)
AX=046C BX=8236 CS=1000 IP=000F(IP=IP+2=000D+2=000F)
-t<enter>(执行第七条指令,mov ax,001a)
AX=001A BX=8236 CS=1000 IP=0012(IP=IP+3=000F+3=0012)
-t<enter>(执行第八条指令,mov bx,0026)
AX=001A BX=0026 CS=1000 IP=0015(IP=IP+3=0012+3=0015)
-t<enter>(执行第九条指令,add al,bl)
AX=0040 BX=0026 CS=1000 IP=0017(IP=IP+2=0015+2=0017)
-t<enter>(执行第十条指令,add ah,bl)
AX=2640 BX=0026 CS=1000 IP=0019(IP=IP+2=0019)
-t<enter>(执行第十一条指令,add bh,al)
AX=2640 BX=4026 CS=1000 IP=001B(IP=IP+2=0019+2=001B)
-t<enter>(执行第十二条指令,mov ah,0)
AX=0040 BX=4026 CS=1000 IP=001D(IP=IP+2=001B+2=001D)
-t<enter>(执行第十三条指令,add al,bl)
AX=0066 BX=4026 CS=1000 IP=001F(IP=IP+2=001D+2=001F)
-t<enter>(执行第十四条指令,亦即最后一条指令,add al,9c)
AX=0002 BX=4026 CS=1000 IP=0021(IP=IP+2=001F+2=0021)

(2)将下面三条指令写入从2000:0开始的内存单元中,利用这三条指令计算2的8次方。
-a 2000:0<enter>
2000:0000 mov ax,1<enter>
2000:0003 add ax,ax<enter>
2000:0005 jmp 2000:0003<enter>
2000:0007<enter>
输完指令后,用-t执行指令。
首先分析一下。2^8=2^7+2^7,2^7=2^6+2^6,2^6=2^5+2^5,
2^5=2^4+2^4,2^4=2^3+2^3,2^3=2^2+2^2,2^2=2+2,2=1+1.可知单就add ax,ax指令就要执行8次。另外,第二条指令与第三条指令形成一个类似递归函数的功能,即执行完add ax,ax后,CS:IP指向2000:0005,取出jmp 2000:0003后,IP=0007,执行完jmp 2000:0003后,CS仍然是2000,但IP得以修改,IP=0003,故CS:IP重新指向2000:0003,从而形成一个循环。整个程序执行如下:
先修改CS和IP的值,使之指向2000:0000
-r cs<enter>
CS 139C
:2000<enter>
-r ip<enter>
IP 0100
:0000<enter>
接着便开始-t开始执行指令了。注意IP是在从内存取好一条指令后,就修改IP值,再执行指令,其中若是遇上jmp等指令,在执行的过程中IP值也可能会发生改变。下面的每步操作中,就不再一一说明。
-t<enter><第一步,给AX赋值,执行mov ax,1>
AX=0001 CS=2000 IP=0003(IP=IP+3=0000+3=0003)
-t<enter><第二步,AX内容自己相加,同时也是开始进入循环,add ax,ax>
AX=AX+AX=0001+0001=0002 CS=2000 IP=0005(IP=IP+2=0003+2=0005)
-t<enter><第三步,执行转移指令,跳入第二步,jmp 2000:0003>
AX=0002 CS=2000 IP=0003(注意其实IP在第三步是经过两次变化的,首先取出jmp 2000:0003后,IP自动加2,变为0007,执行jmp 2000:0003后,IP值被修改,为0003,以下同,不一一指出)
-t<enter>(经第三步后,跳入第二步)
AX=AX+AX=0002+0002=0004 CS=2000 IP=0005(IP=IP+2=0003+2=0005)
-t<enter>(执行完后进入第三步)
AX=0004 CS=2000 IP=0003
-t<enter>(经第三步后,跳入第二步)
AX=AX+AX=0004+0004=0008 CS=2000 IP=0005
-t<enter>(执行完后进入第三步)
AX=0008 CS=2000 IP=0003
-t<enter>(经第三步后,跳入第二步)
AX=AX+AX=0008+0008=0010 CS=2000 IP=0005
-t<enter>(执行完后进入第三步)
AX=0010 CS=2000 IP=0003
-t<enter>(经第三步后,跳入第二步)
AX=AX+AX=0010+0010=0020 CS=2000 IP=0005
-t<enter>(执行完后进入第三步)
AX=0020 CS=2000 IP=0003
-t<enter>(经第三步后,跳入第二步)
AX=AX+AX=0020+0020=0040 CS=2000 IP=0005
-t<enter>(执行完后进入第三步)
AX=0040 CS=2000 IP=0003
-t<enter>(经第三步后,跳入第二步)
AX=AX+AX=0040+0040=0080 CS=2000 IP=0005
-t<enter>(执行完后进入第三步)
AX=0080 CS=2000 IP=0003
-t<enter>(经第三步后,跳入第二步)
AX=AX+AX=0080+0080=0100 CS=2000 IP=0005
-t<enter>(执行完后进入第三步)
AX=0100 CS=2000 IP=0003
由于0100H=1×16×16=2^8=256D。所以计算到此为止。

(3)查看内存中的内容
-d FFF0:0000 00FF<enter>
其中FFF0:0000一直到FFF0:00E0省略掉,因为内容中不含日期。
在FFF0:00F0 EA 5B E0 00 F0 30 38 2F-33 2F 30 36 00 FC 00 .[...08/30/06...
更改FFF0:00F5至FFF0:00FC中的内容。
-e FFF0:00F5 78 98 ec 34 12 09 a8 01<enter>
-d FFF0:00F0 00FF<enter>
FFF0:00F0 EA 5B E0 00 F0 30 38 2F-33 2F 30 36 00 FC 00,发现没有任何变化。即该储存器属于ROM。查看第一章1.15,也是这样的。

(4)向内存从B8100H开始的单元中填写数据,如:
-e B810:0000 01 01 02 02 03 03 04 04<enter>
-d B810:0 f<enter>
B810:0000 31 07 20 07 30 07 31 07-20 07 31 07 30 07 20 07
更改-e后面输入的数据,
-e B810:0000 02 01 03 0e 04 05 87 03<enter>
-d B810:0 f<enter>
B810:0000 20 07 20 07 20 07 20 07-20 07 20 07 20 07
再次更改-e后面的数据,
-e B810:0000 88 82 91 93 84 83 78 63<enter>
-d B810:0 f<enter>
B810:0000 46 07 20 07 41 07 34 07-20 07 46 07 30 07 20 07
即当-e后面的数据发生改变时,-d查看内存中的数据也发生了变化,说明该内存属于RAM。翻到第一章1.15时的确这样,只不过更准确的说,是显卡的RAM。显卡RAM的逻辑内存空间地址范围为A0000-BFFFF.
明显,B810:0000-B810:000F都处于这个空间。
评论次数(6)  |  浏览次数(1023)  |  类型(汇编作业) |  收藏此文  | 

[  deepblue   发表于  2008-07-06 14:50  ]

是显示存储的逻辑存储空间,但是是不是就是显卡的ram ,I don't know:)

[  towersimper   发表于  2008-07-06 20:51  ]

我个人觉得肯定是有区别的。首先显卡的RAM是一个存储器,是一个物理器件。而显卡RAM的逻辑内存地址空间是一个实际不存在的,所以说是逻辑的,而不说物理内存空间。所谓内存存储器逻辑地址空间是为了便于管理内存存储器,将主机上各个独立的RAM和ROM,在逻辑上构成一个统一的地址空间,并且给每个RAM和ROM分配一段地址空间。

[  asm_sande   发表于  2008-07-07 08:34  ]

嗯,对2.4的分析有道理,学习了。
同时:我认为E命令不可更改这段地址的值,却能促动地址内值的异动,也只能说明这段地址内存是RAM,而非只读的ROM。因为我们用的不是8086CPU,只为在WINDOWSE下的模拟,因此,这里也只能理解为逻辑上的显卡RAM内存地址空间。

[  游客   发表于  2009-04-06 17:50  ]

恩,学习了!
分析的很好!

[  游客   发表于  2010-10-03 22:43  ]

问一下,我们如何判断e写入的是数据还是指令呢?

[  towersimper   发表于  2010-10-22 16:57  ]

这就看是CS:IP指向的还是DS:偏移地址指向,若是前者是指令,若是后者是数据。即指令和数据都是二进制形式存储在内存中,二者没有本质区别,就看读取是CS:IP指向的还是DS:偏移地址指向。如此而已。

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