码迷,mamicode.com
首页 > 其他好文 > 详细

实验2 汇编程序编写与调试

时间:2020-11-01 10:05:36      阅读:19      评论:0      收藏:0      [点我收藏+]

标签:编写   寄存器   显示   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文件夹作为虚拟盘来实现虚拟机功能的。

 

实验2 汇编程序编写与调试

标签:编写   寄存器   显示   dos   运行   nbsp   数据   操作系统   组合   

原文地址:https://www.cnblogs.com/haozhenglong/p/13902236.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!