下面是第一次汇编实验的具体内容以及我的收获。

首先,是实验任务的具体操作以及相关说明。

实验任务(1):使用debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化。

具体操作:1)尝试用e命令修改内存单元里的内容,我首先调用了d命令查看原来内存单元的初始内容,接着,调用e命令将内存单元原先的值修改为题中所给的数据。最后再次调用d命令查看此时内存单元中的内容是否发生改变,同时调用u命令查看此时的汇编指令。(在这里我进行修改的内存单元地址就是原先CS:IP指向的地址。)

                                                                             (——调用e命令修改)

                                                                                           (——调用u命令查看汇编指令)

2)尝试用a命令以汇编指令的形式在内存中写入机器指令。首先调用a命令将汇编指令写入,其次,调用t命令单步调试该程序段,最后我调用了d命令查看此时的内存单元里的内容是否发生了相应的改变。

                                                                                                  (——调用a命令写入汇编指令)

                                             ...       

(——调用t命令单步调试该程序段,此处由于单步调试的次数过多,故截图时省略了中间单步调试的过程)

                                                                    (——调用d命令查看此时内存单元内容)

实验任务(2):将下面3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。

具体操作:这里主要考察修改寄存器CS与IP的值。由于语句3 JMP 2000:0003,将IP的值修改为0003,与语句2构成一个循环,此时要计算2的8次方只需要知道要循环多少次即可。同时最后的结果将保存在ax寄存器中。

                                        

                                                                                     (——实现2的8次方)

同时在这里我遇到了一个问题,t命令后面可以直接跟单步执行的次数,我根据单步调试得出计算2的8次方一共需要单步调试16次,然后我就想先调试一次给出CS与IP此时的值后直接连续单步调试15次,就出现了如下的情况:(已经超过了2的8次方,当我连续单步调试10次时方出现2的8次方的值,不知道是为什么?)

                       

                (???question)

实验内容(3):查看内存中的内容。在内存FFF00H~FFFFFH的某几个单元中,找到生产日期并试图改变它。

具体说明:该实验中主要要注意

1)如何将用CS、IP的值指向物理地址。(有多种方法);

2)如何用d命令查看内存中的内容;

3)该段内存地址在8086CPU中具体是哪一块内存地址分配空间。

       

由图可见,试图改变表示日期的内存单元的内容却改不了,这主要和CPU内存地址空间分配的情况有关,

如图所示,在8086CPU机内存地址空间分配中,FFF00H~FFFFFH是各类ROM地址空间,此时向FFF00H~FFFFFH的内存单元中写入数据的操作是无效的,因为这等于只改写只读存储器中的内容。

实验任务(4):向内存从B810H开始的单元中填写数据,观察产生的现象,在改写填写的地址,观察产生的现象。

具体操作:1)首先调用e命令修改内存单元,修改偏移地址为0000,0002,0004,0006的内存单元内容,观察其产生的现象。

2)在此基础上,修改偏移地址为0001,0003,0005,0007的内存单元内容,观察其变化。

3)改变地址,向内存从2000:0开始的单元中填写数据,观察其有何变化。

(——调用e命令修改内存单元的内容)

(——查看修改后从2000:0到2000:0007的内存地址中存放的值)

这与实验任务(3)是一样的原理,只不过在8086CPU机内存地址空间分配中,内存从B810H到BFFFH 是显存地址空间,用e命令修改的是显存,故而会在屏幕上显示出类似爱心,笑脸的图形。根据观察还可以发现,修改偏移地址为0000,0002,0004,0006的内存内容,出现的是图案,当在此基础上修改偏移地址为0001,0003,0005,0007的内存内容,会发生颜色变化。这真是一件神奇的事情!

 

具体的实验操作就是上述的这么多了,接下来说说我的收获与体会。在本次试验中我对于a,d,e,r,u,t等命令有了更深入的认识,其中给我印象最深,也是比较容易出现error的就是t命令、g命令、u命令。由于它们的用法比较多,所以比较容易搞混。下图是debug中的一些命令用法,可以看出调用g,t,p命令时address的前面有等号,其他则没有,在使用时要格外注意这一点。

举例来说,调用t命令时,有3种用法。(1)t后面不带参数,-t即表示从当前CS:IP开始单步调试一次,(2)t后面带参数,-t=2000:0即表示从CS为2000,IP为0的地址开始单步调试一次,(此时即不在默认CS:IP所指地址位置进行调试,若想要让t不带参数,也可以修改CS与IP的值)(3)t后面带参数,-t=2000:0 5即表示从CS为2000,IP为0的地址开始连续单步调试5次。

调用g命令时,若要确定调试的范围,应这样写-g=0:200 0:208(后一个地址要写全,不能只写偏移地址),同时还需注意g命令的另一种用法,-g 208 ,该条语句的意思是从当前CS与IP所指的地址开始执行到CS:207(不包括偏移地址为208的内存单元)。

与此不同的是u即反汇编指令,它有3种用法,(1)-u 0:200 208即从0:200执行到0:208结束(是包括偏移地址为208的内存单元),(2)-u 0:200 l9即从0:200开始连续反汇编9个字节结束,(3)-u 0:200即从0:200开始连续反汇编32个字节结束。

 

 还有e命令,我觉得也要注意一下它的用法。e命令修改内存单元的内容,支持单(双)引号,支持连续字符。

 

 posted on 2018-10-28 11:11  G_fish  阅读(1410)  评论(1编辑  收藏  举报