




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5.5 汇编语言程序的上机过程当我们上机操作,在计算机上建立和运行汇编语言程序时,首先要用编辑程序(如行编辑程序EDLIN或全屏幕编辑程序EDIT等)建立汇编语言源程序(其扩展名必须为.ASM),源程序就是用汇编语言的语句编写的程序。汇编语言源程序是不能被计算机所识别和运行的,必须经过汇编程序(MASM或ASM)加以汇编(翻译), 把源程序文件转换成为用机器码(二进制代码)表示的目标程序文件(其扩展名为.OBJ)。若在汇编过程中没有出现语法错误,则汇编结束后,还必须经过连接程序(LINK)把目标程序文件与库文件或其它目标文件连接在一起形成可执行文件(其扩展名为.EXE文件)。这时就可以在DOS下直接键入文件名运行此程序。 因此,要在计算机上运行汇编语言程序的步骤是: 用编辑程序(EDIT)建立ASM源程序文件; 用汇编程序(MASM或ASM)把ASM文件汇编成OBJ文件; 用连接程序(LINK)把OBJ文件转换成EXE文件; 在DOS命令状态下直接键入文件名就可执行该文件。 上述上机过程可用图5.4表示。下面我们将说明这一过程的具体操作方法。 5.5.1 用编辑程序建立汇编语言源程序文件(ASM文件) 例如我们要建立一个多字节相加的汇编语言源程序,我们可以在DOS模式下用编辑程序EDIT.EXE建立汇编语言源程序文件MBA.ASM(多字节相加程序)。 如: CEDIT MBA.ASM 进入EDIT的程序编辑画面时, 输入汇编语言源程序如下: DATA SEGMENT ;定义数据段 ARRY1 DB 10,21,32,53,64,75,96,10,11 ARRY2 DB 21,17,35,15,50,26,41,42,28 ARRY3 DB 9 DUP(?) N DW 9 DATA ENDS ;数据段结束 STACK SEGMENT PARA STACK STACK ;定义堆栈段 DW 100 DUP(?) STACK ENDS ;堆栈段结束 CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK MAIN PROC FAR ;主程序部分 START:PUSH ;将DS压入堆栈保存 MOV AX,0 PUSH AX ;将0压入堆栈保存 MOV AX,DATA ;把数据段地址送AX MOV DS,AX ;然后通过AX送入DS MOV AX,STACK ;把堆栈段地址送AX MOV SS,AX ;然后通过AX送入SS MOV SI,OFFSET ARRY1 ;把ARRY1的偏移量地址送入SI MOV DI,OFFSET ARRY2 ;把ARRY2的偏移量地址送入DI MOV CX,N CLC ;进位标志清零 CALL ADDFA ;调用子程序ADDFA RET ;返回DOS MAIN ENDP ;主程序结束 ADDFA PROC NEAR ;定义子程序 PUSH AX ;保护现场 PUSH CX PUSH SI PUSH DI MOV BX,OFFSET ARRY3 ;把ARRY3的偏移量地址送入BX LOOP1:MOV AL,SI ;取一个字节加数 ADD AL,DI ;与另一个字节加数相加 MOV BX,AL ;结果送存 INC SI ;ARRY1的偏移量地址加1 INC DI ;ARRY2的偏移量地址加1 INC BX ;ARRY3的偏移量地址加1 LOOP LOOP1 ;未加完转LOOP1 POP DI ;恢复现场 POP SI POP CX POP AX RET ;返回主程序 ADDFA ENDP ;子程序结束 CODE ENDS ;代码段结束 END START ;汇编结束 EDIT的使用方法可查阅相关资料。也可使用其它编辑程序(如DOS的行编辑程序EDLIN)以及其它字处理程序(如WORD和WPS等)。5.5.2 用汇编程序MASM将ASM文件汇编成目标程序文件(OBJ文件) 在对源程序文件(简称ASM文件)汇编时,汇编程序将对ASM文件进行二遍扫描,若程序文件中有语法错误,则结束汇编后,汇编程序将指出源程序中存在的错误,这时应返回编辑环境修改源程序中的错误,再经过汇编,直到最后得到无错误的目标程序,即OBJ文件。 因此,汇编程序的主要功能可以概括为以下三点: 检查源程序中的语法错误,并给出错误信息。 产生目标程序文件(OBJ文件)。 展开宏指令。 完成汇编功能的是汇编程序ASM或宏汇编程序MASM,二者的区别在于:MASM 是有宏汇编功能,而ASM没有宏处理功能,因此,MASM比ASM的功能强,但MASM需要占据较大的内存空间,当内存空间较小时(如64K),只能使用ASM。 汇编过程如下: 当源程序建立以后,仍以MBA.ASM程序为例,我们用汇编程序MASM对MBA.ASM源程序文件进行汇编,以便产生机器码的目标程序文件MBA.OBJ,其操作步骤如下: CMASM MBA Microsoft (R) Macro Assembler Version 5.00 Copyright (C) Microsoft Corp 1981-1985,1987,All rights reservedObject filename MBA.OBJ: Source listing NUL.LET:MBA Cross-reference NUL.CRF:MBA50468 + 303948 Bytes symbol space free0 Warning Errors 0 Severe Errors 由此可知,汇编程序调入后,首先显示版本号,然后出现三个提示行。第一个提示行为: Object filename MBA.OBJ: 这是询问目标程序文件名,方括号内为机器规定的默认的文件名,通常直接按回车,表示采用默认的文件名,如上所示,这是我们汇编的主要目的。第二个提示为: Source listing NUL.LST: 这是询问是否建立列表文件,若不建立,直接打回车;若要建立,则打入文件名再回车,如上所示,要建立名为MBA的列表文件。列表文件中同时列出源程序和机器语言程序清单,并给出符号表,有利于程序调试。第三个提示行为: Cross-reference NUL.CRF: 这是询问是否要建立交叉索引文件,若不要建立,则直接回车;若要建立,则应打入文件名,如上所示,要建立MBA.CRF文件。为了建立交叉索引文件,还必须调用CREF.EXE程序,即打入: CCREF MBA Microsoft (R) Cross-Reference Utility Version 5.00 Copyright (C) Microsoft Corp 1981-1985,1987. All rights reserved. listing MBA.REF:11 Symbols 这时首先显示版本号,然后出现一个提示行: Listing MBA.REF: 这是询问交叉索引文件名,这时可用回车承认方括号内机器默认的文件名,如上所示。这样就建立了MBA.REF文件。其内容是用户定义的所有符号(包括变量),并给出每个符号定义所在的行号(附以)以及引用的行号。 调入汇编程序,当我们回答了上述各提问行的询问之后,汇编程序就对源程序进行汇编。若汇编过程中发现源程序有语法错误,则列出有错误的语句和错误的代码。错误分警告错误(Wraning Errors)和严重错误(Severe Errors)。 警告错误是指汇编程序认为的一般性错误;严重错误是指汇编程序认为无法进行正确汇编的错误,并给出错误的个数及行号、错误的性质等。这时,就要对错误进行分析,找出问题和原因,然后再调用编辑程序加以修改,修改后重新汇编,直到汇编后无错误为止。 5.5.3 用连接程序LINK生成可执行程序文件(EXE文件) 经汇编后产生的二进制的目标程序文件(OBJ文件)并不是可执行程序文件(EXE文件),必须经连接以后,才能成为可执行文件。连接程序并不是专为汇编语言程序设计的,如果一个程序是由若干个模块组成的,也可通过连接程序LINK把它们连接在一起,这些模块可以是汇编程序产生的目标文件,也可以是高级语言编译程序产生的目标文件。 连接过程如下: CLINK MBA Microsoft (R) Overlay Linker Version 3.60 Copyright (C) Microsoft Corp 1983-1987. All rights reserved.Run File MBA.EXE: List File NUL.MAP:MBA Libraries .LIB: 由此可知,在连接程序调入后,首先显示版本号,然后出现三个提示行: Run File MBA.EXE: 这是询问要产生的可执行文件的文件名,一般直接回车采用方括号内规定的隐含文件名。 第二个提示行为: List File NUL.MAP: 这是询问是否要建立连接映象文件。若不要建立,则直接回车;若要建立,则打入文件名再回车。我们这里是要建立该文件,则打入文件名MBA。 第三个提示行为: Libraries .LIB: 这是询问是否用到库文件,若无特殊需要,则直接打入回车即可。 上述提示行回答后,连接程序开始连接,若连接过程中有错,则显示错误信息,错误分析清楚后,要重新调入编辑程序进行修改,然后重新汇编,再经过连接,直至无错为止。连接以后,便产生了可执行程序文件(.EXE文件)。 5.5.4 程序的执行 当我们建立了可执行文件MBA.EXE后,就可直接在DOS下执行该程序: CMBA C 程序运行结束并返回DOS。这里我们并未看到运行结果,怎么知道程序运行已经结束?又怎么知道程序已返回DOS?下面我们来讨论这个问题。 5.5.5 汇编语言和DOS操作系统的接口 当我们编写的汇编语言源程序是在DOS环境下运行时,必须了解汇编语言是如何同DOS操作系统接口的。 当我们用编辑程序把源程序输入到机器中,用汇编程序把它转换为目标程序,用连接程序对其进行连接和定位时,操作系统为每一个用户程序建立了一个程序段前缀区PSP,其长度为256个字节,主要用于存放所要执行程序的有关信息,同时也提供了程序和操作系统的接口。操作系统在程序段前缀的开始处(偏移地址0000H)安排了一条INT 20H软中断指令,INT 20H中断服务程序由DOS提供,执行该服务程序后,控制就转移到DOS,即返回到DOS管理的状态。因此,用户在组织程序时,必须使程序执行完后能去执行存放于PSP 开始处的INT 20H指令,这样便返回到DOS,否则就无法继续键入命令和程序。 DOS在建立了程序段前缀区PSP之后,就将要执行的程序从磁盘装入内存。在定位程序时,DOS将代码段置于PSP下方,代码段之后是数据段,最后放置堆栈段。内存分配好之后,DOS就设置段寄存器DS和ES的值,以使它们指向PSP的开始处,即INT 20H的存放地址,同时将CS设置为PSP后面代码段的段地址,IP设置为指向代码段中第一条要执行的指令位置,把SS设置为指向堆栈的段地址,让SP指向堆栈段的栈底(取决于堆栈的长度),然后系统开始执行用户程序。 为了保证用户程序执行完后,能回到DOS,可使用如下两种方法: 标准方法 首先将用户程序的主程序定义成一个FAR过程,其最后一条指令为RET。然后在代码段的主程序(即FAR过程)的开始部分用如下三条指令将PSP中INT 20H 指令的段地址及偏移地址压入堆栈: PUSH DS ;保护PSP段地址 MOV AX,0 ;保护偏移地址0 PUSH AX 这样,当程序执行到主程序的最后一条指令RET时,由于该过程具有FAR属性,故存在堆栈内的两个字就分别弹出到CS和IP,便执行INT 20H指令,使控制返回到DOS状态。例如上面我们的多字节相加程序就是采用的这种方法使控制返回到DOS状态的(返回DOS的标志就是程序运行完后出现一个DOS的标识符,如C)。 非标准方法 也可在用户的程序中不定义过程段,只在代码段结束之前(即CODE ENDS之前), 增加两条语句: MOV AH,4CH INT 21H 则程序执行完后也会自动返回DOS状态。 此外,由于开始执行用户程序时,DS并不设置在用户的数据段的起始处,ES同样也不设置在用户的附加段起始处,因而在程序开始处(或在保护了PSP段地址和偏移地址0以后),应该使用以下方法重新装填DS和ES的值使其指向用户的数据段: MOV AX,段名 ; MOV 段寄存器名, ;段寄存器名可以是DS、ES、SS之一 5.5.6 常用系统功能调用和BIOS中断调用 微型计算机系统为汇编用户提供了两个程序接口,一个是DOS系统功能调用,另一个是ROM中的BIOS(basic input/output system)。系统功能调用和BIOS由一系列的服务子程序构成,但调用与返回不是使用子程序调用指令 CALL和返回指令RET,而是通过软中断指令INT n 和中断返回指令IRET调用和返回的。DOS系统功能调用和BIOS的服务子程序,使得程序设计人员不必涉及硬件就可以使用系统的硬件,尤其是IO的使用与管理。 一系统功能调用 系统功能调用是微机的磁盘操作系统DOS为用户提供的一组例行子程序,因而又称为DOS系统功能的调用。这些子程序可分为以下四个主要方面: 磁盘的读写及控制管理; 内存管理; 基本输入输出管理(如键盘、打印机、显示器等); 其他管理(如时间、日期等)。 为了使用方便,系统已将所有子程序按顺序编号,称为调用号。其调用号从075H,如表5.4所示。表中只列出了基本输入输出管理中部分的键盘和显示器的DOS功能调用。 对于所有的功能调用,使用时一般需要经过以下三个步骤: 子程序的入口参数送相应的寄存器; 子程序编号送AH; 发出中断请求:INT 21H(系统功能调用指令)表5.4 键盘和显示器的DOS调用调用号功能入口参数出口参数1键入并显示一个字符键入字符的ASCII码在AL中2显示器显示一个字符DL中置输出字符的ASCII码5打印机打印一个字符DL中置输出字符的ASCII码8键盘输入一个字符键入字符的ASCII码在AL中9显示器显示一个字符串DS:DX置字符串首址,字符串以$结束10(0AH)键入并显示字符串DS:DX置字符串首址,第1单元置允许键入的字符数(含一个回车符)键入的实际字符数在第2单元中,键入的字符从第3单元开始存放11(0BH)检测有无键入有键入ALFFH,无键入AL0 例如,显示一个字符串:“Good morning!” MSG DB Good morning!$ : MOV DX,OFFSET MSG ;字符串首字符的偏移地址送DX MOV AH,9 ;功能号9送AH INT 21H ;系统功能调用 有的子程序不需要入口参数,这时可以略去。 例如:MOV AH,4CH ;功能号4CH送AH(返回DOS子程序) INT 21H 子程序调用结束后,一般都有出口参数,这些出口参数常放在寄存器中,通过出口参数用户可以知道调用的成功与否。 这里我们仅介绍常用的1、2、9、10等4个系统调用。 号功能调用 调用格式: MOV AH,1 INT 21H 系统执行该功能时将扫描键盘等待键入,一旦有键按下,就将键值(相应字符的ASCII码值)读入,先检查是否是Ctrl-Break,若是,则退出命令执行; 否则将键值送入AL寄存器,同时将这个字符显示在屏幕上。 2号功能调用 调用格式: MOV DL,待显示字符的ASCII码 MOV AH,2 INT 21H 本调用执行后,显示器显示其ASCII码值放入DL中的字符。 号功能调用 调用格式: MOV DX,待显示字符串首字符的偏移地址 MOV AH,9 INT 21H 本调用执行后,显示器显示待显示的字符串。调用时,要求DS:DX必须指向内存中一个以“$”作为结束标志的字符串。例如: DATA SEGMENT BUF DB HOW DO YOU DO? $ DATA ENDS CODE SEGMENT : MOV AX,DATA MOV DS,AX : MOV DX,OFFSET BUF MOV AH,9 INT 21H : CODE ENDS 执行本程序,屏幕上将显示:HOW DO YOU DO? 10号功能调用 调用格式: MOV DX,数据区的首偏移地址 MOV AH,10 INT 21H 该功能调用将从键盘接收字符串到内存数据区。要求事先定义一个数据区,数据区内第一个字节指出数据区能容纳的字符个数,不能为零。第二个字节保留,以用作填写实际输入的字符个数。从第三个字节开始存放从键盘上接收的字符串。实际输入的字符数少于定义的字节数,数据区内其余字节填零,若多于定义的字节数,则后来输入的字符丢掉,且响铃。调用时,要求DS:DX指向数据区首地址。例如: DATA SEGMENT BUF DB 50 ;数据区长度 DB ?; ;保留,填入实际输入的字符个数 DB 50 DUP(?) ;定义50个字节存储空间 DATA ENDS CODE SEGMENT : MOV DX,OFFSET BUF MOV AH,10 INT 21H : CODE ENDS 二常用系统功能调用应用举例 例5.5 利用DOS系统功能调用实现人机对话。 下述程序可以在屏幕上显示一行提示信息,然后接收用户从键盘输入的信息并将其存入内存数据区。 DATA SEGMENT PARS DB 100 ;定义输入缓冲区 DB DB 100 DUP(?) MESG DB WHAT IS YOUR NAME ? ;要显示的提示信息 DB $ ;提示信息结束标志 DATA ENDS STACK SEGMENT PARA STACK STACK DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START PROC FAR BEGIN:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX DISP:MOV DX,OFFSET MESG MOV AH,9 ;利用9号功能调用显示提示 INT 21H KEYBD:MOV DX,OFFSET PARS MOV AH,10 ;利用10号功能调用接收键盘输入 INT 21H RET START ENDP CODE ENDS END BEGIN 例5.6 编写汇编语言源程序,将键入的4位十进制数(如5,则键入0005)以压缩BCD数形式存入字变量SW中。 该程序首先接收键入的4位十进制数,然后拼合为压缩BCD数,存入字变量SW。为了接收键入的4位十进制数,需要在数据段中定义一变量数据区。该数据区应有7个字节,其中第1字节定义为5,即可接收5个字符,第2字节预留给10号功能调用装载实际键入字符数,第3字节到第7字节预留给10号功能调用装载实际键入的字符,即4字节十进制数的ASCII码和1字节回车的ASCII码。程序如下: DATA SEGMENT BUF DB 5,0,5 DUP (?) SW DW DATA ENDS CODE SEGMENT BEGIN PROC FAR ASSUME CS:CODE,DS:DATA START:PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF ;10号功能调用,键入4位十进制数 MOV AH,10 INT 21H MOV AX,WORD PTR BUF+4 ;键入数的个位和十位送AX AND AX,0F0FH ;将两个ASCII转为非压缩BCD数 MOV CL,4 SHL AL,CL ;将十位移至AL的高4位 OR AL,AH ;十位和个位拼合在AL中 MOV BYTE PTR SW,AL ;存BCD数的十位和个位 MOV AX,WORD PTR BUF+2 ;键入数百位和千位送AX AND AX,0F0FH ;将两个ASCII转为非压缩BCD数 SHL AL,CL ;将千位移至AL的高4位 OR AL,AH ;千位和百位拼合在AL中 MOV BYTE PTR SW+1,AL ;存BCD数的千位和百位 RET BEGIN ENDP CODE ENDS END START三BIOS中断调用 BIOS是固化在ROM中的一组IO驱动程序,它为系统各主要部件提供设备级控制,还为汇编语言程序设计者提供了字符IO操作。和DOS功能调用相比BIOS有如下特点: 调用BIOS中断程序虽然比调用DOS中断程序要复杂一些,但运行速度快,功能更强; DOS的中断功能只是在DOS的环境下适用,而BIOS功能调用不受任何操作系统的约束; 某些功能只有BIOS具有。 BIOS中断功能依功能分为两种,一种为系统服务程序,另一种为设备驱动程序。这里我们仅介绍设备驱动程序中中断类型号为10H、16H和17H的显示器、键盘和打印机的服务程序。调用BIOS程序类同于DOS系统调用,先将功能号送AH,并按约定设置入口参数,然后用软中断指令INT n实现调用。 1键盘服务程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 多语言处理驱动的代码生成与语义理解-洞察阐释
- 乐理测试题前三章及答案
- 保险代理培训体系优化-洞察阐释
- 基于工业0的汽车零部件智能制造工厂研究-洞察阐释
- 小学五年级上册英语知识点3篇
- 媒体发布与内容授权协议
- 2025房产买卖合同的范本
- 餐饮行业员工培训与晋升合同模板
- 地理科目三考试题及答案
- 麻醉类药物试题及答案
- GB-T 1040.3-2006 塑料 拉伸性能的测定 第3部分:薄塑和薄片的试验条件
- 事业单位招聘人员体检表
- 成品交付检验记录表
- YY∕T 0321.1-2022 一次性使用麻醉穿刺包
- 河道清淤疏浚工程水生态影响对策措施
- 2022年水稳购销合同范本
- LTPS-LCD工艺流程简介资料
- 厨房管理表格
- (完整版)10KV配电室安装工程施工方案
- (完整版)家庭亲密度与适应性量表
- DOE操作作业指导书
评论
0/150
提交评论