实验1 用机器指令和汇编指令编程

实验1 用机器指令和汇编指令编程


 

1 教材实验1结论

  • 实验任务(1)

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

机器码 汇编指令
b8 20 4e mov ax,4E20H
05 16 14 add ax,1416H
bb 00 20 mov bx,2000H
01 d8 add ax,bx

  

 

 

 

 

  

  

  1)使用e命令将指令写入内存,并用t命令单步调试。

  

   

  2)使用a命令将指令写入内存,并用t命令单步调试。

  

   

  •  实验任务(2)

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

    mov ax,1
    add ax,ax
    jmp 2000:0003

   用a命令写入指令,并用t命令单步调试:

  

  开始调试:

  

  结束调试:

   

   2的8次方为256即0100H。

  • 实验任务(3)

  查看内存中的内容。

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

  查看FFF00~FFFF的内存:

  

   由此可知,生产日期是在fff0:00f0到fff0:00ff处,改变这个日期并再次查看fff0:00f0到fff0:00ff处的内容:

  

   这个生产日期并没有发生变化。

  阅读第1章中的1.15节的内容后可知原因为:C0000到FFFFF为各类ROM地址空间,我们向地址C0000~FFFFF的内存单元中写入数据的操作是无效的,因为这等于改写只读存储器中的内容。

  • 实验任务(4)

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

  

  产生现象:右上角出现彩色图案。

  填写不同的数据:

  

   产生现象:彩色图案发生改变。

  改变填写的地址:

  

   产生现象:在其他位置出现彩色图像。

  阅读第1章中的1.15节的内容后可知原因为:A0000到BFFFF为显存地址空间,向地址A0000~BFFFF的内存中写数据,就是向显存中写入数据,这些数据会被显示卡输出到显示器上。


 

 2 教材实验2结论

  •  实验任务(1)

  1)使用e命令将内存单元0022:0 ~0022:7连续8个字节数据修改为50H, 51H, 52H, 53H, 54H, 55H, 56H, 57H并查看:

  

  2)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际情况填空。

  使用a命令输入p74指令:

  

   使用t命令进行单步调试:

  

  

   

   

   

   p74中指令执行后各个寄存器填空结果:

  

   经过比较,理论分析的结果与单步调试结果一致。

  • 实验任务(2)

  仔细观察3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?

  可能要再做些实验才能发现其中的规律。如果你在这里就正确回答了这个问题,那么要恭喜你,因为你有很好的悟性。大多数学习者对这个问题还是比较迷惑的,不过不要紧,因为随着课程的进行,这个问题的答案将逐渐变得显而易见。

  使用a命令输入图3.19中的7行指令,使用e命令修改2000:0~2000:f的值,及修改后查看的部分:

  

   单步调试每一行汇编指令,每一条指令单步调试后,都使用d命令查看2000:0~2000:f的值:

  

   

   

   

   文字陈述:

  • 前3行汇编指令的功能

 设置栈的段地址SS=2000H,不能直接向段寄存器SS中送入数据,所以用ax中转,因为栈为空,所以设置栈顶的偏移地址SP=0010H。

 初始栈顶:2000:0010H

 初始栈底:2000:000EH

  • 对单步调试结果的思考及可能原因的分析

    初始没有执行代码时,2000:0~2000:f的值都为00,创建站结构指向这段内存后出现数据,观察后发现其中有cs值,ip值,ax值等,使用t命令单步执行引发单步中断,执行中断例程时,CPU会将一些中断例程使用的寄存器变量自动压栈到栈中,当执行到push ax时,将ax中的数据压入栈中。

 

posted @ 2020-10-09 20:06  迟轩  阅读(270)  评论(4)    收藏  举报