微型计算机原理与应用课件 04.ppt_第1页
微型计算机原理与应用课件 04.ppt_第2页
微型计算机原理与应用课件 04.ppt_第3页
微型计算机原理与应用课件 04.ppt_第4页
微型计算机原理与应用课件 04.ppt_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

1,微型计算机原理及应用,中南大学中国水利水电出版社,2,第4章8086/8088汇编语言程序设计,4.1汇编语言的基本语法,4.1.1汇编语言程序的格式一、基本概念程序是为实现某一特定目的(例如对数据进行某种处理)而编写的一组指令的有序集合。汇编语言程序就使用汇编语言编写的源程序。汇编语言是一种面向机器的语言,它是与计算机硬件密切相关联的,因而熟悉计算机硬件是汇编语言程序员必须具备的条件。与用高级语言编写的程序相比较,汇编语言程序具有更高的效率,它的程序执行时间短且占用内存少,这在计算机实时控制和实时处理中是十分重要的,因而在实时领域得到广泛应用。,3,二、一、汇编语言源程序的特点和格式例:对10个字节数据a1a10求和。DATASEGMENTAT2000HARRAYDBa1,a2,a3,a10COUNTEQU$-ARRAYSUMDW?DATAENDSSTACKSEGMENTPARASTACKSTACKSTAKDB10DUP(?)TOPEQULENGTHSTAKSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,4,START:MOVAX,DATAMOVDS,AXMOVAX,0MOVDI,OFFSETSUMMOVBX,OFFSETARRAYMOVCX,COUNTLOP:ADDAL,BXADCAH,0INCBXLOOPLOPMOVDI,AXMOVAH,4CHINT21HCODEENDSENDSTART,5,汇编语言程序的两个组成特点:分段结构和语句行。1分段结构上例程序共有3段,它们分别是数据段(段名DATA)、堆栈段(段名STACK)和代码段(段名CODE),各段由命令SEGMENT开始,并由命令ENDS结束。2语句行汇编语言程序的语句有两类:指令性语句和指示性语句。(1)指令性语句。指令性语句是主要由指令构成的语句,其格式为标号:操作码操作数,操作数;注释其中操作码和操作数是用助记符表示的指令的两个部分,6,其中带方括号的三项(标号操作数和注释)是任意选用的项,即根据具体编程需要该项可有或没有,当然在实际语句中该项的方括号是不写出来的。标号具有该语句指令所在内存地址的属性,通常在转移指令中用作目的地址。注意,标号必须用冒号“:”结尾,这是语法的规定。用分号“;”开始的注释用来说明该语句在程序中的作用,以方便程序的阅读和修改,这项也是任选的。如上例的第18语句行LOP:ADDAL,BX其中指令是ADDALBX,标号是LOP。LOP在第2l语句行指令LOOPLOP中是转移的目的地址。此语句中未用注释项。,7,(2)指示性语句。指示性语句是主要由命令(亦称伪指令)构成的语句,是用来指示汇编程序进行汇编操作的,其格式为:名字/变量命令参数;注释其中命令指示汇编程序进行某种汇编操作,参数是有关的数据,带方括号的项是任选的。如上例的第1语句行DATASEGMENTAT2000H其中命令SEGMENT指出这是一个段的开始,参数AT2000H指定该段的段基值为2000H,而DATA则是该段的名字。,8,4.1.2常量、标识符和表达式常量、标识符和表达式在汇编语言源程序中经常用到,本节对它们分别作一介绍。一、常量常量是具有一定数值的量,汇编语言程序中的常量有:数字常量、字符常量和符号常量。1数字常量数字常量可用二进制数、八进制数、十进制数或十六进制数表示。所用的数制要用后缀示明:二进制为B、八进制为Q、十进制为D、十六进制为H。对于十进制数可以用后缀D,也可以不用后缀。对于十六进制数,若最高位的数为AF,须在它的前面加上数字0,以表明是数值数据。,9,2字符常量字符常量用带单引号的ASCII字符表示,它所代表的数值就是该字符的ASCII码。例如:A就是41H,1就是31H等。3符号常量为编程方便,程序员在编程时可将一个标识符定义为一个符号常量,它具有一个设定的数值而可被引用。,10,二、标识符标识符是程序员在编程时建立的有特定意义的字符序列,标识符可用作符号常量、名字、变量和标号等。对于标识符,有以下规定:(1)组成标识符的字符有:英文大写字母A、B、Z;英文小写字母a、b、z;数字0、1、2、9;字符?、。(2)标识符的有效长度为不超过31个字符,若超过就忽略其超过部分。(3)除数字以外,所有规定的字符都可作为标识符的第一个字符。(4)问号?不能单独作为一个标识符。(5)不能把保留字用作标识符。保留字包括:指令和命令的助记符,如MOV、SEGMENT等;寄存器名,如AX等;语句中的规定用词,如PTR、LENGTH等。,11,三、表达式表达式由操作数和运算符组成。操作数可为常量、名字、变量和标号等。运算符包括算术运算符、逻辑运算符等很多种。表达式中的运算操作按运算符的优先级别先高后低地依次进行,对于相同优先级则按从左到右的次序进行运算操作。4.1.3指示性语句指示性语句的格式如下:名字/变量命令参数;注释一、程序开始和结束语句程序开始和程序结束语句的命令有NAME、TITLE和END等。1应用命令NAME的程序命名语句命令NAME用来给程序模块命名,其格式为NAME名字其中名字是程序员按标识符规定所取的程序模块名,汇编后它就成为该程序模块的名字了。,12,2应用命令TITLE的标题命名语句若所用汇编语言没有NAME命令,则可用命令TITLE,其格式为TITLE名字则其中由程序员所取的名字在程序的每一页作为标题打印出来。标题的名字最多可有60个字符。若程序没有使用NAME命令,就用标题名字中的前面6个字符作为模块名。注意:程序开始时不用NAME和TITLE命令的语句是允许的,此时可直接由段定义语句开始编写源程序。3应用命令END的程序结束语句程序结束语句的格式为END标号,13,二、段定义语句分段结构是8086/8088的特点,程序和存储器都是按段来组织的。段定义语句用来定义一个段,命令有SEGMENT、ENDS、ASSUME和ORG等。1应用命令SEGMENT和ENDS的段定义语句其格式为段名SEGMENT参数段名ENDS其中段名为程序员编程时按标识符规定为该段所取的名字,在汇编和连接时系统将给该段名的段分配一个具体的段基址。命令SEGMENT和ENDS必须成对使用,它们前面的段名必须是一致的,SEGMENT语句和ENDS语句之间就是该段的内容。,14,2SEGMENT语句中的参数部分SEGMENT语句中的参数共有三项,语句的格式为段名SEGMENT定位类型组合类型类别这三个参数用来设定该段在内存中的位置,且都是任选项。(1)定位类型(align-type)。定位类型用来指定该段段地址的边界条件、定位类型有以下四种:BYTE:该段可从任何地址开始,即段地址=,B,其中表示任意值,即1或0;WORD:该段必须从字的边界开始,即段地址=,0B;PARA:该段必须从节的边界开始,即段地址=,0000B;PAGE:该段必须从页的边界开始,即段地址=,0000,0000B;注意:当定位类型缺省(即不写)时,隐含值为PARA。,15,(2)组合类型(combine-type)。在汇编和连接时,当该段与其他段组合在一起时,组合类型用来设定该段与其它段的连接关系,组合类型有以下六种:PUBLIC:该段连接时将与其他同名段依次连接起来,其连接次序由连接程序确定;COMMON:该段连接时将与其他同名段有相同的段基址,即共享相同的存储空间,亦即各段会产生覆盖,但可节省内存容量;ATexp:使段基值等于按表达式exp计算所得的16位数。必须指出,对于代码段不能用ATexp来设定段基值;STACK:仅用于堆栈段,使同名段都从同一段基址开始;MEMORY:指定该段在同名段的最后,即该段在同名段中位于最高的地址空间,若连接时有几个组合类型为MEMORY的段,则只有最前面(最先遇到)的段按组合类型MEMORY处理,其他段均按组合类型PUBLIC处理;NONE:表示本段与其它段逻辑上不发生关系,各段都有自己的段基址。注意:当组合类型缺省(即不写)时,隐含值为NONE。,16,(3)类别(class)。类别必须用单引号括起来。在定位时,连接程序将各程序模块中具有相同类别的逻辑段集中在一起,形成一个统一的物理段。3应用命令ORG的偏移地址定位语句程序中有时需要指定某一语句所在内存单元在段内的偏移地址,这可用ORG命令的语句来实现,语句的格式为ORGexp其中表达式exp,可计算得出16位地址。此时ORG语句的下一个语句所在内存单元在段内的偏移地址就被指定为按表达式计算得出的16位地址。,17,4用命令ASSUME示明段寄存器内容的语句一个程序通常由很多段组成,对于某一代码段,它所用到的数据段、附加段和堆栈段只是程序中的某几个有关段,因此在代码段开始时必须用ASSUME命令语句示明该代码段所用到的段,以便进行汇编。ASSUME命令语句紧跟在SEGMENT命令语句之后,其格式为ASSUMECS:段名1,DS:段名2,ES:段名3,SS:段名4其中段名l、2、3和4分别为该代码段所用到的作为代码段、数据段、附加段和堆栈段的段的段名,亦即将这些段的段基值1、2、3和4作为段寄存器CS、DS、ES和SS的内容。注意:在ASSUME语句中示明的段寄存器和相应的段名是该代码段中实际用到的,对于该代码段中未用到的段寄存器及相应的段名是不需示明的。,18,三、过程定义语句过程是程序的一部分,即子程序。过程可用程序中的CALL指令调用。当过程中的指令执行完后,用RET指令返回调用它的程序。应用命令PROC和ENDP的过程定义语句的格式为过程名PROC类型RET过程名ENDP过程名是程序员编程时按标识符规定取定的。类型表明该过程是代段内调用,还是供段间调用,对于前者用NEAR表示,而后者则用FAR表示,当类型项缺省(即不写明)时,隐含值为NEAR。,19,四、数据定义语句数据定义语句用来为数据分配存储单元。数据定义语句的格式为变量命令参数l,参数2,;注释其中变量是由程序员在编程时按标识符规定取定的,如ARRAY、BUFFER、SUM等,一般都是按照数据的功用取名的。命令的表示符号(助记符)及功能为DB:定义长度为1字节(8位)的数据(字节数据)。DW:定义长度为1个字(16位)的数据(字数据)。DD:定义长度为2个字(32位)的数据(双字数据)。DQ:定义长度为8字节(64位)的数据(8字节数据)。DT:定义长度为10字节(80位)的数据(10字节数据)。,20,五、符号定义语句符号定义语句的命令有EQU、=和PURGE。1应用命令EQU和PURGE的符号定义语句应用EQU命令的语句的格式为名字EQUexp其中名字是程序员取定的,表达式exp可以计算得出一个具体的数值。这实际上就是给名字赋值,在程序中就可引用这个名字来表示表达式的实际计算值。2应用命令=的符号常量定义语句其格式为名字=exp命令=的功能与EQU类似,唯一的差别是命令=可随时对名字(符号常量)赋新值,而不必使用PURGE命令。,21,六、名字和变量1名字前面已讨论过的名字有文件名、标题名、段名、过程名和符号常量等,它们都是程序员编程时按标识符规定采命名的,其中有些名字可在编程时引用,以方便编程。(1)段名。段名是在源程序的段定义语句中命名取定的,如段定义语句DATASEGMENT,段名为DATA。(2)过程名。过程名是在源程序的过程定义语句中命名的。如过程定义语句SORTPROCNEAR,过程名为SORT。汇编连接源程序时,系统分配给过程一个地址,即该过程第一条指令所在内存单元的地址,亦即该过程的入口地址,这也就是调用该过程的CALL指令中的目的地址。,22,(3)符号常量。符号常量是在源程序的符号常量定义语句中命名取定的,如符号常量定义语句COUNTEQU20将数值20赋给COUNT。COUNT就可在指令中作为常量20被引用,如MOVAL,COUNT就相当于MOVAL,20。例4-8部分程序内容为DATASEGMENTARRAYDB10H,24H,5AH,0C7H,98H,ABCDECOUNTEQU$-ARRAYMAXDB?DATAENDS其中第3语句行为给符号常量COUNT赋值的语句,句中表达式为$-ARRAY,其计算值就是赋给COUNT的常量数值。下面先讨论表达式中$和ARRAY的含义及具体值,然后由表达式计算出赋给COUNT的具体数值。,23,变量ARRAY所在语句中的第1个数据10H所在内存单元的偏移地址为0000H,也就是该数组的起始地址,后续数据依次存在后续偏移地址的内存单元中,最后一个数据E所在内存单元的偏移地址为0009H。变量ARRAY所在语句的起始偏移地址为0000H,这就是变量ARRAY的偏移地址属性(注:变量的属性将在下面详细讨论)。由于ARRAY语句的末地址为0009H,故下一语句行(COUNT语句行)所在的偏移地址就是000AH,此语句中的$就是该行(当前行)的偏移地址,即000AH。故表达式可计算得出为$-ARRAY=000AH-0000H=000AH=10,24,2变量(1)变量的定义和属性。如前所述,变量是数据定义语句中的一项,它是由程序员在编程时按照标识符规定取定的。当在数据定义语句的第一项对变量命名后,该变量就是已定义了的,已定义的变量具有下列五种属性:段属性表示格式:SEG变量它表示变量所在段的段基值。移地址属性表示格式:OFFSET变量它表示变量所在处的偏移地址类型属性表示格式:TYPE变量它表示变量所在内存数据的类型。数据类型有字节、字、双字、8字节和10字节,是在该语句中用命令DB、DW、DD、DQ和DT予以定义的。,25,长度属性表示格式:LENGTH变量它表示变量所在数组的数据元素个数。需注意,只有当数据用复制符DUP定义时,LENGTH才等于数组的元素个数,否则LENGTH就等于1。规模属性表示格式:SIZE变量它表示变量所在数组的字节总数,且SIZE=LENGTHTYPE。同以上LENGTH的情况,只有当数据用复制符DUP定义时,LENGTH才等于数组的元素个数,否则LENGTH就等于l。,26,(2)属性运算符。定义了的变量具有一定的属性。对变量属性的引用可方便程序员的编程工作。但变量的类型属性有时会限制它的应用。设数据定义语句为:BUFWDW1234H,5678H其中变量BUFW的类型属性为字,编程时可很方便地用指令:MOVAX,BUFW将字数据1234H传送到寄存器AX。类型(重新)指定运算符PTR格式:类型PTRexp其中类型可以是BYTE、WORD、DWORD、NEAR和FAR(注:前三个是变量的类型属性,后两个是标号的类型属性);exp是表达式,是存储器操作段,当为变量重新指定类型时exp就是变量名。,27,属性指定运算符THIS格式:THIS类型类似于上节PTR运算符的应用。THIS和EQU一起用来定义一个新变量,它与原变量具有相同的段属性和偏移地址属性,但类型属性不同。命令LABEL格式:变量/标号LABEL类型命令LABEL用来定义其语句中的变量(或标号)的类型属性为语句中设定的类型,此时变量(或标号)的段属性和偏移地址属性是由该语句的位置确定的。,28,4.1.4指令性语句指令性语句由指令组成。指令性语句是构成代码段的基础。指令性语句只是在代码段中才有,在数据段、附加段和堆栈段中是没有指令性语句的。指令性语句的格式为标号:操作码操作数;注释,29,一、标号标号是程序员编程时按标识符规定取定的,并常常具有它在程序中的作用的含义,如NEXT、AGAIN等,并且标号一定要用冒号(:)结尾。在指令性语句中写上标号后,就定义了该标号,定义了的标号具有下列三种属性。1段属性表示格式:SEG标号它表示标号所在段的段基址。2偏移地址属性表示格式:OFFSET标号它表示标号所在位置的偏移地址,即该语句的指令的第一字节所在内存单元的偏移地址。3类型属性表示格式:TYPE标号,30,二、操作数指令中的操作数可按寻址方式表示。操作数也可以用段名、符号常量、变量、属性、过程名和标号来表示,如下例所示MOVAX,DATA;DATA是段名,立即寻址方式MOVCX,COUNT;COUNT是符号常量,立即寻址方式MOVBL,BUFFER;BUFFER是变量,直接寻址方式MOVSI,OFFSETARRAY;OFFSETARRAY是属性,立即寻址方式CALLSBRTl;SBRTl是过程名,直接寻址方式JMPDONE;DONE是标号,直接寻址方式LOOPAGAIN;AGAIN是标号,直接寻址方式,31,4.1.5宏指令一、宏定义、宏名字、宏调用和宏展开宏定义就是定义宏指令,宏定义的命令是MACRO和ENDM。宏定义的格式为宏名字MACRO形式参数ENDM其中宏名字是宏指令的名字,是程序员按标识符规定取定的。命令MACRO和ENDM之间的指令序列就是该宏指令的内容,称为宏体。带方括号的形式参数是任选项,当无形式参数时就无该项,当有多个形式参数时相互间由逗号隔开。形式参数亦称哑参数、哑元或变元,它是宏体中有关指令的操作码、操作数或它们的一部分。形式参数是没有物理意义的,只有用实参数代替形式参数后,相应的指令才有实际意义。宏调用的格式是:宏名字实参数其中实参数是与宏定义中的形式参数一一对应的。,32,二、宏指令与子程序的差别(1)宏指令简化了源程序的书写。但在汇编时,汇编程序对宏指令的汇编处理是将宏指令的宏体(即程序段)原原本本地插入到宏指令调用处,然后转换成机器码生成目标程序。(2)采用子程序方式时,每调用一次就需执行一次CALL和RET指令,而宏指令方式时,并无此两条指令。因此,使用宏指令时的程序执行时间比子程序时的程序执行时间要短一些,即宏指令时程序执行速度快。一般,对于程序段较长的情况,采用子程序可节省很多内存而对执行速度影响不大;对于程序段较短的情况,采用宏指令可加快速度而对增加占用内存容量影响不大,尤其对于程序段较短而形式参数较多的情况,宏指令就更能显示其突出的优点了。,33,4.2汇编语言程序设计的基本方法一、程序设计的步骤从具体问题到编好程序要经过如下基本步骤:1分析课题弄清问题的性质、目的,已知数据,运算精度以及速度等方面的要求。2确定算法把实际问题转化为计算机求解的步骤和方法,即算法,而程序是用来描述算法的。3画流程图流程图是算法的一种直观而形象的表示方法,是对程序执行过程的一种形象化的描述,又称为框图。4编写程序熟悉8086/8088的指令系统及程序设计常用技巧按流程图编写程序。要求做到简单明了、层次清晰、运算迅速、少占内存。要编写高质量的汇编语言程序,必须加深对指令系统功能的理解,注意内存工作单元和工作寄存器的分配。5上机调试、修改可以通过单板机或系统机进行调试、修改直至通过。,34,二、程序的基本结构程序的基本结构有四种:顺序结构,分支程序结构,循环程序结构,子程序结构。4.2.2顺序结构程序顺序结构的程序又称简单程序,这种结构的程序是顺序执行的,无分支,无转移,无循环,程序本身的逻辑很简单,它只依赖于计算机能够顺序执行指令(语句)的特点,只要语句安排的顺序正确即可。例:教材例、,35,4.2.3分支结构程序一、分支程序的二要素分支结构程序是具有判断和转移功能的程序。1判断根据运算结果的状态标志判断前一定要经过运算(能影响状态标志的运算),状态标志反映了运算结果的特性。这些状态标志是:进位标志CF、奇偶标志PF、零标志ZF、符号标志SF以及溢出标志OF。2转移主要由条件转移指令来实现(也可用无条件转移指令JMP)在8086/8088的指令系统中,条件转移指令可分为两大类,一类是按单标志位来判断的,如JAE,JC,JZ,JO,JS等;另一类是按多标志位来判断,如JGE,JG,JA等。,36,二、利用比较转移指令实现分支这是实现分支的一种常用方法,用于比较、判断的指令是CMP(比较指令)、CMPS(串比较指令)以及SCAS(串搜索指令)等。转移指令已如前述。而分支的次数可由具体问题决定是单重分支还是多重分支。n次判断可形成n+l路分支。,37,例4-14符号函数的处理,38,设给定值X存放于XX单元,函数Y值存放于YY单元,则按X的不同取值给Y赋值的程序如下:MOVAL,XXCMPAL,0JGEBIGRMOVAL,0FFHMOVYY,AL;X0时,1送入YY单元HLTEQUL:MOVYY,AL;X=0时,0送入YY单元HLT,39,三、利用跳转表实现分支1跳转表的建立在内存的一个连续区中,连续存放一系列跳转地址、跳转指令或关键字,组成一个决定程序分支的跳转表。例4-162跳转表的使用3根据跳转表内指令分支在计算机系统的监控程序,键盘管理程序中经常要用到跳转表。在跳转表中既可存入跳转地址(如例4-16),也可存放一系列的跳转指令JMP。,40,4.2.4循环结构程序一、概述1循环程序实现重复执行某一段程序的程序结构称为循环程序。用来处理带重复性的问题,可以缩短源程序及目标程序。循环程序由五部分组成:(1)初始化部分这是循环的准备部分,为程序操作、地址指针、循环计数、结束条件等设置初始值。(2)循环工作部分这是循环程序的主体,完成程序的基本操作,循环多少次,这部分的语句就执行多少次。(3)循环修改部分修改循环工作部分的变量地址等,为下一轮重复操作作准备。(4)循环控制部分修改计数器或判断循环结束条件以决定是继续循环还是终止循环,是典型的分支结构,不过继续循环的分支去向是循环体的头部。通常把循环工作部分称为循环体,循环体的第一条指令为循环体的头部。(5)循环结束部分循环终止后,对循环结果的处理部分。,41,42,3循环程序分类(1)按循环控制条件分类计数循环重复次数已知,用计数值控制循环的开始与终止。条件控制循环重复次数未知或不确定,需找出循环控制的条件。(2)按循环体内结构分类单重循环循环体内只是顺序程序或分支程序,不再有循环程序。多重循环循环体内再套有循环程序。可把重复处理部分独立出来,前面加上循环准备,后面加上结束判断。4循环程序设计要点循环程序设计要点可归结为两点:(1)怎样把求解的问题变为循环结构的程序类型怎样实现重复,即计算方案的循环化。这里循环工作部分的设计尤为重要,因为这是多次重复的部分,注意程序的精炼,以及循环体头部的确定。(2)怎样使循环准确地执行完毕,这就要注意循环控制部分的设计。特别是对条件控制的循环,注意设置循环结束标志。,43,二、循环程序举例例4-17例4-18例4-19例4-20,44,4.2.5子程序一、概述1子程序结构如果在一个程序中的多个地方或在多个程序中都要用到同一段程序,可以把该程序段独立出来存放在内存的某一区域以供其他程序调用,这段程序称为子程序或过程。可见子程序是可供其他程序调用的独立的、相对固定的程序段。调用子程序的程序体称为主程序或调用程序。在实用中总把常用的子程序标准化后存放在一个内存区中,称为“子程序库”。,45,(1)结构。子程序的第一个语句前必须有“过程名”入口地址的符号表示,出口是返回指令RET。(2)调用与返回。主程序通过书写调用指令CALL后跟子程序的入口地址来调用子程序,8086/8088允许子程序在现行代码段中(子程序名为NEAR类型),也可以不在现行代码段中(子程序名为FAR类型)。为了保证正确返回,RET指令的类型,必须与CALL指令的类型相匹配。调用指令中的目标地址有两种表示方法:直接调用,目标地址就在指令中。间接调用,目标地址在由指令指定的寄存器或内存单元中。返回指令RET也有两种情况:l段内返回指令,把SP所指的堆栈顶部的一个字的内容弹回IP,SP加2。段间返回指令,把SP所指的堆栈顶部的两个字的内容,先弹回IP,后弹回CS,SP加4。,46,2子程序文件子程序应以文件形式编写,子程序文件由子程序说明和子程序构成。(1)子程序说明。子程序说明包括如下部分:功能描述:包括子程序名称、功能,以及性能指标(如执行时间)等。所用寄存器和存储单元。子程序的入口、出口参数。子程序中又调用的其他子程序。调用实例(可无)。(2)子程序。在8086/8088中,子程序本身常以过程形式存放在代码段中,以一个过程名开始,以RET指令结束。,47,3子程序应用中应注意的问题(1)主程序与子程序的连接。(2)子程序中所用寄存器及工作单元内容的保护。为了不破坏原有信息,对于在子程序中要用到的某些寄存器和存储单元的内容,必须压人堆栈加以保护,也可存人一些空闲单元或某些目前不用的寄存器中。称为现场信息的保护。(3)参数的传递。主程序与子程序通常需要交换信息,在多数情况下主程序需要向了程序传递参数,子程序执行的结果要传送给主程序。子程序清单中的入口参数使子程序可对不同的数进行处理,出口参数可送出不同的结果。参数传递一般有三种方法:用寄存器传递,适用于参数较少的情况;用参数表传递,适用于参数较多的情况,要求事先建立参数表,参数表一般建立在内存中;用堆栈传递,适用于参数多并且子程序有嵌套,递归调用的情况,主程序将参数压人堆栈,子程序中将参数从堆栈中弹出。,48,4子程序嵌套和子程序递归(1)子程序嵌套。子程序调用别的子程序称为嵌套,嵌套的层次只受堆栈空间的大小的限制。(2)子程序递归。子程序直接或间接地调用子程序自身,称为递归。二、子程序结构举例例4-21数据段定义了两个数组ARYl和ARY2,编一程序分别求此两数组之和。主程序和过程分别安排在两个不同的段中,因此过程应是FAR类型。,49,4.3DOS系统功能调用和ROMBIOS中断调用3.3.1系统功能调用一、概述DOS(DiskOperatingSystem,磁盘操作系统)为程序设计者提供了许多可直接调用的功能子程序,这些功能子程序的主要功能是:(1)磁盘的读写、控制。(2)内存管理、文件操作和目录操作。(3)基本输入输出管理(如键盘、打印机、显示器、磁带等管理),另外还有时间、日期等子程序。二、调用方法为了使用的方便,所有子程序已按序编号一功能号,从00H68H,调用时,使用如下调

温馨提示

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

评论

0/150

提交评论