当前位置:文档之家› 实验一 DOS 环境下的汇编语言编程环境使用

实验一 DOS 环境下的汇编语言编程环境使用

实验一 DOS 环境下的汇编语言编程环境使用一、实验要求和目的1、掌握汇编语言程序设计的基本流程和学会上机开发简单程序;2、熟练掌握宏汇编程序MASM 的使用;3、熟练掌握连接程序LINK 的使用;4、熟练掌握DEBUG 的使用;二、软硬件环境1、硬件环境:计算机系统 windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识1、汇编语言源程序的汇编过程汇编语言源程序的汇编过程是是利用汇编程序(MASM)对已编辑好的源程序文件(.ASM)进行汇编,将源程序文件中以ASCII 码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以建立3个文件:扩展名为 .OBJ 的目标文件、扩展名为 .LST 的列表文件和扩展名为 .CRF 的交叉索引文件。

目标文件是必须建立的,它包含了程序中所有的机器码指令和伪指令指出的各种有关信息,但该文件中的操作数地址还不是内存的绝对地址,只是一个可浮动的相对地址。

列表文件(.LST)中包含了源程序的全部信息(包括注释)和汇编后的目标程序,列表文件可以打印输出,可供调试检查用。

交叉索引文件(.CRF)是用来了解源程序中各符号的定义和引用情况的。

汇编程序的主要功能可以概括为以下三点: (1) 检查源程序中的语法错误,并给出错误信息;(2) 产生目标程序文件(OBJ 文件),并可给出列表文件(.LST 文件);(3) 展开宏指令。

2、目标程序的连接过程连接程序进行连接时,其输入有两个部分:一是目标文件(.OBJ),;另一是库文件(.LIB),库文件是系统中已经建立的,主要是为高级语言提供的。

连接后输出两个文件,一是扩展名为 .EXE 的可执行文件,另一个是扩展名为 .MAP 的内存分配文件,它是连接程序的列表文件,又称为连接映像(Link Map),它给出每个段在存储器中的分配情况,该文件可有可无。

连接程序给出的“无堆栈段的警告性错误”并不影响程序的运行。

3、Debug 调试过程Debug 的主要功能有显示和修改寄存器及内存单元的内容;按指定地址启动并运行程序;设置断点使程序分段运行,以便检查程序运行过程中的中间结果或确定程序出错的位置;反汇编被调试程序,它将一个可执行文件中的指令机器码反汇编成助记符指令并同时给出指令所在的内存地址;单条追踪或多条追踪被调试程序,它可以逐条指令执行或几条指令执行被调试程序,每执行一条(或几条)指令后,Debug 程序将中断程序的运行并提供有关结果信息;汇编一段程序,在Debug 的汇编命令下可以直接输入助记符指令,并将其汇编成可运行程序段。

此外,Debug 还可以将磁盘指定区的内容或一个文件装入到内存或将内存的信息写到磁盘上等等。

在DOS 状态下可以用下面的命令启动Debug 程序:DEBUG [路径文件名.扩展名]Debug 后面的文件名及路径是指被调试程序的文件名及路径,Debug 后面的文件必须是程序的可执行文件,其扩展名可以是.EXE 或.COM。

4、汇编语言和DOS 操作系统的接口编写的汇编语言源程序是在DOS 环境下运行的,为了保证用户程序执行完后能返回到DOS 状态,可使用如下两种方法。

(一)标准方法首先将用户程序的主程序定义成一个FAR 过程,其最后一条指令为RET。

然后在代码段的主程序(即FAR 过程)的开始部分用如下三条指令将PSP 中INT 20H 指令的段地址及偏移地址压入堆栈:PUSH DS ;保护PSP 段地址MOV AX,0 ;保护偏移地址0PUSH AX这样,当程序执行到主程序的最后一条指令RET 时,由于该过程具有FAR 属性,故存在堆栈内的两个字就分别弹出到CS 和IP,从而执行INT 20H 指令,使控制返回到DOS 状态。

返回DOS 的标志就是程序运行完后出现一个DOS 的标识符,如D:\>。

(二)非标准方法也可在用户的程序中不定义过程段,只在代码段结束之前(即CODE ENDS 之前)增加两条语句:MOV AH,4CHINT 21H则程序执行完后也会自动返回DOS 状态。

此外,由于开始执行用户程序时,DS 并不设置在用户的数据段的起始处,ES 同样也不设置在用户的附加段起始处,因而在程序开始处使用以下方法装填DS 和ES 的值使其指向用户的数据段:MOV AX,段名MOV 段寄存器名,AX ;段寄存器名可以是DS、ES、SS 之一四、实验内容与步骤1、汇编、链接并调试下面给出的简单程序,找出程序中的错误。

DATA1 SEGMENTword1 DW 1, 9078Hbyte1 DB 21, 'World'DD 12345678HMsg DB 'Hello ,everyone!$'DATA1 ENDSSTACK SEGMENTsta dw 20 dup(?)top equ size staSTACK ENDScode segmentassume cs:code,ds:data1,ss:stackStart:MOV AX,data1MOV DS,AXMOV DX,OFFSET MsgMOV AH,9INT 21hNopMOV AX,0MOV BX,1HADDITIONADD AX,BXINC BXCOM BX,10JAE ADDITIONMOV AH,4ch ;DOS terminate program function INT 21hcode endsEND Start通过汇编发现此程序共有3处错误:1、符号地址ADDITION后缺少冒号;2、比较指令CMP错写成COM3、为实现循环累加的目的,JAE应改成JB修改后程序如下:DATA1 SEGMENTword1 DW 1, 9078Hbyte1 DB 21, 'World'DD 12345678HMsg DB 'Hello ,everyone!$'DATA1 ENDSSTACK SEGMENTsta dw 20 dup(?)top equ size staSTACK ENDScode segmentassume cs:code,ds:data1,ss:stackStart:MOV AX,data1MOV DS,AXMOV DX,OFFSET MsgMOV AH,9INT 21hNopMOV AX,0MOV BX,1HADDITION:ADD AX,BXINC BXCMP BX,10JB ADDITIONMOV AH,4ch ;DOS terminate program functionINT 21hcode endsEND Start运行后结果:2、完成下列程序设计:分类统计字数组data 中正数、负数和零的个数,并分别存入内存字变量Positive、Negative 和Zero 中,数组元素个数保存在其第一个字中。

使用Debug 查看Positive、Negative 和Zero 三个变量的数据。

思路流程:源程序如下:DATAS SEGMENTbyte1 DB 11,-3,2,0,5,23,-6,0,3,-21 ;定义字数组数据positive DB 0 ;定义字变量储存正数个数negative DB 0 ;定义字变量储存负数个数zero DB 0 ;定义字变量储存0个数DATAS ENDSSTACKS SEGMENTSTACKS ENDS偏移量SI=0,计数值CX=10data[SI]>0data[SI]<0Zero+1 否否CX=0结束是Positive+1 是Negative+1 是SI++,CX --否CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV CX,10 ;CX用于循环计数MOV SI,0 ;SI为数据偏移量L1:MOV AL,byte1[SI] ;AL储存当前数CMP AL,0 ;当前数与0比较JG L2 ;大于0跳转到L2JL L4 ;小于0跳转到L4INC zero ;当前数为0,zero数值加1JMP L3 ;跳转到L3L2:INC positive ;当前数为正数,positive数值加1 JMP L3L4:INC negative ;当前数为负数,negative数值加1 L3:INC SI ;偏移量加1DEC CX ;循环计数减1JNE L1 ;不等于0则循环MOV AH,4CHINT 21HCODES ENDSEND START调试过程与结果:输入-u进行反汇编,找到程序结尾MOV AH,4CH 语句所在的地址0771:0029;输入-g29执行到该语句;输入-d0显示0770:0000开始内存单元;由图可见地址0770:0000至0770:0009分别对应测试数据11,-3,2,0,5,23,-6,0,3,-21;076A:000A至076A:000C依次为正数个数5、负数个数3和零的个数2,进而说明该程序结果的正确性。

五、心得体会这次是第一次进行汇编语言的上机操作,主要以熟悉汇编过程的步骤、原理为主。

在实验过程中,我分别体验了在masm for windows集成实验环境中汇编和在dos中直接进行汇编的两种方法,加深了我对MASM、LINK以及DEBUG三个重要步骤的理解和认识。

由于是刚刚接触汇编语言,很多程序设计方面的知识还不具备,刚开始编程时一头雾水无从下手。

仿照着老师的样例程序,再加上自行查看书中的一些语句,终于编完了自己的程序。

但由于还没有学习如何输出,却不知道如何去检查自己的程序是否正确。

在老师介绍完了DEBUG的几个命令之后,。

相关主题