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

实验结论


教材实验1(P35)


实验任务(1)

e命令写入:
e命令写入
a命令写入:
a命令写入

分析:

  • 每次执行t命令时,CS不变,IP增加3

实验任务(2)

单步调试

单步调试
分析:

  • ax的值初始为1,ax=ax+ax=2,CS:IP跳回2000:0003,即循环;
  • ax=ax+ax=4,...
  • 以此类推,ax的值从20到21到22....一直循环到28即0100

实验任务(3)

生产日期
如图所示,生成日期为1992年,1月1日
查阅教材p12可知

地址C0000~FFFFF的内存单元为各类ROM地址空间
我们向地址C0000~FFFFF的内存单元中写入数据的操作是无效的,因为这等于改写只读存储器中的内容

实验任务(4)

按照题目要求对内存进行修改后,屏幕右上角出现如图所示图像

对相同内存单元修改不同数值后,发现屏幕右上角的图像出现变化,并且在闪烁


对相邻内存单元修改数值后,发现在屏幕左上角出现了相同的图像


对偏移较大的内存单元修改数值后,并没有类似效果出现

查阅教材可知

A0000~BFFFF的内存单元为显存地址空间,向该区域内的内存单元写入数据,这个数据就被写入显存,然后被显卡输出到显示器上


所有的物理存储器被看做一个由若干存储单元组成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。CPU在这段地址空间中读写数据,实际就是在相对于的物理存储器中读写数据。


地址0~7FFFH的32KB空间为主随机存储器的地址空间
地址8000H~9FFFH的8KB空间为显存地址空间
地址A000H~FFFFH的24KB空间为各个ROM的地址空间


教材实验2


实验任务(1)

使用e命令修改内存单元0022:0~0022:7的数据:

使用a命令输入指令:

使用t命令单步执行,同时得到各步骤的ax,bx,ss,sp的值

push ax
push bx

执行之后,栈段内的数据查询如下

  • 执行push命令时,sp先减2,然后向ss:sp指向的字单元中送入数据


pop ax
pop bx

执行之后,栈段内的数据查询如下

  • 执行pop命令时,先从ss:sp指向的字单元中送入数据,再sp加2

push [4]
push [6]

执行之后,栈段内的数据查询如下

预先分析如下,与实际运行结果相同

实验任务(2)

使用 a命令输入指令,使用 e 命令修改2000:0~2000:f 的值

使用t命令单步执行,同时观察2000:0~2000:f的内容变化


根据实验结果分析如下:

  • 使用t单步执行时,将 mov ss,axmov sp,10捆绑执行,避免栈操作出错
  • 实验发现:当单步执行结束mov ss,axmov sp,10后,2000:0~2000:f内容就发生了变化,且靠近栈顶的十个字节分别为ss,ip,cs等值,且随着sp的变化,这十个字节的值的位置也在随之变化

实验总结

  1. 本次实验中,复习与练习了debug程序的使用
    其中主要为指令的使用:
    • r指令 查看并修改CPU寄存器的内容
    • d指令 查看单个或多个内存单元的内容
    • e指令 修改单个或多个内存单元的内容 可用于写入机器码程序段
    • a指令 用于编写汇编指令
    • t指令 单步执行指令,可指定指令位置t=xxx:xxx
  2. 通过使用t指令,更深刻的观察了汇编语言执行时各寄存器值的变化情况,发现当栈操作时,mov ss,axmov sp,10捆绑执行,并没有单步执行
  3. 通过尝试向内存地址三部分地址段分别写入数据,观察他们的不同

    主随机存储器地址空间可正常写入数据
    显存地址空间中,会同时向写入的数据显示到显示器上
    ROM地址空间中无法写入数据

  4. 在教材实验二中,使用debug观察栈操作时栈空间和ss、sp的变化情况,复习了push和pop指令的执行步骤

    push指令先sp=sp-2,再写入数据
    pop指令先取出数据,再sp=sp+2

  5. 同时复习到了内存中字存储相关知识

    字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,地地址存放低位字节。

  6. 通过对栈空间附近内存单元的观察可知,当声明一个栈(mov ss,ax mov sp,num)时,同时也会将栈的相关属性(ss,ip,cs等)存储在内存中,即在栈顶附件十个字节
posted @ 2020-10-12 10:58  PestLa  阅读(288)  评论(3编辑  收藏  举报