标签:编写 寄存器 显示 dos 运行 nbsp 数据 操作系统 组合
实验任务1:
在masm目录下放入txt格式的文件,并将ex1的代码赋值粘贴入其中,将文件名改为ex1.asm
编译过程:
连接过程:
调试过程:
1、将程序装入内存后各寄存器的状态
DS = 075A表明PSP的地址为075A:0,那么源程序的地址就为076A:0,也就是CS的值
2、用d查看PSP的256个字节中的内容
使用d 075A:0 0200 命令
结果如下:
这段内容中存放的是程序的描述信息,比如程序的大小
3、用u命令对ex1.exe进行反汇编
因为cx寄存器中的值为0031h,所以程序的大小就位0031h,于是用u命令将 076A:0 ~ 0031内存单元中的数据进行反汇编
这与我们程序中的内容相同,所以验证了前面所说的源程序存放在076A:0开始的内存单元中
4、将程序执行到mov ah 4c之前,查看程序执行结果
这里我遇到了一个问题:正常run 这个ex1.exe时,对应内存单元中的内容被我修改了,那段内存单元是显卡ROM,所以在dos下显示出了彩色图标
而我使用debug命令运行时,却并没有出现彩色图标
大家讨论觉得这段内存单元在单步执行的时候被其它字符刷新覆盖了,
可是我觉得它在实验室的机子上单步运行可以显示出每一步正常的图标,但在我自己的电脑上不会出现每一步正常的图片
而且将文字显示的内容放在空白区域也不会出现正常的图片,所以应该不是字符流刷新覆盖的问题
我觉得可能是dos系统下对屏幕显示区域的内存处理方式与目前常用的操作系统不同,
实验任务2:
在masm目录下放入txt格式的文件,并将ex2的代码赋值粘贴入其中,将文件名改为ex2.asm
编译:
连接:
运行截图:
调试:
1、查看ex2.exe装入内存后的寄存器状态
2、用u命令对ex2.exe进行反汇编
3、使用t命令和g命令调试程序
执行到loop命令后,ip又变为000E,需要重复执行cx = 4次
4、接下来可以使用g命令跳过循环步骤
5、最后执行完剩余的两个指令
mov cx,4改为mov cx,8
s标签中的内容就会重复执行八次,AX中的内容会变为0909
分析:
ex2.asm与ex1.asm相比,它们实现的功能效果都是相同的,都是将b810:0 7 中的内容改成了 01 01 02 02 03 03 04 04
不同的地方在于ex2是通过loop和标签组合实现了循环,并通过cx控制了循环的次数,这使得程序更加的简洁了
实验任务3:
源程序:
编译:
(编译界面忘截图了)
连接:
执行结果:
将0237h改为0239h后的运行结果:
将0237h改为0437h后的运行结果:
经过反复的更换数据,我发现写入内容的低8位就对应与显示内容的ascii值,改变高8位的值则会改变显示内容的颜色。
实验任务4:
编译:
连接:
调试:
实验任务5:
第一个空格处应该填的是程序在内存中的起始地址
第二个空格处应该填的是mov ax 4c00h前的内存单元的个数
使用r命令查看相关信息
得出程序起始地址为076A:0,mov ax,4c00h前一个内存单元的内存单元的个数为0018h
因此填空得源程序为:
编译、连接、debug后查看复制的内容如下:
回答:
复制的是从code段中指令mov ax,4c00h前的所有指令,从076A:0 ~17到0020:0~17
有18个字节,可以通过先随便填空,保证程序不出错,将源程序装入内存查看程序的存储地址和大小来确定填空的内容
实验总结:
1、本次实验先是用一段源程序修改屏幕显示内存单元中的值,在此过程中碰到了debug和普通运行模式下的显示不同的问题,个人认为应该是dos操作系统对屏幕显示内存单元的管理与现代操作系统的差异原因
2、接着综合使用bx和loop指令,实现循环操作,直观感受了书上所说的源程序状态下和debug状态下对程序的不同解释问题
3、通过这整个实验,熟悉了编译、连接、运行、调试的操作流程,并且理解了dos系统是将masm文件夹作为虚拟盘来实现虚拟机功能的。
标签:编写 寄存器 显示 dos 运行 nbsp 数据 操作系统 组合
原文地址:https://www.cnblogs.com/haozhenglong/p/13902236.html