汇编实验一

实验结论:

一、使用Debug,将下面程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化

首先打开dosbox用r命令查看寄存器初始值

 

用a命令输入汇编指令如下:

 

用u命令反汇编:

 

发现在内存中机器码与书中一致,即输入正确

接下来用r命令分别修改CS、IP的值,使其指向1000:0内存单元,当做命令开始执行

 

修改后用r命令查看寄存器中信息:

可以看到CS:IP的值已经改变了,并且在最下面一行提示接下来内存1000:0位置的命令将进行的操作为mov ax,4e20与题目信息一致,下面用t命令一步步执行

 

 

可以发现,每次执行命令后,CS:IP的值就会向后移动当前汇编指令对应机器码的长度,同时,寄存器也执行每次汇编指令

二、将下面三条指令写入从2000:0开始的内存单元中,利用这三条指令计算2的8次方

输入指令如下:

同时,将CS:IP的值修改为指向2000:0的内存单元

这时用r命令查看寄存器中信息

可以看到CS:IP的值已经修改完成,并且最下方一行已经提示即将执行的汇编指令,下面用t指令执行

其中,机器在2000:0003和2000:0005循环执行,并用mov ax,ax来进行乘2操作,最后得到结果ax=100H

三、查看内存中的内容

PC机主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期并试图改变它

用d指令查看FFFF0H开始完后的128个内存单元

能看到右侧对应ASCII码中有01/01/92的标识字样,这就是我们要找的主板生产日期

对应内存单元为30 31 2F 30 31 2F 39 32

接下来我们用e命令修改对应其中的内存单元

将30 31对应内存单元修改为0

按下回车后用d命令再次查看IP:00F0~00FF对应内存单元的值以及右侧对应ASCII码

发现无论是内存单元的值还是右侧对应ASCII码都没有发生改变

原因:根据第1章中的1.15节得知因为该生产日期刻录在ROM只读存储器上,所以我们无法修改它的值

四、向内存从B8100H开始的单元中填写数据,如:

-e B810:0000 01 01 02 02 03 03 04 04

请读者填写不同数据,观察现象;再改变填写地址,观察产生的现象

下面改变地址

多次试验发现:

首先按下的第一个值会产生白色的图形,图形的形状根据修改的第一个值的大小有关,

而第二个值则是为该图标上色,颜色与修改的第二个值的大小有关

而且,修改的第二个值数字1-9用来改变图形颜色,10-79的数字不仅改变颜色还改变图形背景底色

 其中0和80为黑色(或者不显示,黑色底板实在看不出来……),81-FF往后的数字不仅改变图形颜色、底色还会增加跳动闪烁效果,很是炫彩!!!

 读者不妨一试!!!

地址在一定范围内的改变不影响结论

显存中的所有范围不一定都能显示在屏幕上

注意显示在最上面几行,记得及时清屏!!!

原因:根据第1章中的1.15节得知在8086CPU中A000-BFFF是显存地址空间,上述操作即为在显存中操作,即将结果输入到显示器上,得到我们刚刚看到的结果

实验总结与体会:

第一次的上机操作,让我对汇编有了更加深入的了解。轮到你动手的时候,才会发现对于CS:IP的地址的值的修改是多么重要,才知道jmp是和add,mov一样对内存的操作,单纯的引用是无效的。同时,也正是在实验中,找到像显存中输入不同数字得到不同答案那样一步步探索的快乐,以及在试探显存范围的小心翼翼和发现书上有标注范围的无奈。一次次明白书上的内容要看仔细,同时,不懂以及有怀疑的地方在询问之前,不妨自己动手实践一下,往往问题就能迎刃而解了。

posted @ 2018-10-22 15:11  红袍小恶魔  阅读(204)  评论(0)    收藏  举报