书签 分享 收藏 举报 版权申诉 / 128
上传文档赚钱

类型《微型计算机原理及应用》课件第5章.ppt

  • 上传人(卖家):momomo
  • 文档编号:7882560
  • 上传时间:2024-08-30
  • 格式:PPT
  • 页数:128
  • 大小:561.50KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《《微型计算机原理及应用》课件第5章.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    微型计算机原理及应用 微型计算机 原理 应用 课件
    资源描述:

    1、1 1第5章 汇编语言程序5.1 汇编语言语法汇编语言语法5.2 汇编语言程序设计汇编语言程序设计本章小结本章小结2 2本章学习目标本章学习目标 明确汇编语言源程序的格式。了解汇编语言程序设计步骤。掌握常用伪指令的用法。掌握顺序、分支、循环和子程序的设计方法。用汇编语言(指令)编写的程序称为汇编语言源程序。在不发生混淆时,也称为汇编语言程序。汇编语言程序设计就是汇编语言源程序设计。3 35.1.1 汇编语言程序的格式汇编语言程序的格式下面给出的是汇编语言程序的基本格式:;数据段DATASEG SEGMENTDB?;伪指令 ;定义数据存储单元DATASEG ENDS5.1 汇编语言语法汇编语言语

    2、法4 4;代码段CODESEG SEGMENT ASSUME CS:CODESEG,DS:DATASEGSTART:MOV AX,DATASEG ;(机器)指令 MOV DS,AX ;程序功能(片)段 MOV AX,4C00H ;DOS调用参数,程序正常结束5 5 INT 21H;DOS调用,返回操作系统CODESEG ENDS END START6 6由此可见:(1)汇编语言程序的语句除(机器)指令(第4章介绍的指令系统)外,还包括伪指令和宏指令(宏指令本书不予介绍)。(2)汇编语言程序有规定的书写格式。汇编语言程序是由各个段(SEGMENTENDS)组成的,DATASEG和CODESEG是

    3、段的名字。其中具有(机器)指令的段为代码段,它是一个完整汇编语言程序必须具有的段。而具有伪指令,不具有(机器)指令的段多为数据段(附加数据段)或堆栈段,根据具体应用不同,这些段可有可无。7 75.1.2 汇编语言指令格式汇编语言指令格式汇编语言源程序中每条指令由4项组成,格式如下:名字:操作数1,操作数2,操作数3 ;注释说明:项是可选项,项是必选项。4项都不区分大小写,但前3项区分中文和英文。一般要用英文书写。8 81.名字名字名字可由字母(AZ)、数字(09)及专用字符(?、-、$等)组成,最多可识别31个字符。名字不能以数字开头,不能与助记符相同。为便于记忆,名字的定义应使人见名知义。一

    4、般来说,名字可以是标号、变量、子程序名或过程名。9 91)标号标号由名字和冒号组成,且名字后面跟着冒号(录入程序时,冒号一定要用英文半角输入)。标号可在代码段定义,也可以用伪指令定义。标号具有3种属性:段属性、偏移属性及类型属性。(1)段属性定义标号的段起始地址,此值必须在一个段寄存器中,而标号的段总是在CS寄存器中。(2)偏移属性是指标号的偏移地址是从段起始地址到定义标号的位置之间的字节数(无符号数)。10 10(3)类型属性指出标号是在本段内引用还是在其它段中引用。在本段引用为NEAR,即近属性;在段外引用为FAR,即远属性。8088/86中,NEAR为16位,FAR为32位。11 112

    5、)变量变量在数据段或附加数据段中定义,后面不跟冒号。变量经常作为操作数出现。它与标号一样也有段、偏移及类型3种属性。所不同的是变量的段一般是在DS或ES寄存器中,类型属性是字(WORD)和字节(BYTE)。12 122助记符助记符助记符可以是指令、伪指令和宏指令。对于指令,汇编程序将其翻译为机器语言指令;对于伪指令,汇编程序将根据其所要求的功能进行处理;对于宏指令,汇编程序将根据其定义展开。13 133操作数操作数指令中的操作数是完成指令操作所需要的操作对象。对于指令,可以有一个操作数、多个操作数或没有操作数;对于伪指令和宏指令,可以有一个或多个操作数。当指令有多个操作数时,操作数之间用逗号分

    6、开。操作数可以是常数和表达式。14 141)常数常数分为数值常数、字符常数和符号常数。(1)数值常数可以是不同进制的数。如101 B、15(D)、47Q、0C6H(字母开头的数值前面加0,以免和符号常数混淆)等。(2)字符常数可以是单个字符或字符串,如B、CHINA等。(3)符号常数是用符号代替数值,但需要定义,如COUNT EQU 10,ADDR=1000H。15 152)表达式表达式是由运算对象和运算符组成的式子,分为数值表达式和地址表达式。数值表达式的运算结果为一个数;地址表达式的运算结果为存储单元的地址。算术运算符有+、-、*、/和MOD(取余),逻辑运算符有AND、OR、XOR和NO

    7、T,关系运算符有GT、GE、EQ、LE、LT和NE。例如:LEA BX,DISP+2MOV AX,1000+4*2AND AL,65H OR 0FHMOV CX,86 GE 5816 16都是合法的汇编语言表达式。其中逻辑运算符只能用于数值表达式中。这些运算符的功能是在汇编阶段完成的,和指令助记符中的运算不同。指令助记符中的运算是在程序执行阶段完成的。17 173)数值回送操作符数值回送操作符主要有TYPE、LENGTH、SIZE、OFFSET、SEG等。它们将一些特征或存储器地址的一部分作为数值回送。下面举例说明它们的用法(参考5.1.3节进行阅读)。设:N1 DB 3,4N2 DW 5,8

    8、N3 DB 20 DUP(?)18 18 TYPE 表达式MOV AL,TYPE N1 ;(AL)=1MOV AH,TYPE N2 ;(AH)=2 LENGTH 变量MOV AL,LENGTH N1 ;(AL)=1MOV AH,LENGTH N2 ;(AH)=1MOV CX,LENGTH N3 ;(AH)=20 SIZE 变量MOV AX,SIZE N1 ;(AX)=1MOV CX,SIZE N2 ;(CX)=1SIZE的返回值是TYPE与LENGTH之积。19 19 OFFSET 变量或标号MOV BX,OFFSET N1MOV SI,OFFSET N2汇编程序将回送变量或标号的偏移地址值。

    9、与之等价的两条指令为:LEA BX,N1LEA SI,N2 SEG 变量或标号 MOV BX,SEG N1MOV SI,SEG N2汇编程序将回送变量或标号的段地址值。20204)属性操作符属性操作符主要有PTR、段操作符、SHORT、THIS、HIGH、LOW等。下面仅介绍前两个操作符。其它的操作符可查阅相关的参考书。设:N1 DB 3,4N2 DW 5,8 类型PTR 表达式MOV AX,WORD PTR N1MOV BL,BYTE PTR N2 21 21 段寄存器:变量或表达式MOV AL,CS:N1MOV BX,ES:N2正常情况下,系统默认为数据段(DS)中定义N1和N2。但用段操

    10、作符后,就不再是数据段,临时改为段操作符指定的段取值。22224注释注释注释一定由分号开始,放在指令的后面或单独占行。注释为可选项,其目的是增加程序或指令的可读性。注释对程序或指令的执行不起任何作用,即汇编时不会产生机器码。23235.1.3 伪指令伪指令伪指令不是由机器(CPU)执行的,而是由软件(汇编程序)处理的。伪指令用于定义数据、分配存储区、定义符号常数、选择CPU处理器及指示程序结束等。1.定义数据伪指令定义数据伪指令伪指令格式:变量 助记符 操作数,操作数功能:为操作数分配存储单元,并用变量与存储单元建立联系。2424其中,变量可有可无。如有变量,则汇编程序使其记为第一个字节的偏移

    11、地址。助记符即伪指令,用于定义数据的类型。常用的数据定义伪指令有以下几种:(1)DB,用于定义字节,其后的每个操作数都占一个字节的存储单元。(2)DW,用于定义字,其后的每个操作数都占一个字(16位)的存储单元。其低位字节(低8位)在第一字节地址中,高位字节(高8位)在第二字节地址中。(3)DD,用于定义双字,其后的每个操作数都占两个字(32位)的存储单元。其低位字(低16位)在第一字地址中,高位字(高16位)在第二字地址中。2525(4)DF,用于定义3个字,其后的每个操作数都占48位。此伪指令只能用于386及其后继机型中。(5)DQ,用于定义4个字,其后的每个操作数都占64位。(6)DT,

    12、用于定义10个字节,其后的每个操作数都占80位。这些伪指令将其后跟着的数据存入指定的存储单元,形成初始化数据;或只分配存储单元而不存入确定的数值,形成未初始化的数据空间。DW和DD可存储地址(数据)。下面举例说明它们的用法。2626例例5.1 定义一个字节和一个字,并使其值分别为20和386。DB 20 DW 3862727例例5.2 给出下列定义的存储空间分配图。NUM1DB 5,ABC NUM2 DW 20 DB?,-1 DB C存储空间分配见图5.1。伪指令DB?表示只定义一个字节单元,其值不定,与图5.1中NUM2+2/NUM1+6存储单元对应。另外,负数在计算机中用其补码表示。当要求

    13、定义一段连续的存储单元时,可用复制操作符(DUP)复制某个(些)操作数。其用法如下。2828图5.1 例5.2存储空间分配2929例例5.3 给出下列定义的存储空间分配图。DB 2 DUP(1,?)DW 100 DUP(0)存储情况如图5.2所示。3030图5.2 例5.3存储空间分配31 312.定义段伪指令定义段伪指令伪指令格式:段名(字)SEGMENT 段名(字)ENDS功能:定义一个段。其中,必须有段名,段名命名规则同名字。省略号部分,对于数据段、附加数据段和堆栈段,一般是存储单元的定义、分配等伪指令操作;对于代码段,则是指令及伪操作。3232此外,定义代码段时,还必须明确段和段寄存器

    14、的关系,可用ASSUME伪指令来实现,其格式如下:ASSUME 段寄存器:段名(字),段寄存器:段名(字)3333例例5.4 编写完整的汇编语言程序求两个16位二进制数的和。分析:题中未指明两个数存放在哪里,故分两种情况。两个数存放在寄存器中(AX和BX)或为立即数,结果和存放在寄存器中(CX)。程序如下:MYCODE SEGMENT ASSUME CS:MYCODESTART:MOV AX,1234 MOV BX,6789 ADD AX,BX 3434 MOV CX,AX MOV AH,4CH INT 21HMYCODE ENDSEND START ;END后可无START3535 两个数存

    15、放在存储单元中,结果和也存放存储单元中。此时必须用伪指令分配存储单元,程序如下:MYDATA SEGMENTN1DW 6789 N2 DW 1234 SUM DW?MYDATA ENDS;代码段MYCODE SEGMENTASSUME CS:MYCODE,DS:MYDATASTART:3636MOV AX,MYDATA MOV DS,AX MOV AX,N1ADD AX,N2 MOV SUM,AX MOV AH,4CHINT 21HCODESEG ENDSEND START ;END后可无START由此可见,完整的汇编语言程序必须有代码段,而其它段不一定有。37373.程序结束伪指令程序结束伪

    16、指令伪指令格式:END 名字功能:汇编程序遇到该指令时就结束汇编。其中,名字表示程序开始执行的起始地址,因此此名字相当于标号,所以伪指令格式END后可写标号,但若写名字,则其后不用冒号。如果有多个程序模块连接,主程序使用名字,其它子程序模块只用END,而不用名字。只有一个程序模块时,可不用名字,参见例5.4。38384.定义符号伪指令定义符号伪指令当程序中多次使用同一个值或表达式时,为方便和提高程序可读性,可用赋值伪操作为表达式赋予一个名字。1)等价伪指令(EQU)伪指令格式:EQU 功能:给符号名定义一个值,赋予另一个名字、表达式或助记符。3939例例5.5 COUNT EQU 300;CO

    17、UNT=300PI EQU 3.14 ;PI=3.14ALPH EQU COUNT+2 ;ALPH=302MOV CX,COUNT ;(CX)300 40402)等号伪指令(=)伪指令格式:=功能:将表达式的值赋给符号名。41 41例例5.6 COUNT=8 ;COUNT=8COUNT=COUNT+2 ;COUNT=10ALPH=COUNT+2 ;ALPH=12“=”与“EQU”的区别是:对于一个符号名,“EQU”只能赋值一次,而“=”可多次赋值。42423)解除等价伪指令(PURGE)伪指令格式:PURGE 功能:解除EQU指定符号的定义,可用EQU对符号重新定义。4343例例5.7 COU

    18、NT EQU 300PURGE COUNTCOUNT EQU 20044445.处理器选择伪指令处理器选择伪指令伪指令格式:.处理器功能:选择不同的处理器,其指令集有所不同。4545例5.8 .8086 ;选择8086指令系统.386P ;选择保护模式下386指令系统.586 ;选择Pentium指令系统46466.地址计数器地址计数器在汇编程序时,汇编程序使用地址计数器保存当前正在汇编的指令的偏移地址。当开始汇编或在每一个段开始时,计数器初值始化为0,在以后汇编过程中,每处理一条指令,地址计数器就增加一个值,此值为该指令的字节数。地址计数器的值用“$”表示。汇编语言允许用户使用“$”引用地址

    19、计数器的值如:NUM DW 4,2+$,84747汇编时,若NUM分配的地址偏移量为10H,则数据的第1项值为4,数据的第2项值为14H,数据的第3项值为8;再如:JMP$+20汇编时,JMP指令的地址偏移量为2000H,则此$值为2000H,执行该条指令后,程序转移到偏移地址为2014H的指令处执行。48487.定位伪指令定位伪指令伪指令格式:ORG 功能:设置当前地址计数器($)的值。4949例例5.9 DATA SEGMENTORG 10NUM DB 20,1 DW?DATA ENDSORG 10使NUM的偏移地址不是0000H,而是000AH。50505.2.1 汇编语言程序设计的基本

    20、步骤汇编语言程序设计的基本步骤一般编写汇编语言程序的步骤如下:分析要求,确定算法。此步决定程序的质量。根据算法,画出流程图。此步对初学者很重要。根据流程图编写程序。上机调试程序。5.2 汇编语言程序设计汇编语言程序设计51 51本节举例说明上述前三个步骤,第步由读者自行完成。本书所讨论的编程环境只限于实模式。此处先介绍一下流程图。流程图可直观地表达程序设计思路,是算法的具体体现。流程图一般有五种成分,如图5.3所示。5252图5.3 流程图的组成成分5353(1)执行框表示一段或一个模块的功能。(2)判断框对给定的条件进行判断,根据条件成立与否决定如何执行其后的操作。因此它有一个入口,多个出口

    21、。(3)开始框和结束框表示程序的起始和终止。(4)指向线表示程序执行的顺序。(5)连接点用于将画在不同地方的流程连接在一起。框内外要有说明文字。程序有顺序、分支、循环和子程序四种结构形式,对应不同的流程图。下面分别介绍四种结构的汇编语言程序设计。54545.2.2 顺序程序顺序程序顺序程序结构完全按指令存放顺序逐条执行指令序列。实际上这种结构在任何一个程序中都存在,作为程序的一部分(程序段落)。一般只有顺序结构的程序都比较简单,其流程图如图5.4所示。5555图5.4 顺序结构流程图5656例例5.10 将2个用ASCII码表示的十进制数转换为对应的数值。设此2个数存放在存储单元,转换后存入储

    22、单元。程序如下:DATA SEGMENTN DB 38H,32HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA5757 MOV DS,AX AND N,BYTE PTR 0FH AND N+1,BYTE PTR 0FH MOV AX,4C00H INT 21HCODE ENDS END START58585.2.3 分支程序分支程序 1.分支程序的结构形式分支程序的结构形式当解决问题要求根据不同条件采用不同方法时,在计算机程序设计中就表现为分支结构的程序设计。分支程序结构有两种形式,如图5.5所示。图5.5(a)相当于高

    23、级语言中的if-else语句,图5.5(b)相当于高级语言中的case语句。if-else具有两个分支,case具有多个分支。它们的共同点是:执行方向不变;在某一特定条件下,只能执行一个分支。5959图5.5 分支结构流程图60602.分支程序设计方法分支程序设计方法程序的分支一般用条件转移指令实现。例例5.11 将一位用ASCII码表示的十六进制数转换为对应的数值。程序流程如图5.6所示。61 61图5.6 例5.11程序流程图6262程序如下:DATA SEGMENTACS DB 45HNUM DB?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAST

    24、ART:MOV AX,DATA MOV DS,AX MOV AL,ASC6363SUB AL,48CMP AL,10JC DONESUB AL,7DONE:MOV NUM,AL MOV AX,4C00H INT 21HCODE ENDS END START6464例例5.12 编写如下符号函数的计算程序:程序流程如图5.7所示。1 x0y0 x=01 x06565图5.7 符号函数流程6666设x和y的偏移地址分别为X和Y,程序如下:DATA SEGMENTX DB 12Y DB?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,D

    25、ATA MOV DS,AX CMP X,BYTE PTR 06767 JG GREAT JL LESS MOV AL,0 JMP DONEGREAT:MOV AL,1 JMP DONELESS:MOV AL,-1DONE:MOV Y,AL MOV AX,4C00H INT 21HCODE ENDS END START6868例例5.13 多分支结构的汇编语言程序:根据变量BR_N中的值(03),实现4路分支。此程序利用跳转表(查表法)实现多分支的功能。程序如下:BRDATA SEGMENTBR_TAB DD SUB0 DD SUB1 DD SUB2 DD SUB36969BR_N DW?BRD

    26、ATA ENDSBRCODE SEGMENTASSUME CS:BRCODE,DS:BRDATASTART:MOV AX,BRDATAMOV DS,AXMOV AX,BR_NMOV CL,4MUL CL7070LEA BX,BR_TABADD BX,AXJMP DWORD PTR BXBRCODE ENDSROUTINE SEGMENTASSUME CS:ROUTINESUB0:JMP DONESUB1:71 71JMP DONESUB2:JMP DONESUB3:DONE:MOV AX,4C00HINT 21HROUTINE ENDSEND START72725.2.4 循环程序循环程序1.

    27、循环程序的结构形式和结束条件循环程序的结构形式和结束条件循环程序分为两种结构形式:do-while结构形式和do-until结构形式,如图5.8所示。图5.8(a)为do-while结构形式,此结构先判断循环条件是否满足,满足执行循环体,直到不满足才跳出循环体;图5.8(b)为do-until结构形式,此结构先执行循环体,再判断循环结束条件是否满足,直到满足才跳出循环体。两者的区别是do-until结构循环体至少被执行一次。7373图5.8 循环结构流程图74742.循环程序设计循环程序设计循环程序一般由三部分组成:循环初始化、循环体和循环控制部分。(1)循环初始化是设置循环的初始状态,如设置

    28、循环次数的计数值。(2)循环体是循环结构的主体,由循环工作部分和修改部分组成。(3)循环控制控制循环的执行与结束。循环控制本来应该属于循环体的一部分,但由于它是循环程序设计的关键,所以单独提出来。7575例例5.14 统计字符串长度(串长)。设字符串存放在偏移地址从STR开始的连续存储单元中,并以“$”作为结束符。字符串长度不包含结束符。程序流程如图5.9所示。7676图5.9 统计串长流程图7777程序如下:DATA SEGMENTSTR DB Personal Computer,$STRLEN DB?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAST

    29、ART:MOV AX,DATA MOV DS,AX MOV CL,07878 LEA BX,STR NEXT:MOV AL,BX CMP AL,$JZ DONE INC BX INC CL JMP NEXTDONE:MOV STRLEN,CL MOV AX,4C00H7979 INT 21HCODE ENDS END START8080例例5.15 将一个4位ASCII码表示的数字转换为二进制数。设ASCII码数字放在以NASC为首地址的存储单元中,转换结果存放在以NBIN为首地址的存储单元中。程序如下:DATA SEGMENT NASC DB 3,B,8,6 NBIN DB 2 DUP(0)

    30、DATA ENDSCODE SEGMEN81 81 ASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CL,4 MOV CH,CL LEA BX,NASC CLD XOR AX,AX XOR DX,DXATB1:LODSB8282 AND AL,7FH CMP AL,0 JL ERROR CMP AL,9 JG ATB2 SUB AL,30H JMP ATB3ATB2:CMP AL,A JL ERROR CMP AL,F8383 JG ERROR SUB AL,37HATB3:OR DL,AL ROR DX,CL DEC CH JNZ A

    31、TB1 MOV WORD PTR NBIN,DX MOV AX,4C00H INT 21HCODE ENDS END START8484例例5.16 将16位二进制数转换为非压缩BCD码,存放到存储单元中。设16位二进制数存放在BX寄存器中,转换的非压缩BCD码存放在以NBCD开始的存储单元中。程序如下:DSEG SEGMENTNBCD DB 5 DUP(?)DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEG8585MOV DS,AX MOV AX,BXMOV CX,LENGTH NBCDLEA SI,NBCDADD SI

    32、,CXDEC SIMOV CX,10NEXT:CMP AX,10JC DONE;是最高位BCD数,转移,结束XOR DX,DX8686DIV CX;被除数DX,AXMOV SI,DL;余数,即各位的BCD数DEC SIJMP NEXTDONE:MOV SI,AL;保存最终的BCD数MOV AX,4C00HINT 21HCSEG ENDS END START87875.2.5 子程序及过程定义子程序及过程定义子程序又称为过程。在一个程序中,有时会用到几段程序功能和结构形式都相同,只是某些参数不同的程序段,此时就可将此程序段定义为子程序,需要时调用它。一般地,将调用子程序的程序称为主程序或调用程序

    33、。子程序可再调用另外的子程序,形成程序的调用嵌套。程序调用通过指令CALL实现,通过子程序中的指令RET返回调用程序。子程序的调用如图5.10所示。8888图5.10(a)给出了(主程序)和被调用程序(子程序)的执行过程;图5.10(b)给出了(子)程序嵌套调用程序的执行过程。调用指令(CALL)后的第一条指令的地址被称为断点,子程序执行返回指令(RET)后一定要返回断点,这是由系统保证的。8989图5.10 子程序的调用90901.子程序定义子程序定义伪指令格式:子程序名 PROC FAR/NEAR RET子程序名 ENDP功能:定义一个子程序。其中,子程序名是子程序开始(入口)的符号地址;

    34、FAR/NEAR表示子程序的调用属性:FAR表示远调用段间调用,NEAR表示近调用段内调用,默认(缺省)为NEAR。91 91汇编语言程序的格式也可表达为主过程形式,因为任何应用程序都可以视为被操作系统远程调用。;数据段DATASEG SEGMENTDB?;伪指令 ;定义数据存储单元DATASEG ENDS;代码段CODESEG SEGMENT9292PROCEDURE_NAME PROC FARASSUME CS:CODESEG,DS:DATASEGSTART:PUSH DS ;保存系统的数据段XOR AX,AXPUSH AXMOV AX,DATASEG MOV DS,AX ;程序功能(片)

    35、段 RET9393PROCEDURE_NAME ENDPCODESEG ENDS END START程序中,START后的三条指令可以没有,但相应地过程结束前的RET指令就必须换为MOV AX,4CH和INT 21H两条指令,以保证执行完程序后返回操作系统。94942.子程序设计子程序设计将功能相对独立的一段程序写为子程序,方便被其它程序调用。子程序会缩短整个源程序和目标代码的长度,但调用子程序及从子程序返回会增加程序的执行时间。子程序设计是模块化程序设计的基础。设计子程序时,要注意以下几个问题:(1)现场保护与恢复。所谓现场,就是指子程序调用前一些寄存器的内容。80X86只保护状态标志寄存器

    36、的内容,其它寄存器的内容需用户根据情况保存。9595(2)参数传递。参数传递是指由调用程序传送给子程序的数据或由子程序执行后返回给调用程序的数据。参数有三种传递途径:寄存器、存储单元和堆栈。(3)栈平衡。栈平衡是指子程序中进栈次数与出栈次数的一致性。否则,不能正常返回到断点,将导致整个程序功能的混乱。但有时也利用此点返回参数,如带参数的返回指令(RET n),这种情况需要调用程序的配合。9696例例5.17 近(NEAR)调用:调用程序和被调用程序(子程序)在同一个代码段内。CODESEG SEGMENTMAIN_NAME PROC FARASSUME CS:CODESEGSTART:PUSH

    37、 DS XOR AX,AXPUSH AX 9797CALL SUB_NAMERETMAIN_NAME ENDPSUB_NAME PROC NEAR RETSUB_NAME ENDPCODESEG ENDSEND START9898例例5.18 远(FAR)调用:调用程序和被调用程序(子程序)不在同一个代码段。CODESEG1 SEGMENTPRO1_NAME PROC FARASSUME CS:CODESEG1START:PUSH DS XOR AX,AXPUSH AX 9999CALL PRO2_NAMERETPRO1_NAME ENDPCODESEG1 ENDSCODESEG2 SEGME

    38、NTPRO2_NAME PROC FARASSUME CS:CODESEG2BEGIN:PUSH DS XOR AX,AX100100PUSH AX RETPRO2_NAME ENDPCODESEG2 ENDSEND START 101101例例5.19 设计一个子程序,将一位十六进制数转换为对应的ACSII码。将要转换的十六进制数存放在DL中,子程序的入口参数为DL。这就是通过寄存器传递参数。DTASC PROC ADD DL,30H CMP DL,39H JC FIN ADD DL,7FIN:RETDTASC ENDP102102例例5.20 设计具有子程序调用的程序:在偏移地址以NUM开

    39、始的存储单元连续存放一串非压缩的BCD码,利用子程序将它们转换为ASCII码,存放到以ASC开始的连续存储单元。设NUM和ASC存储区不重叠。程序设计如下:DATA SEGMENTNUM DB 2,5,8,1,7LEN EQU$-NUM ASC DB LEN DUP(?)DATA ENDS103103CODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATASTART:PUSH DS XOR AX,AXPUSH AX MOV AX,DATA MOV DS,AX LEA BX,NUM LEA SI,ASC104104 MOV CX,LENNEXT:MOV DL

    40、,BX CALL DTASC MOV SI,DL INC BX INC SI LOOP NEXT RETMAIN ENDPDTASC PROC ;见例5.17105105 RETDTASC ENDPCODE ENDSEND START此例也可用存储单元传递参数,读者不妨试试。106106例例5.21 调用子程序PROADD完成对长度为LEN的数组ARRAY的元素求和,并将和存放在存储单元SUM中。此程序通过堆栈传递参数。程序设计如下:MYDATA SEGMENT ARRAYDW 20 DUP(?)LEN DW?SUM DW 2 DUP(?)MYDATA ENDSMYCODE SEGMENT A

    41、SSUME CS:MYCODE,DS:MYDATASTART:MOV AX,MYDATA107107 MOV DS,AXMOV AX,OFFSET ARRAYPUSH AXMOV AX,OFFSET LENPUSH AXMOV AX,OFFSET SUMPUSH AXCALL FAR PTR PROADDMOV AX,4C00HINT 21HMYCODE ENDS108108SUBCODE SEGMENT ASSUME CS:SUBCODEPORADD PROC FAR PUSH BP MOV BP,SP MOV SI,10BP MOV CX,8BP MOV DI,6BP OR AX,AX M

    42、OV DX,AX ADD AX,SI109109 JNC NOCAY INC DXNOCAY:INC SI INC SI LOOP NEXT MOV DI,AX MOV 2DI,DX POP BP RET 6PROADD ENDP110110SUBCODE ENDSEND START请读者画出程序调用前后的堆栈示意图。1111115.2.6 系统功能调用系统功能调用当程序需要与外设进行数据输入或输出时,汇编语言要用到系统调用。因为外设的驱动程序存放在计算机主板的只读存储器中,用户可以以中断程序形式调用系统提供的功能。系统提供两种功能调用:DOS(Disk Operating System)功能

    43、调用和BIOS(Base Input/Output System)功能调用。它们和用户程序的关系如图5.11所示。112112图5.11 DOS功能调用和BIOS功能调用与用户程序的关系1131131DOS功能调用功能调用DOS功能调用INT 21H是一个有几十个子功能的中断服务程序,这些子功能的编号为功能号。DOS功能调用主要负责设备管理、目录管理、文件管理及其它管理。表5.1为常用的一些DOS功能调用。DOS功能调用的基本步骤如下:设置功能号,并装入AH。设置调用(入口)参数,装入指定的寄存器。使用中断指令INT 21H。检查返回(出口)参数。114114表表5.1 常用的常用的DOS功能

    44、调用功能调用115115例例5.22 从键盘输入一个字符,保存到存储单元。设存储单元偏移地址为ASC,程序段如下:MOV AH,1INT 21HMOV ASC,AL请读者自行写出完整的汇编语言程序。当程序执行到INT 21H时就会停下来,等待键盘输入,只有键盘输入并按回车键后,程序才会继续执行。116116例例5.23 将存储单元中的一串字符显示在屏幕上。设串长为LEN(LEN65 536),串首地址偏移为STR。DOS的串显示要求串要以字符$为结束符,为此要在串后加该结束符后,才能用DOS的9号功能调用在屏幕上显示一串字符。程序段如下:MOV AH,9LDS DX,STRMOV CX,LEN

    45、MOV BX,DXADD BX,CX117117MOV BYTE PTRBX,$INT 21H请读者自行写出完整的汇编语言程序。118118例例5.24 将一个16位二进制数以十六进制数形式在屏幕上显示。设此16位二进制数存放在BX寄存器中,完整的汇编语言程序如下:BTHCODE SEGMENT MAIN PROC FAR ASSUME CS:BTHCODESTART:PUSH DSXOR AX,AX PUSH AX119119MOV CH,4NEXT:MOV CL,4ROL BX,CLMOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL DISADD AL,71

    46、20120DIS:MOV DL,AL MOV AH,2INT 21HDEC CHJNZ NEXTRETMAIN ENDPBTHCODE ENDSEND1211212.BIOS功能调用功能调用由于BIOS功能调用比DOS功能调用更接近硬件,因此DOS功能调用能完成的功能BIOS功能调用都能完成,反之却不然。表5.2为常用的BIOS功能调用。BIOS功能调用的基本步骤如下:设置功能号,并装入AH。如需子功能号,则装入AL。设置调用(入口)参数,装入指定的寄存器。按中断号调用BIOS中断。检查返回(出口)参数。122122表表5.2 常用的常用的BIOS功能调用功能调用123123例例5.25 从键

    47、盘输入一串字符,将其保存到存储单元并统计串长度。设串首地址为STR,长度存放在LEN单元,并设输入空格为结束输入,程序段如下:LEA BX,STR MOV CL,0NEXT:MOV AH,0 INT 16 CMP AL,20H JZ DONE INC CL124124 MOV BX,AL INC BX JMP NEXTDONE:MOV LEN,CL此程序功能利用DOS功能调用一样可以完成。但下面的例子所要求的功能用DOS功能调用就无法实现。125125例例5.26 置光标到屏幕指定位置,并以蓝底红色显示2个小星号。MOV AH,2;置光标位置功能号MOV BH,0;选择0页MOV DH,20;

    48、屏幕的20行MOV DL,25;屏幕的25列INT 10H;屏幕ROM调用MOV AH,9;显示字符及属性MOV AL,*;星号MOV BH,0;选择0页126126MOV BL,14H;色彩属性,蓝底红色MOV CX,2;重复显示字符次数INT 10H;屏幕ROM调用此例中置光标位置及选择字符显示色彩必须用BIOS调用。利用BIOS调用还可在屏幕上开辟窗口、将显示器设置为图形显示模式等。127127本章介绍了汇编语言程序设计的基础知识,包括完整汇编语言程序的两种格式主程序格式和主过程格式、汇编语言程序设计步骤和程序设计流程图、常用汇编语言伪指令的格式和功能、子程序定义及调用、DOS功能调用和BIOS系统功能调用。本章小结本章小结128128汇编语言程序的结构分为顺序结构、分支结构、循环结构和子程序。顺序结构是程序的基本结构;分支结构是根据不同条件执行不同的程序段;循环结构是重复执行同一段程序;子程序是参数变化的同一段程序的调用。本章是编写外部设备接口程序的基础。

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《微型计算机原理及应用》课件第5章.ppt
    链接地址:https://www.163wenku.com/p-7882560.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库