实验1 用机器指令和汇编指令编程
实验结论
教材实验1(P35)
实验任务(1)
e命令写入:
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,ax
和mov sp,10
捆绑执行,避免栈操作出错 - 实验发现:当单步执行结束
mov ss,ax
和mov sp,10
后,2000:0~2000:f
内容就发生了变化,且靠近栈顶的十个字节分别为ss,ip,cs等值,且随着sp的变化,这十个字节的值的位置也在随之变化
实验总结
- 本次实验中,复习与练习了debug程序的使用
其中主要为指令的使用:- r指令 查看并修改CPU寄存器的内容
- d指令 查看单个或多个内存单元的内容
- e指令 修改单个或多个内存单元的内容 可用于写入机器码程序段
- a指令 用于编写汇编指令
- t指令 单步执行指令,可指定指令位置t=xxx:xxx
- 通过使用t指令,更深刻的观察了汇编语言执行时各寄存器值的变化情况,发现当栈操作时,
mov ss,ax
和mov sp,10
捆绑执行,并没有单步执行 - 通过尝试向内存地址三部分地址段分别写入数据,观察他们的不同
主随机存储器地址空间可正常写入数据
显存地址空间中,会同时向写入的数据显示到显示器上
ROM地址空间中无法写入数据 - 在教材实验二中,使用debug观察栈操作时栈空间和ss、sp的变化情况,复习了push和pop指令的执行步骤
push指令先sp=sp-2,再写入数据
pop指令先取出数据,再sp=sp+2 - 同时复习到了内存中字存储相关知识
字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,地地址存放低位字节。
- 通过对栈空间附近内存单元的观察可知,当声明一个栈(
mov ss,ax
mov sp,num
)时,同时也会将栈的相关属性(ss,ip,cs等)存储在内存中,即在栈顶附件十个字节