第 4 章 80x86 汇编语言及程序_第1页
第 4 章 80x86 汇编语言及程序_第2页
第 4 章 80x86 汇编语言及程序_第3页
第 4 章 80x86 汇编语言及程序_第4页
第 4 章 80x86 汇编语言及程序_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章80x86汇编语言及程序设计4.1汇编语言的基本语法4.280x86宏汇编指示性语句的增强与扩充4.3汇编语言程序设计基础及应用4.1汇编语言的基本语法4.1.1汇编语言概述1.汇编语言及特征汇编语言是一种采用助记符表示的机器语言指令,即用助记符来表示指令的操作码和操作数,用标号或符号代表地址、常量或变量。助记符一般是英文单词的缩写,因此,相对于机器语言来说,使用汇编语言编写的程序便于记忆、阅读,使用方便。用汇编语言编写的程序,产生的目标代码短、执行速度快,可以直接控制系统硬件,具有高级语言不可替代的作用。学习汇编语言也是理解和掌握计算机工作原理和过程的主要途径。但使用汇编语言编写程序,程序员必须熟悉系统硬件结构,且其功能描述不如高级语言直观,编程效率较低。汇编语言作为一种计算机语言,必然由程序员和计算机都能识别的符号、功能代码及语法约定来描述。汇编语言主要包括:指令语句、伪指令语句和词法(语法)。(1)指令语句指令语句是指第3章介绍的由汇编指令构成的语句,是计算机可以执行的语句。一条指令语句必产生一条相应的目标代码,在用汇编语言编写的源程序中,程序的主要功能是通过指令语句来实现的。(2)伪指令语句伪指令语句是指为了方便用户设计程序,由伪指令提供给汇编程序完成的一些操作。伪指令又称汇编控制指令,它是控制汇编过程的一些命令,即程序员通过伪指令设置汇编程序进行汇编时的一些操作,主要包括源程序存放的起始地址、定义存储段及过程等。因此,伪指令不产生机器语言的目标代码,它是汇编语言程序中的不可执行语句。(3)词法词法用于规定程序中允许使用的符号、运算符、表达式及程序的结构要求等。程序员必须按照词法约定编写程序2.汇编程序用汇编语言编写的程序称为源程序。源程序必须翻译成用机器语言表示的目标代码(亦称目标程序),计算机才能执行。其编译工作可由汇编程序自动完成。汇编程序的功能就是将用汇编语言编写的源程序翻译成用机器语言表示的目标程序,这一过程称为汇编(编译)。3.汇编语言语句语句是程序的基本组成部分,汇编语言源程序中主要包括指令语句、伪指令语句和宏指令语句。(1)指令语句指令语句格式由以下几个部分组成:[标识符:]操作码[目的操作数][,源操作数][;注释]例如:LOP:MOVAL,DATA1;双操作数指令,标号LOP为指令地址ADDAL,[2000H];双操作数指令DECAL;单操作数指令NOP;无操作数指令一条语句应在一行内完成。(2)伪指令语句伪指令语句格式:[标识符]伪操作符[操作数][;注释]其中,[]中的项表示可选项。标识符:根据伪指令作用的不同,可以是变量名、段名、过程名及符号常量等。伪操作符:又称定义符/伪指令助记符,表示伪操作功能,如定义变量名、段名、过程名及符号常量等。标识符与伪操作符之间用空格分隔。操作数:又称伪指令参数,根据不同的伪指令,可以有一个或多个。例如:DATA1DB30H,31H,32H;定义字节变量DATA1开始的3个连续存储单元DATA2DB33H;定义字节变量DATA2单元DW1234H;定义字存储单元PIEQU3.14;定义符号常量(3)宏指令语句宏指令语句是由若干条指令语句形成的语句体。一条宏指令语句的功能相当于若干条指令语句的功能。4.1.2汇编语言的数据、标识符和表达式数据是汇编语言语句中操作数的基本组成部分。汇编语言所能识别的数据有常量、变量和标识符,并通过不同的运算符组成表达式,以实现对数据的加工。1.常量在程序中,数据固定不变的值称为常量。(1)数值常量数值常量的表示形式有二进制数、八进制数、十六进制数、十进制数,其后分别跟字母B、O、H、D(十进制数可省略D)。十六进制数以A~F开头时,前面加数字0,以避免和操作码混淆。

例如:0010111B、1234H、0FFFFH、121O。常量可以是数值,也可以是名字。用名字表示的常量称为符号常量。在编程时,符号常量可使用伪指令“EQU”进行定义。例如:CNTEQU100;CNT为符号常量,等值100(2)字符串常量字符串常量是由包含在引号中的若干个字符组成的。字符串在计算机中存储的是相应字符的ASCII。如“A”的值是41H,“AB”的值是4142H等。2.变量变量是在程序运行过程中可随时改变的量,它实际上是存储器的某一个数据存储单元。对变量的访问就是对这个存储单元的访问。在程序中是通过变量名的形式来实现对存储单元的操作的。变量名被称为存放数据的存储单元的符号地址。变量有以下3个属性。①段属性:指变量所表示的存储单元所在段的段基址。②偏移地址属性:指变量所表示的存储单元地址与段基址之间的偏移量。③类型属性:指变量占用存储单元的字节数。变量可分为字节变量、字变量和双字变量。字节变量为1个字节单元,类型为BYTE;字变量为2个字节单元,类型为WORD;双字变量为4个字节单元,类型为DWORD。3.标识符标识符就是符号名称,标识符在源程序中可以表示标号、变量、常量、过程名、段名等。标识符必须是大小写英文字母、数字及一些特殊符号的组合指令语句中的标号表示该指令的符号地址,它可作为转移类指令的操作数,以确定程序转移的目标地址。标号有以下3个属性。①标号所在段必定是代码段。②标号所在地址与段基址之间的偏移量为16位无符号数。③当标号只允许作为段内转移或调用指令的目标地址时,类型为NEAR;当标号可作为段间转移或调用指令的目标地址时,类型为FAR。伪指令语句中的标识符可作为常量、变量名等数据参加运算,也可作为段名及过程名等4.运算符和表达式用运算符把常量、变量或标识符组合起来的式子就是表达式,由汇编程序在汇编时对其进行运算,得到的是运算结果数据。运算符主要包括算术运算符、逻辑运算符、关系运算符、分析运算符和属性运算符5种类型。(1)算术运算符算术运算符包括+(加)、-(减)、*(乘)、/(除)、MOD(模除),参加运算的数和运算结果均为整数。例如,用汇编语言描述的程序为:MOVAL,10H*2;在汇编时完成源操作数10H*2ADDAL,7MOD2;在汇编时完成7MOD2=1(2)逻辑运算符逻辑运算符包括AND(与)、OR(或)、XOR(异或)、NOT(非),其作用是对操作数进行按位操作,其结果不影响标志位。必须注意到,逻辑运算符与逻辑运算指令中的助记符完全相同,但由逻辑运算符组成的表达式只能作为指令的操作数部分,在汇编时完成逻辑运算,其结果自然不影响标志位;逻辑运算指令中,逻辑运算助记符出现在指令的操作码部分,在执行目标代码(指令)时完成逻辑运算,其结果影响状态标志位。(3)关系运算符关系运算符包括EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)共6种,该运算符可实现两个数据的比较运算。若关系成立,结果为全1(逻辑真),否则为全0(逻辑假)。(4)分析运算符分析运算符的运算对象必须为变量或标号,运算符总是加在运算对象之前。它可以将变量或标号的属性(如段、偏移量、类型)分离出来①SEG运算符。根据SEG运算符组成的表达式可以得到该变量或标号所在段的段基址。例如:MOVBX,SEGDATA②OFFSET运算符。根据OFFSET运算符组成的表达式可以得到该变量或标号在段内的偏移地址。例如:MOVSI,OFFSETSOURCE在该例中,倘若变量SOURCE在数据段内的偏移地址是1200H,则该指令执行的结果为(SI)=1200H。该指令与指令LEASI,SOURCE等价。③TYPE运算符。根据TYPE运算符组成的表达式可以得到该变量或标号的类型属性。当其加在标号之前时,可以得到这个标号的类型属性。④LENGTH运算符。根据LENGTH运算符组成的表达式可以得到分配给变量的连续单元的个数(也称为数组)。该运算符只针对用DUP重复操作符定义的数组产生正确结果。例如:DATA1DW20HDUP(0)MOVAL,LENGTHDATA1;汇编后为MOVAL,20H⑤SIZE运算符。根据SIZE运算符组成的表达式可以得到分配给变量所占有的总字节数。(5)属性运算符变量、标号或地址表达式的属性可以用一些运算符来修改。①PTR运算符。PTR运算符用来指定或临时修改某个变量、标号或地址表达式的类型或距离属性,它们原来的属性不变。类型可以是:BYTE、WORD、DWORD、NEAR或FAR。例如:DATADB12H,34H,56,78HINCBYTEPTR[DI];指明目的操作数为字节类型MOVAX,WORDPTRDATA;临时修改DATA为字类型,(AX)=3412HJMPDWORDPTR[BX];指明为段间转移②段前缀“:”运算符。该运算符的作用是指定变量、标号或地址表达式所在的段。例如:MOVAX,ES:[BX];用附加段ES取代默认的数据段DS③SHORT运算符。SHORT运算符用于说明转移指令的目标地址的属性,取值范围为-128~127。例如:JMPSHORTLP另外,还有用于改变运算符优先级的圆括号运算符和用于变量下标或地址表达式的方括号运算符等。4.1.3伪指令语句伪指令语句(又称指示性语句)通过各种伪操作命令,为汇编程序提供一些信息,在汇编过程中实现数据定义、分配存储区、段定义、过程定义等功能。使用伪指令语句的目的是正确地把可执行的指令性语句翻译成相应的机器指令代码。本节介绍在汇编语言源程序中常用的一些汇编伪指令语句。1.符号定义伪指令语句符号定义伪指令有“EQU”等值伪指令和“=”伪指令两种。(1)“EQU”等值伪指令格式:符号名EQU表达式功能:符号定义伪指令指给一个标识符号赋予一个常量、表达式或其他符号名,是一种等值伪操作命令。例如:HUNDEREQU100;定义符号常量HUNDER替代100NUMEQUHUNDER*2;定义NUM替代数值表达式HUNDER*2AEQUAX;定义符号A替代AX2.数据定义伪指令语句数据定义伪指令的作用是为数据分配一定的存储单元,并为这些存储单元的起始单元定义一个变量名。(1)定义字节变量伪指令格式:[变量名]DB表达式或数据项表功能:将表达式或数据项表的数据按字节依次连续地存放到以[变量名]开始的存储单元中。存储单元的地址是递增的。例如:ADB30H,31H,32H,33H,34H;定义从变量A开始的连续10个字节单元(数组)DB35H,36H,37H,38H,39H;A~A+9单元依次存放30H~39HBDB100DUP(?);定义从变量B开始的100个字节单元,内容不定CDB64H;定义变量C单元内容为64HSDB'ABCDEF';定义变量S(数组S)为连续6个字节单元,存放字符串3.程序分段定义伪指令语句(1)段定义伪指令格式:段名SEGMENT[定位类型,][组合类型,][类别名]…指令语句序列…段名ENDS功能:定义数据段、代码段、堆栈段、附件段。段名用来指出为该段分配的存储器起始地址。3个参数任选,其作用解释如下。①定位类型。定位类型表示某段装入内存时,对段的起始边界的要求。若定位类型为BYTE,表示本段起始单元可以从任一地址开始,段间不留空隙。若定位类型为WORD,表示本段起始单元是一个偶地址。若定位类型为PARA,表示本段起始单元地址一定能被16整除(系统默认定位类型)。若定位类型为PAGE,表示本段起始单元地址一定能被256整除。②组合类型。组合类型表示多个程序模块连接时,本模块与其他模块的同名段的组合类型。若组合类型为NONE,表示本段与其他段无组合关系(系统默认组合类型)。若组合类型为PUBLIC,表示本段和其他同名同类段重新连接成一个新逻辑段。若组合类型为COMMON,表示把两个段设置成相同的起始地址。若组合类型为STACK,表示本段为堆栈段,把所有同名段连接成一个段,自动初始化SS和SP。③类别名。类别名是用单引号标识的字符串,连接时把类别名相同的所有段存放在连续的存储区内。

(2)ASSUME段分配伪指令格式:ASSUME段寄存器:段名,[段寄存器:段名,][段寄存器:段名]功能:通知汇编程序设置CS、DS、SS、ES为哪些段的段基址寄存器。该指令只说明段名和段寄存器的关系,并未把段基址装入对应的寄存器。段寄存器DS、ES、SS的装入一般由程序实现,而CS的装入是系统自动完成的。4.定位操作伪指令语句(1)定位伪指令格式:ORG数值表达式功能:指出ORG后面的指令语句或数据区从数值表达式(地址偏移量)所确定的存储单元开始存放。例如:CSEGSEGMENTORG2000H;从2000H开始存放“HELLO”D1DB'HELLO'CSEGENDS(2)当前位置计数器$$表示当前地址,即在汇编时为程序分配下一个存储单元的偏移地址。它可以在表达式中使用。

例如:D1DB'abcdefghijk'LENEQU$-D1;LEN为字符串长度4.1.5完整的汇编语言源程序结构下面给出的是一个简单的完整汇编语言源程序及程序注释。DATASEGMENT

;定义数据段开始A1DW0012HA2DW0034HSUMDW0HDATAENDS

;数据段结束STACKSEGMENTPARASTACK'STACK';定义堆栈段开始DB100DUP(?)STACKENDS

;堆栈段结束CODESEGMENT

;定义代码段开始ASSUMECS:CODE,DS:DATA,SS:STACK;说明CODE为代码段,DATA为数据段,STACK为堆栈段START:MOVAX,DATAMOVDS,AX;赋数据段基址

MOVAX,STACK

MOVSS,AXMOVAX,A1;功能指令段MOVBX,A2MOVCL,8ROLAX,CLADDAX,BXMOVSUM,AX;将和存入SUM单元MOVAH,4CH;返回INT21HCODEENDS

;代码段结束ENDSTART

;结束汇编该程序的功能为将A1单元的低8位与A2单元的低8位装配在一起存入SUM单元。完整的汇编语言源程序的一般结构如下。①汇编语言源程序必须以SEGMENT和ENDS定义段结构,整个程序是由存储段组成的。80x86宏汇编语言规定,源程序至少包含一个代码段。一般情况下,源程序可根据需要由代码段、数据段、堆栈段和附加段组成。每个段在程序中的位置没有限制。本例中,源程序定义了数据段(段名为DATA)、堆栈段(段名为STACK)、代码段(段名为CODE)。②程序中需要处理和存储的数据应存储在数据段,指令存储在代码段。③代码段内用ASSUME

伪指令说明段寄存器为某一段的段基址,并通过传送指令填充数据段、附加段(需要时)基址。代码段基址由系统自动填充。④代码段内第一条可执行指令应设置标号(这里为START)。⑤实现功能指令段从MOVAX,A1开始,至MOVSUM,AX结束。⑥指令段最后两条指令为DOS系统功能调用(INT21H),返回DOS。⑦源程序最后的END语句表示汇编程序到此为止,并指出该程序执行的启动地址从START开始。4.280x86宏汇编性语句的增强与扩充(1)定义代码段格式:.CODE功能:说明其下程序为代码段内容。(2)定义数据段格式:.DATA/DATA?/CONST功能:说明其下程序(如变量定义)为数据段内容。在源程序中,可以多次使用.DATA定义数据段;.DATA?表示其下程序是未进行初始化的数据段;CONST表示其下程序是常量数据段。(3)定义堆栈段格式:STACK[长度]功能:说明其下程序为堆栈段。长度表示堆栈段的存储字节数,默认值为1KB;若段中的数据不确定,则以DUP(?)来定义。3.简化代码伪指令格式1:.STARTUP功能:该伪指令位于代码段的开始,自动对DS、SS、SP进行初始化。格式2:.EXIT0功能:该伪指令位于代码段的结束,用于返回DOS。该指令与下面指令的功能完全相同:MOVAH,4CHINT21H4.3汇编语言程序设计基础及应用4.3.1程序设计步骤及技术汇编语言是面向CPU编程的语言。汇编语言程序设计除了应具有一般程序设计的特征外,还应具有其自身的特殊性。1.程序设计步骤汇编语言程序设计一般经过以下步骤。①分析问题,明确任务要求。对于复杂的问题,还要将需解决的问题抽象成数学模型,即用数学表达式来描述。②确定算法,即根据实际问题和指令系统的特点,确定完成这一任务需经历的步骤。③根据所选择的算法,确定内存单元的分配(使用哪些存储器单元;使用哪些寄存器;程序运行中的中间数据及结果存放在哪些单元),以利于提高程序的效率和运行速度。然后制定出解决问题的步骤和顺序,画出程序的流程图。④根据流程图编写源程序。⑤上机对源程序进行汇编、连接、仿真、调试、运行。2.程序设计技术在进行汇编语言程序设计时,程序应采用顺序、选择和循环3种基本结构。

而实现基本结构的指令语句也有多种不同的形式,因此,在执行速度、所占内存空间、易读性和可维护性等方面有所不同。因此,在进行程序设计时,应注意以下事项和技巧。①把要解决的问题转化成一个个具有一定独立性的功能模块,各模块尽量采用子程序完成其功能。②力求少用无条件转移指令,尽量采用循环结构。③对主要的程序段要精心设计。如果在一个重复执行100次的循环程序中多用了2条指令,或者每次循环执行时间多用了2个机器周期,则整个循环就可能要多执行200条指令或多执行200个机器周期,从而使整个程序运行速度大大降低。④一般情况下,数据应定义在数据段,代码应定义在代码段。程序中应根据问题的复杂程度设置访问数据段的寻址方式。寻址方式越复杂,指令执行速度就越慢,但解决复杂问题的能力越强,用简单寻址方式能解决的问题,就不要用复杂寻址方式。⑤能用8位数据解决的问题就不要使用16位数据。⑥在中断处理程序中,要保护好现场(包括标志寄存器的内容),中断结束前要恢复现场。⑦累加器是信息传递的枢纽,在调用子程序时,一般应通过累加器传送子程序的参数,通过累加器向主程序传送返回参数。若需保护累加器的内容时,应先把累加器的内容推入堆栈或存入其他寄存器单元,再调用子程序。⑧为了保证程序运行得安全可靠,应考虑使用软件抗干扰技术,如数字滤波技术、指令冗余技术、软件陷阱技术。用汇编语言程序实现这些技术,不需要增加硬件成本,可靠性高、稳定性好、方便灵活。在用汇编语言编写程序的过程中,对于初学者来说是会遇到困难的,程序设计者只有通过实践,不断积累经验,才能编写出较高质量的程序。4.3.2顺序程序设计在所有的程序结构中,顺序结构是最简单的一种,表示在程序中按顺序依次执行语句,如图4-3所示。【例4-4】设有多项式f(x)=5x3+4x2-3x+21,编程计算自变量x=6时,函数f(6)的值。可以把上式转化成f(x)=[(5x+4)x-3]x+21的形式,以简化运算。DATASEGMENTXDW6RESUDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;设置DSMOVAX,5MULX;5*X→DX,AXADDAX,4;5X+4→AXMULX;(5X+4)X→DX,AXSUBAX,3;(5X+4)X-3→AXMULX;((5X+4)X-3)X→DX,AXADDAX,21;((5X+4)X-3)+21→AXMOVRESU,AX;保存运算结果MOVAX,4C00H;返回系统INT21HCODEENDSENDSTART4.3.3选择程序设计在设计程序时,有时要根据条件进行不同的处理,计算机可根据给定的条件,进行判断并转向相应的处理程序,这种程序结构称为选择结构。【例4-5】比较两个无符号数(字节变量A、B)的大小,将其大数存入MAX单元,流程如图4-4所示。采用两操作数比较指令,根据指令执行结果对标志位CF的影响,判断数据的大小。源程序如下。DATASEGMENTADB89HBDB98HMAXDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;设置DSMOVAL,ACMPAL,B;A-B影响标志位比较大小JNCNEXT;无借位转至NEXTMOVAL,BNEXT:MOVMAX,AL;大数存入MAXMOVAH,4CHINT21HCODEENDSENDSTART4.3.4循环程序设计在设计程序时,有时某一程序段要反复执行多次,可以通过循环结构实现其操作。计算机可根据循环操作的条件进行判断。若满足条件,继续执行循环程序,周而复始,直到条件不满足时,结束循环程序执行下一条语句。循环程序一般包括以下5个部分。①初始化部分:设置循环初始值及循环体中使用的数据初始值等。②循环体部分:循环程序要实现的功能一般应重复执行多次。③修改部分:对循环体中参加运算的数据或循环条件进行修改。④控制部分:控制循环程序按设定的循环次数或条件进行正常循环或结束循环。⑤结果处理:在需要时,对循环程序处理数据结果进行处理。源程序1(使用转移指令实现循环)如下。DATASEGMENTRESULTDW?CNEQU100DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVCX,1LP:ADDAX,CXINCCXCMPCX,CNJBELP;使用转移指令实现循环MOVRESULT,AXMOVAH,4CHINT21HCODEENDSENDSTART【例4-6】要求用循环程序实现s=1+2+3+4+…+100,将结果存入RESULT单元。循环结构流程如图4-5所示。源程序2(使用循环指令实现循环)如下。DATASEGMENTRESULTDW?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVSI,1MOVCX,100LP:ADDAX,SIINCSILOOPLP;循环指令:CX←(CX)-1,若CX≠0,则转至标号LPMOVRESULT,AXMOVAH,4CHINT21HCODEENDSENDSTART【例4-7】对数据段STRING单元的字符串,以“#”为结束标志,统计其长度并将结果存放在LEN单元。源程序如下。DATASEGMENTSTRINGDB"ABCDEFG12345987689H#"STR2DB'HELLO'LENDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;设置DSMOVSI,OFFSETSTRINGMOVDX,0LOP:MOVAL,[SI]CMPAL,'#'JZLOP1;结束转至LOP1INCDLINCSIJMPLOP;无条件转至LOP,判断下一个字符LOP1:MOVLEN,DXMOVAH,4CHINT21HCODEENDSENDSTART【例4-8】对数据段STRING单元中以“#”为结束标志的字符串中数字字符的个数进行统计,将结果存放在NUMLEN单元中。采用模型方式编程格式的源程序如下。.DATASTRINGDB"ABCDEFG12345987689H#"NUMLENDW?.CODE.STARTUPMOVSI,OFFSETSTRING;获取字符串的地址,SI指向首字符MOVDX,0;对计数器清0LOP:MOVAL,[SI]CMPAL,'#'JZNEXT;遇到字符串结束符#,转至NEXTCMPAL,'0'JBNOC;遇到0以下的字符,不计数,转至NOCCMPAL,'9'JANOC;遇到9以上的字符,不计数,转至NOCINCDX;对0~9的字符计数,转至NOCNOC:INCSI;修改字符指针JMPLOP;无条件转至LOP,判断下一个字符NEXT:MOVNUMLEN,DX;存放结果.EXIT0END4.3.5子程序设计为了实现模块化程序设计,往往把具有某一功能的程序段设计成一个独立的程序模块。在需要使用该程序模块时,可由主程序或其他程序调用一次或多次,每次执行结束后再返回原来的程序继续执行,这样的程序模块称为子程序(或称过程)。子程序可以由过程定义伪指令定义,子程序调用和返回可以通过指令系统的相关指令实现。1.过程定义伪指令伪指令格式:过程名PROC类型子程序体RET过程名ENDP功能:用来定义一个过程并赋予过程名。若类型为FAR,则为段间调用和段间返回,即调用程序和子程序不在同一代码段内;若类型为NEAR(或默认),则为段内调用和段内返回,即调用程序和子程序在同一代码段内。在代码段内定义延时子程序:DELAYPROC

FAR

;该子程序可以被段间调用MOVCX,8A00HLOP:MOVAX,2000HLOP1:DECAXNOPNOPJNZLOP1LOOPLOPRETDELAYENDP一般情况下,调用程序正在使用的数据(如AX等)在子程序运行结束返回后仍需继续使用。为此,在调用子程序前需要对现场数据进行保护,返回时再恢复现场。这种操作可以在调用程序完成后进行,也可以在执行子程序体之前先将有关寄存器的内容推入堆栈,当子程序执行结束返回主程序之前,再将其内容弹入相应的寄存器中。例如:S1PROCNEARPUSHAXPUSHCX子程序体POPCXPOPAXRETS1ENDP在定义子程序时应注意以下方面。①子程序可以在代码段内直接定义,应位于可执行指令段的最前或最后,但不能插在指令段中间。②若子程序为NEAR属性,则RET指令被汇编为段内返回指令,这样的子程序可以不用过程定义语句,而直接以标号作为子程序的入口。2.子程序调用与返回指令在已定义子程序的基础上,程序中可以通过子程序调用指令调用该子程序。(1)子程序调用指令格式:CALL过程名功能:将当前调用程序的断点CS:IP压入堆栈保存,然后将子程序地址送入CS:IP,转去执行子程序。(2)子程序返回指令格式:RET4.3.6DOS功能调用及应用示例8086可以处理256类中断,指令中通过中断类型号n获取中断处理程序的地址,用户可以直接调用它们(详见第7章)。其中软中断指令INT21H(n=21H)为DOS功能调用,为程序员提供80多个常用子(功能)程序,每个子程序赋予一个功能号,在调用前将相应子程序的功能号送入累加器的高8位AH中。下面主要介绍INT21H指令的功能和应用。DOS功能调用可在汇编语言程序中直接调用,调用步骤如下。①在AH寄存器中设置调用子程序的功能号,如AH=4CH。②根据所调用的功能号设置入口参数到特定的寄存器中(部分调用不带参数)。③执行系统功能调用INT21H指令,转入子程序入口。④子程序运行完毕后,得到出口参数。【例4-10】功能号AH=02H,功能:将寄存器DL中的ASCII字符送至显示器显示。入口参数:AH=02H,DL的内容为字符的ASCII。指令段如下:MOVDL,'A';欲显示字符MOVAH,2INT21H;显示器显示字符“A”【例4-11】功能号AH=9,功能:将DX的内容为当前数据区起始地址的字符串送至显示器显示,字符串以“$”为结束标志。设字符串地址为BUF。入口参数:DS:DX为字符串的首地址。程序段如下。LEADX,BUF;BUF为字符串首地址MOVAH,9INT21H【例4-12】某中断源使用的类型号n=60H,其中断处理程序入口地址为INT60H,把它设置在中断向量表中。在DOS功能调用中将AH=25H的功能为设置中断向量表,其参数如下。设置中断向量:AH=25H。入口参数:AL=中断类型号;DS:DX=中断处理程序的入口地址(要求段地址存入DS,偏移量存入DX)。程序段如下。PUSHDSMOVAX,SEGINT60H;将段基址送入AXMOVDS,AXMOVDX,OFFSETINT60H;将偏移地址送入DXMOVAL,60H;将中断类型号送入ALMOVAH,25HINT21H;25H功能调用POPDS有关DOS功能调用其他功能号的用法参考附录C4.3.7ROMBIOS中断调用及应用示例BIOS(BasicI/OSystem)即基本输入输出系统。在80x86微机系统中,BIOS被固化在以0FE000H开始的8KB的ROM区,又称ROMBIOS。ROMBIOS以中断方式向用户提供底层服务软件。1.主要功能①驱动系统中所配置的常用外设(即驱动程序),如显示器、键盘、打印机、磁盘驱动器、通信接口等。②开机自检,引导装入。③提供时间、内存容量及设备配置情况等参数。计算机上电时,BIOS自动调入内存。2.调用方法使用BIOS中断调用给用户编程带来很大便利,程序员不必了解I/O接口的结构和组成的细节,可直接用指令设置参数,通过指令INTn调用。BIOS中断处理程序的调用步骤如下。①将功能号送入寄存器AH中。②设置入口参数。③通过INTn指令调用BIOS处理程序,n为中断类型号。④分析出口参数及状态。部分BIOS中断调用见表4-3。例【4-13】BIOS中断调用INT16H功能分析。INT16H为键盘中断调用,其中断处理程序有3种功能,功能号为00、01、02。①00号功能调用(从键盘读入1个字符)。指令段如下:MOVAH,00HINT16H;等待(识别)键盘输入②01号功能调用(读键盘缓冲区的字符)。指令段如下:MOVAH,01HINT16H执行后,若ZF=0,表示有键按下,输入字符的ASCII存放在AL中。③02号功能调用(读取特殊功能键的状态)。指令段如下:MOVAH,02HINT16H执行后,将特殊功能键的状态存放在AL中。4.4汇编语言程序的上机过程及仿真

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论