第4章8086汇编语言程序设计.ppt

上传人:本田雅阁 文档编号:2498332 上传时间:2019-04-04 格式:PPT 页数:194 大小:916.01KB
返回 下载 相关 举报
第4章8086汇编语言程序设计.ppt_第1页
第1页 / 共194页
第4章8086汇编语言程序设计.ppt_第2页
第2页 / 共194页
第4章8086汇编语言程序设计.ppt_第3页
第3页 / 共194页
亲,该文档总共194页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第4章8086汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《第4章8086汇编语言程序设计.ppt(194页珍藏版)》请在三一文库上搜索。

1、第4章 8086汇编语言程序设计,本章主要内容,4.1 汇编语言基础知识,4.1.1概述 4.1.2汇编源程序的结构 4.1.3汇编语言的语句 4.1.4汇编语言的数据 4.1.5汇编语言的操作符与表达式,4.1.1概述,汇编语言(Assembly Language)是介于机器语言和高级语言之间的计算机语言,是一种用符号表示的面向机器的程序设计语言。 它比机器语言易于阅读、编写和修改,又比高级语言运行速度快,能充分利用计算机的硬件资源,占用内存空间少。 汇编语言常用于计算机控制系统的开发和高级语言编译程序的编制等应用场合。采用不同CPU的计算机有不同的汇编语言。,用汇编语言编写的程序称为汇编语

2、言程序或源程序(Source Program)。 汇编语言源程序不能直接在计算机上运行,需要将它翻译成机器语言程序(也称目标代码程序,Object Program)。这个翻译过程为汇编。 完成汇编任务的程序(软件)称为汇编程序。,汇编程序完成以下几个任务: 将汇编语言源程序翻译成目标代码程序; 按指令要求自动分配存储区(包括程序区、数据区等); 自动把源程序中以各种进制表示的数据都转换成二进制形式的数据; 计算表达式的值; 对汇编语言源程序进行语法检查,并给出语法出错的提示信息。,4.1.2汇编源程序的结构,汇编语言程序由若干个段组成。 按照各段功能的不同,分别有代码段、数据段、堆栈段和附加段

3、。 其中代码段是必须要定义的。,【例4-1】 编写汇编程序,计算2010H +2011H,并把和存入RESULT单元。 DATA SEGMENT ;定义数据段 X DW 2010H ;定义被加数 Y DW 2011H ;定义加数 RESULT DW ? ;分配和数存放单元 DATA ENDS ;数据段定义结束,CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX,MOV AX,X ADD AX,Y MOV RESULT,AX RET MAIN

4、ENDP CODE ENDS END START,汇编语言源程序的特点,采用段式结构 汇编源程序通常包含若干个段,上例的程序有数据段和代码段这两个段,DATA、CODE分别为两个段的名字。每一段有明显的起始语句SEGMENT与结束语句ENDS,这些语句称为“段定义”语句。 每一段由若干汇编语句构成 汇编源程序每一段包含若干汇编语句。汇编语句的主体是汇编指令。一条语句写一行,为了清晰,书写语句时,注意语句的各部分要尽量对齐。,汇编语言源程序的特点(续),每个汇编源程序需要一个启动标号 汇编语言源程序需要一个启动标号作为程序开始执行时目标代码的入口地址。启动标号可以按照汇编语言的标号命名规则由程序

5、员自己定义。常用的启动标号有START、BEGIN等。 加入适当注释,可以提高程序的可读性 为了提高程序的可读性,可以在汇编语句后以分号“;”为起始标志,加入注释。,汇编语言和操作系统(DOS)的接口 计算机一旦启动成功,由DOS掌握CPU的控制权。应用程序只是作为DOS的子程序,应用程序执行完,必须返回DOS。上述程序的第7行、第9行第11行、第17行和第18行就是为了完成此功能而设计的。,(1)返回DOS的标准方法,例4-1采用了此方法。具体程序设计方法如下: 将应用程序的主程序定义成一个FAR过程(见上述程序的第7行和第18行),该过程的最后一条指令为RET(见上述程序的第17行); 在

6、代码段的主程序的开始部分用3条指令,把INT 20H指令的段地址(CS=DS=ES)及偏移地址(0)压入堆栈(见上述程序的第9行第11行)。 这样,程序执行到主程序的最后一条指令RET时,由于过程具有FAR属性,故堆栈内的两个字分别弹出到IP及CS,便执行INT 20H指令,返回到DOS。,(2)用DOS功能调用4CH返回,在用户程序中不定义过程段,删除上述程序的第7行、第9行第11行和第18行指令,把原第17行的RET指令换成下面两条指令: MOV AH,4CH INT 21H INT 21H指令是DOS向用户提供服务程序的窗口。,4.1.3汇编语言的语句,汇编语言的语句可以分为: 指令语句

7、 伪指令语句 宏指令语句,1.指令语句,指令语句是可执行语句,汇编后将产生目标代码,CPU根据这些目标代码执行并完成特定操作。 每一条指令语句表达了计算机具有的一个基本能力,这种能力在目标程序执行时反映出来。 指令语句的格式为: 标号: 指令助记符 操作数 ;注释,2.伪指令语句,伪指令语句,也称指示性语句,是不可执行语句,汇编后不产生目标代码,它仅仅在汇编过程中告诉汇编程序如何汇编源程序。 伪指令语句可以告诉汇编程序哪些语句是属于一个段、是什么类型的段、各段存入内存应如何组装、给变量分配多少存储单元、给数字或表达式命名等。 伪指令语句的功能是由汇编程序汇编源程序时完成的,不是由CPU执行目标

8、代码时实现的。,伪指令语句的格式为: 符号名 伪指令助记符 操作数 ;注释,3.宏指令语句,宏是一个以宏名定义的指令序列。一旦把某程序段定义成宏,则可以用宏名代替那段程序。在汇编时,要对宏进行宏展开,即把以宏名表示的地方替换为该宏对应的指令序列的目标代码。宏指令可以看成指令语句的扩展,相当于多条指令语句的集合。 宏指令格式为: 宏名 宏指令助记符 操作数 ;注释,4.汇编语句格式说明,(1)关于格式的几个组成部分 汇编语句的格式中带中括号的部分是可选项。 各部分之间必须用空格(SPACE)或水平制表符(TAB)隔开。 操作数项由一个或多个表达式组成,它为执行语句所要求的操作提供需要的信息。,4

9、.汇编语句格式说明(续),注释项用来说明程序或语句的功能,注释项在汇编时不会产生目标代码。注释项可以跟在语句的后面。分号“;”是注释项的开始。 当分号“;”作为一行的第一个字符时,表示注释占据一整行,常用来说明下面一段程序的功能。,4.汇编语句格式说明(续),(2)关于标号与符号名 标号与符号名都称为名字。 标号是可选项,一般设置在程序的入口处或程序跳转点处,表示一条指令的符号地址,在代码段中定义,后面必须跟上冒号“:”。 符号名也是一个可选项,可以是常量、变量、段名、过程名、宏名,后面不能跟冒号。,4.汇编语句格式说明(续),(3)名字的命名规则 合法符号:字母(不分大小写)、数字及特殊符号

10、(“?”,“”,“_”,“$”,“ ”)。 名字可以用除数字外所有的合法符号开头。但如果是用到符号“ ”,那么这个符号必须是第一个字符。 名字的有效长度不超过31个英文字符。 不能把保留字(如CPU的寄存器名、指令助记符等)用作名字。,4.汇编语句格式说明(续),(4)注释项 注释项用来说明一段程序、一条或几条指令的功能,此项是可有可无的。但是,对于汇编语言源程序来说,注释项可以使程序易于被读懂;而对编写程序的人来讲,注释项可以是一种“备忘录”。,注释编写举例,例如,一般在循环程序的开始都有初始化程序,置有关工作单元的初值: MOV CX,100 ;将100送入CX MOV SI,0100H

11、;将0100H送入SI MOV DI,0200H ;将0200H送入DI MOV CX,100 ;循环计数器CX置初值 MOV SI,0100H ;源数据区指针SI置初值 MOV DI,0200H ;目标数据区指针DI置初值,4.1.4 汇编语言的数据,数据是汇编语言语句的重要组成部分。 汇编语言能识别的数据有: 常量 变量 标号,1.常量,常量是没有任何属性的纯数值数据,它的值在汇编期间和程序运行过程中不能改变。 汇编语言程序中的常量有: 数值常量 字符常量 符号常量,(1)数值常量,在汇编程序中,数值常量可以用不同进制形式表示。 二进制常量表示为以字母B(或b)结尾的由数字0和1组成的序列

12、,例如,01100101B。 八进制常量表示为以字母Q(或q)或O(或o)结尾的由数字07组成的序列,例如,145Q。,(1)数值常量(续),十六进制常量表示为以字母H(或h)结尾的由数字09、字母AF(或af)组成的序列,例如,653AH。 十进制常量表示为以字母D(或d)结尾的由数字09组成的序列。汇编语句中的数据默认采用十进制表示形式,所以,采用十进制数时,也可省略结尾的字母。例如,101D或100。,1.常量(续),(2)字符常量 字符常量是用单引号括起来的单个字符,如a、1等。字符常量在操作中体现出的值是其ASCII码值。,1.常量(续),(3)符号常量 符号常量是用名字来标识的常量

13、。以符号常量代替常量,可以增加程序的可读性及通用性。,2.变量,变量是存储单元的符号地址,这类存储单元的内容可以在程序运行期间被修改。变量以变量名的形式出现在程序中。同一个汇编程序中,变量只能定义一次。变量具有以下3种属性。 段属性:变量所在段的段地址。 偏移属性:变量所在段的段内偏移地址。 类型属性:变量占用存储单元的字节数,如表5-1所示。,3.标号,标号是指令的符号地址,可用作控制转移指令的操作数。标号具有以下3种属性。 段属性:标号所在段的段地址。 偏移属性:标号所在段的段内偏移地址。 类型属性:也叫距离属性,表示标号可作为段内或段间的转移特性,变量的类型值,4.1.5汇编语言的操作符

14、与表达式,操作项是汇编语句中的一个重要组成部分,它可以由常量(常数)、寄存器、标号、变量或表达式组成。 表达式是常量、寄存器、标号、变量与一些操作符相组合的序列,分为数值表达式和地址表达式两种。 汇编程序在汇编时按照一定的规则对表达式进行计算后可以得到一个数值或地址值。,1.算术操作符,算术操作符有:加(+)、减(-)、乘(*)、除(/)和取余(MOD)。 参加运算的数和运算的结果都是整数。 除法运算的结果是商的整数部分。 取余操作的结果是两个整数相除后得到的余数。,算术操作符可以用于数值表达式或地址表达式。 当它用于地址表达式时,仅当其结果有明确的物理意义时,才是有效的结果。 例如,将两个地

15、址相乘或相除都是没有意义的。加、减操作可以用于地址表达式,但也要注意其物理意义。 例如,将两个地址相加或相减也是没有意义的。有意义的用法是地址值与一个偏移量相加或相减,可以得到一个新的地址值。,例如: MOV AX,2+3*5 ;汇编后,表达式2+3*5被数值17代替 MOV BL,NUM+1 ;表达式NUM+1是汇编时由汇编程序计算的,不是由CPU在执行该指令时才计算的。汇编后得到的目标程序中,表达式被它的值代替。,2.逻辑操作符,逻辑操作符有:与(AND)、或(OR)、非(NOT)和异或(XOR)。 逻辑操作按位进行,只适用于数值表达式。逻辑操作符指定汇编程序对操作符前后的两个数值或数值表

16、达式进行指定的逻辑操作。要注意区分逻辑操作符与逻辑指令。 例如: AND DX,PORT AND 0FH,3.移位操作符,移位操作符有两个:SHL和SHR,按位操作,只适用于数值表达式。 移位操作符的用法如下: 数值表达式 SHL 移动位数n 数值表达式 SHR 移动位数n 汇编程序将把数字表达式的值左移(SHL)或右移(SHR)n位。当n15时,结果为0。,4.关系操作符,关系操作符用于数的比较,有相等(EQ)、不相等(NE)、小于(LT)、大于(GT)、小于等于(LE)和大于等于(GE)6种。关系操作符两边的操作数必须是两个数值或同一段中两个存储单元地址。关系操作的运算结果是逻辑值,当结果

17、为真时,表示为0FFFFH;当结果为假时,则表示为0。 例如: MOV AX,4 EQ 3 该指令汇编后的结果为:MOV AX,0,5.数值回送操作符,数值回送操作符的运算对象必须是存储器操作数,即变量或标号。操作符加在运算对象的前面,返回一个数值。,6.属性操作符,属性操作符用来建立或改变已定义变量、内存操作数或标号的类型属性。 属性操作符有: PTR 段操作符 THIS SHORT HIGH LOW等。,(1)PTR,格式:类型 PTR 变量 / 标号 返回值:具有规定类型属性的变量或标号。 典型应用: 重新指定变量类型 例如,有如下数据定义: BUFW DW 1234H,5678H 则下

18、列指令合法: MOV AX,BUFW MOV AL,BYTE PTR BUFW ;临时改变BUFW的字属性为字节属性,PTR典型应用(续), 指定内存操作数的类型 在寄存器间接寻址、寄存器相对寻址、基址变址寻址或相对基址变址寻址等内存寻址方式中,往往很难判断出操作数的类型属性,例如:INC BX。此时,汇编将指示出错,为了避免出错,应对操作数类型加以说明,如下所示: INC BYTE PTR BX ;字节属性 INC WORD PTR BXSI ;字属性,PTR典型应用(续), 与EQU一起定义一个新的变量 格式:变量或标号 EQU 类型 PTR 说明: 新变量或新标号的段属性、偏移属性与前一

19、个已定义的变量或标号段属性、偏移属性相同。,例如: BUFW DW 1234H,5678H BUFB EQU BYTE PTR BUFW ;BUFB的类型属性为字节 ;其他属性与BUFW一样 进行字存取时,可用变量BUFW, 如:MOV AX,BUFW 进行字节存取时,可用变量BUFB, 如:MOV AL,BUFB,(2)段操作符 用来指定一个标号、变量或地址表达式的段属性。 例如: MOV AX,ES:BX ;指定数据在ES段,(3)THIS 格式:THIS 类型 可以像PTR一样建立一个指定类型的地址操作数,该操作数的段地址和偏移地址与下一个存储单元地址相同。例如: BUFB EQU TH

20、IS BYTE BUFW DW 1234H,5678H 此时BUFB的偏移地址和BUFW完全相同,但它是字节类型的;而BUFW则是字类型的。,(4)SHORT 格式:SHORT 标号 返回值:偏移量在-128+127范围内的标号。 用于JMP指令。 即:JMP SHORT 标号,指明是短转移。,(5)字节分离操作符HIGH、LOW 格式:HIGH 表达式 LOW 表达式 返回值:表达式值的高字节或低字节。 例如: CONST EQU 0ABCDH MOV AH,HIGH CONST ;AH=0ABH MOV CL,LOW CONST ;CL=0CDH,4.2汇编语言的伪指令,伪指令从表示形式及

21、其在语句中所处的位置,与CPU指令相似,但二者有着重要的区别。 首先,伪指令不像机器指令那样是在程序运行期间由CPU来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作; 其次,汇编以后,每条CPU指令产生一一对应的目标代码,而伪指令则不产生与之相应的目标代码。,4.2.1变量定义伪指令,变量定义伪指令用来为数据分配存储单元,建立变量与存储单元之间的联系。 语句格式为: 变量名 数据定义伪指令 操作数1,操作数2 变量定义伪指令有: DB、DW、DD、DQ、DT,分别用来定义类型属性为字节(DB)、字(DW)、双字(DD)、4字(DQ)、5字(DT)的变量。,变量定义伪指令的操作数可以

22、是: 数字常量,允许以十进制、八进制、十六进制、二进制等形式表示,默认形式是十进制; 字符常量,用单引号括起来,被存储的是该字符的ASCII码; 符号常量,必须是预先已定义的符号; 符号“?”,表示预留空间,内容不定。,DUP,表示内容重复的数据。 DUP用法的具体形式为: 次数 DUP ( 被重复内容) 例如,数据定义如下, DATA_B DB 10,A DATA_W DW 1234H DATA_S DB 1234,2 DUP(1,2 DUP(0),数据定义存储区示意,DB定义的数据,每个数据元素占据1个存储单元; DW定义的数据,每个数据元素占据2个存储单元; 字数据存储时,低字节存储在低

23、地址单元中,高字节存储在高地址单元中; 字符在内存中存放的是它的ASCII码,“A”的ASCII码为41H; DUP可以嵌套使用。 符号地址具有以下关系: DATA_W=DATA_B+2 DATA_S=DATA_W+2=DATA_B+4,4.2.2符号定义伪指令,符号包括汇编语言的变量名、标号名、过程名、寄存器名及指令助记符等。 常用符号定义伪指令有: EQU “=” LABEL,1.EQU伪指令,格式:名字 EQU 表达式 表达式可以是一个常数、已定义的符号、数值表达式或地址表达式。 功能:给表达式赋予一个名字。定义后,可用名字代替表达式。在同一源程序中,一个名字只能用EQU定义一次。 例如

24、: PIX EQU 64*1024 ;名字PIX代表数值表达式的值 A EQU 7 B EQU A-2,2.等号(=)伪指令,格式:名字 = 表达式 功能:与EQU基本相同,区别是它可以对同一个名字重新定义。 例如: COUNT = 10 MOV AL,COUNT COUNT = 5 ,3. LABEL伪指令,格式:变量/标号 LABEL 类型 变量的类型有:BYTE、WORD、DWORD、DQ、DT 标号的类型有:NEAR、FAR。 功能:定义变量或标号的类型,而变量或标号的段属性和偏移属性由该语句所处的位置确定。,LABEL使用举例,例如,利用LABEL使同一个数据区有一个以上的类型及相关

25、属性。 AREAW LABEL WORD ;AREAW与AREAB指向相同的数据区, ;AREAW类型为字,AREAB类型为字节 AREAB DB 100 DUP(?) MOV AX,2011H MOV AREAW,AX ;(AREAW)=2011H MOV BL,AREAB ;BL=11H,4.2.3段定义伪指令,汇编源程序由段组成,每段大小不超过64KB,不同的段存放不同类型的数据。 段定义伪指令用于汇编源程序中段的定义。 相关指令有:SEGMENT、ENDS、ASSUME。,1.段定义伪指令SEGMENT、ENDS,格式: 段名 SEGMENT 定位类型 组合类型 类别名 段名 ENDS

26、 功能:定义一个逻辑段。 SEGMENT和ENDS必须成对使用,它们前面的段名必须是相同的。 SEGMENT后面中括号中的内容为可选项,告诉汇编程序和连接程序如何确定段的边界、如何连接几个程序模块。,(1)定位类型,定位类型说明段的起始地址应有怎样的边界值,有以下4种。 BYTE:表示本段可以从任何地址开始,这种类型段间不留空隙,存储器利用率高。 WORD:表示本段的起始地址必须为偶地址。 PARA:表示本段从节边界开始。8086规定每16字节为1小节。所以,定位类型为PARA的段,其起始地址必为16的倍数。这种类型简单,但是段间往往有空隙。定位类型的默认值为PARA。 PAGE:表示本段从页

27、边界开始。8086规定每256字节为1页,所以,定位类型为PAGE的段,其起始地址必为256的倍数。,(2)组合类型,组合类型说明链接不同模块中的同名段时采用的方式,有以下6种。 PUBLIC:本段与其他模块中说明为PUBLIC的同名同类别的段链接起来,公用一个段地址,形成一个新的逻辑段,所以偏移量调整为相对于新逻辑段起始地址的值。 STACK:本段与其他模块中说明为STACK的同名的堆栈段链接起来,公用一个段地址,形成一个新的逻辑段。同时,系统自动初始化SS及SP。,(2)组合类型(续), COMMON:同名段从同一个内存地址开始装入。所以,各个逻辑段将发生覆盖。连接以后,该段长度取决于同名

28、段中最长的那个,而内容有效的是最后装入的那个。 MEMORY:与PUBLIC同义,只不过MEMORY定义的段装在所有同名段的最后。若连接时出现多个MEMORY,则最先遇到的段按组合类型MEMORY处理,其他段组合类型按PUBLIC处理。,(2)组合类型(续), PRIVATE:不组合,该段与其他段逻辑上不发生关系,即使同名,各段拥有各自的段基值。组合类型的默认值为PRIVATE。 AT exp:段地址为表达式exp的值(长度为16位)。此项不能用于代码段。例如:AT 0530H,表示本段从物理地址0530H开始。,(3)类别名,类别名必须用单引号括起来。 类别的作用是在连接时决定各逻辑段的装入

29、顺序。 当几个程序模块进行连接时,其中具有相同类别名的段,按出现的先后顺序被装入连续的内存区。 没有类别名的段,与其他无类别名的段一起连续装入内存。 典型的类型名有:“STACK”,“CODE”,“DATA”。,2. ASSUME,格式:ASSUME 段寄存器名:段名,段寄存器名:段名 段寄存器可以是:CS、DS、ES、SS。 段名为已定义的段。 凡是程序中使用的段,都应说明它与段寄存器之间的对应关系。 功能:用于明确段与段寄存器的关系。,ASSUME使用说明,ASSUME伪指令只是指示各逻辑段使用段寄存器的情况,并没有对段寄存器的内容进行赋值。 DS、ES的值必须在程序段中用指令语句进行赋值

30、,而CS、SS由系统负责设置,程序中也可对SS进行赋值,但不允许对CS赋值。,4.2.4过程定义伪指令,过程定义伪指令用于定义过程。指令格式如下: 过程名 PROC 类型 RET 过程名 ENDP 过程名按汇编语言命名规则设定,汇编及链接后,该名称表示过程程序的入口地址,供调用使用。,过程定义伪指令使用说明,PROC与ENDP必须成对出现,PROC开始一个过程,ENDP结束一个过程。成对的PROC与ENDP的前面必须有相同的过程名。 类型取值为:NEAR(为默认值)或FAR,表示该过程是段内调用或段间调用。 一个过程中,至少有一条过程返回指令RET,一般放在ENDP之前。,4.2.5模块定义和

31、结束伪指令,TITLE 格式:TITLE 标题 功能:TITLE伪指令可指定每一页上打印的标题。标题最多可用60个字符。,4.2.5模块定义和结束伪指令(续),2.NAME 格式:NAME 模块名 功能:为源程序的目标程序指定一个模块名。 如果程序中没有NAME伪指令,则汇编程序将TITLE伪指令定义的标题名前6个字符作为模块名;如果程序中既没有NAME,又没有TITLE,则汇编程序将源程序的文件名作为目标程序的模块名。,4.2.5模块定义和结束伪指令(续),3.END 格式:END 标号 功能:表示源程序的结束。 标号指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序要使用标号

32、,其他子模块则只用END而不必指定标号。,4.2.6其他伪指令,1.对准伪指令EVEN 格式:EVEN 功能:使下一个分配地址为偶地址。 在8086中,一个字的地址最好为偶地址。 因为8086 CPU存取一个字,如果地址是偶地址,需要1个读或写周期; 如果是奇地址,则需要2个读或写周期。所以,该伪指令常用于字定义语句之前。,EVEN指令使用说明,DSEG SEGMENT EVEN ARR_W DW 100 DUP(?) DSEG ENDS,4.2.6其他伪指令(续),2.定位伪指令ORG 格式:ORG 表达式 表达式取值范围为:065535内的无符号数。 功能:指定其后的程序段或数据块所存放的

33、起始地址的偏移量。,ORG伪指令使用说明,例如: MY_DATA SEGMENT ORG 100H MYDAT DW 1,2,$+4 MY_DATA ENDS,4.2.6其他伪指令(续),3.基数控制伪指令RADIX 格式:RADIX 表达式 表达式取值为216内的任何整数。 功能:指定汇编程序使用的默认数制。默认时,使用十进制。,RADIX使用举例,MOV BX,0FFH ;十六进制数要加后缀 MOV BX,150 ;十进制数不要加后缀 RADIX 16 ;设置十六进制为默认数制 MOV AX,0FF ;十六进制数不要加后缀 MOV BX,150D ;十进制数要加后缀,4.3DOS功能调用,

34、MS-DOS叫磁盘操作系统。它不仅提供了许多命令,还给用户提供了80多个常用子程序。 DOS功能调用就是对这些子程序的调用,也叫系统功能调用。子程序的顺序编号称为功能调用号。 DOS功能调用的过程是: 根据需要的功能调用设置入口参数,把功能调用号送AH寄存器,执行软中断指令INT 21H后,可以根据有关功能调用的说明取得出口参数。,4.3 DOS功能调用(续),1.单个字符输入 功能调用号AH=01H。 功能:接收从键盘输入的一个字符并在屏幕回显。输入字符的ASCII码存入AL寄存器。若按下组合键Ctrl+Break或Ctrl+C,则程序返回DOS。 例如: MOV AH,01H INT 21

35、H,4.3 DOS功能调用(续),2.字符串输入 功能调用号AH=0AH。 功能:接收从键盘输入的一个字符串。 入口参数:存放字符串的接收缓冲区首地址和最大字符个数。寄存器DS和DX存放接收缓冲区首地址,分别存放其段地址和偏移地址;缓冲区第一字节存放接收字符串的最大字符个数。 出口参数:输入的字符串及实际输入的字符个数。缓冲区第二字节存放实际输入的字符个数(不包括回车符);第三字节开始存放接收的字符串。,4.3 DOS功能调用(续),2.字符串输入(续) 说明: 字符串必须以回车键结束,回车符是接收到的字符串的最后一个字符。 如果输入的字符数超过设定的最大字符个数,则随后的输入字符被丢失并响铃

36、,直到遇到回车键为止。 如果在输入时按组合键Ctrl+C或Ctrl+Break,则结束程序。,4.3 DOS功能调用(续),2.字符串输入(续) DATA SEGMENT BUF DB 100 DB ? DB 100 DUP(?) DATA ENDS CODE SEGMENT MOV DX,OFFSET BUF MOV AH,10 INT 21H CODE ENDS,4.3 DOS功能调用(续),3.单字符输出 功能调用号AH=02H。 功能:在屏幕上显示一个字符。 入口参数:要显示的字符的ASCII码保存于寄存器DL。 例如: MOV DL,2 MOV AH,2 INT 21H,4.3 DO

37、S功能调用(续),4.字符串输出 功能调用号AH=9。 功能:在屏幕上显示一个字符串。 入口参数:是被输出字符串首址,接收入口参数的是寄存器DS和DX,分别存入被输出字符串首址的段基值和偏移量。 采用9号功能输出字符串,要求字符串以“$”结束,该字符作为字符串结束符,不输出。,4.3 DOS功能调用(续),4.字符串输出(续) 例如: DATA SEGMENTS STRING DB Hello ASM!$;定义字符串 DATA ENDS CODE SEGMENT MOV DX,OFFSET STRING MOV AH,9 INT 21H CODE ENDS,4.3 DOS功能调用(续),5.进

38、程终止 功能调用号AH=4CH。 功能:结束当前程序,返回DOS。 例如: MOV AH,4CH 或 MOV AX,4C00H INT 21H,4.3.2 BIOS功能调用,BIOS常驻ROM,独立于DOS,可与任何操作系统一起工作。 它的主要功能是驱动系统所配置的外部设备,如磁盘驱动器、显示器、打印机及异步通信接口等。 通过INT 10HINT 1AH向用户提供服务程序的入口,使用户无须对硬件有深入了解,就可完成对I/O设备的控制与操作。 BIOS的中断调用与DOS功能调用类似。,4.3.2 BIOS功能调用(续),键盘I/O程序以16H号中断处理程序的形式存在,它提供若干功能,每一个功能有

39、一个编号。 在调用键盘I/O程序时,把功能编号置入AH寄存器,然后发出中断指令INT 16H。调用返回后,从有关寄存器中取得出口参数。,4.3.2 BIOS功能调用举例,例如: MOV AH,0 INT 16H 上面的程序段利用BIOS中断服务,实现从键盘读一个字符的功能。,4.4汇编语言程序设计,8086汇编语言程序采用模块化结构,通常由一个主程序模块和多个子程序(过程)模块构成。 对于简单程序,只有主程序模块,没有子程序模块。 汇编语言程序有3种基本结构: 顺序结构 分支结构 循环结构,4.4.1程序的质量标准,衡量程序的质量通常有以下几个标准: 程序正确、完整; 程序易读性强; 程序的执

40、行速度快; 程序占内存小,程序代码的行数少。,4.4.2汇编语言程序设计的基本步骤, 分析问题,抽象出描述问题的数学模型; 确定解决问题的算法或算法思想; 程序模块划分在解决复杂实际问题时,往往需要把它分成若干功能模块,在进行功能模块划分后,必须确定各功能模块间的通信问题; 绘制各功能模块流程图或结构图; 分配存储空间、寄存器等工作单元;,4.4.2汇编语言程序设计的基本步骤(续), 根据流程图,编写程序; 静态检查,纠正错误; 上机运行调试,纠正错误,直至测试通过; 整理资料,建立完整的文档。,4.4.3顺序结构程序设计,顺序结构程序又称简单程序。 采用这种结构的程序,按照指令书写的顺序逐条

41、执行,程序的执行路径没有分支和循环。,顺序结构程序设计举例,【例4-2】编程将内存数据段字节单元INDAT存放的一个数n(假设0 n 9 ),以十进制形式在屏幕上显示出来。 例如,若INSTR单元存放的是数8,则在屏幕上显示:8D。,【例4-2】程序代码,DATA SEGMENT ;数据段定义 INDAT DB 8 DATA ENDS CODE SEGMENT ;代码段定义 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化DS,【例4-2】程序代码(续),MOV DL,INDAT OR DL,30H MOV AH 2 INT 21

42、H MOV DL,D MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START,4.4.4 分支结构程序设计,分支结构程序利用条件转移指令或跳转表,使程序执行完某条指令后,根据指令执行后状态标志的情况选择要执行哪个程序段。 分支结构程序的指令执行顺序与指令的存储顺序不一致。 转移指令JMP和Jcc可以实现分支结构。,分支结构的三种形式,单分支结构程序设计举例,【例4-3】编写程序段,求AX中存放的带符号数的绝对值,结果存RES单元。 CMP AX,0 JGE ISPOSITIVE NEG AX ISPOSITIVE: MOV RES,AX

43、本例采用的是单分支结构。特点是:条件成立时程序跳转;否则,顺序执行。,双分支结构程序设计举例,【例4-4】 编程判断DAT单元存放的带符号数的正负。 如该数为负数,则显示“DAT is a negative number!”;否则显示“DAT is a nonnegative number!”。,【例4-4】(续),DATA SEGMENT ;数据段定义 N DB DAT is a negative number!,$ NN DB DAT is a nonnegative number! $ DATA ENDS CODE SEGMENT ;代码段定义 ASSUME CS:CODE,DS:DAT

44、A START: MOV AX,DATA MOV DS,AX ;设置DS,【例4-4】(续),MOV AX,-3 CMP AX,0 JGE ISNN LEA DX,N MOV AH,9 INT 21H JMP FINISH,【例4-4】(续),ISNN: LEA DX,NN MOV AH,9 INT 21H FINISH: MOV AH,4CH INT 21H CODE ENDS END START,【例4-4】(续),【例4-4】采用的是双分支结构。 采用这种结构时,特别要注意第一个分支后要利用JMP指令(程序第16行)使程序跳转到第二个分支的后面。,多分支结构程序设计举例,【例4-5】 编

45、程求分段函数Y的值。已知变量X为16位带符号数,分段函数的值要求保存到字单元Y中。函数定义如下:,【例4-5】(续),DATA SEGMENT ;数据段定义 X DW -128 Y DW ? DATA ENDS CODE SEGMENT ;代码段定义 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX,【例4-5】(续),MOV AX,X CMP AX,0 JG ISPN JZ ISZN MOV Y,-1 JMP FINISH ISPN: MOV Y,1 JMP FINISH ISZN: MOV Y,0,【例4-5】(续),FINISH: M

46、OV AH,4CH INT 21H CODE ENDS END START 本例实现的是多分支结构。 设计多分支结构程序时,应注意: 要为每个分支安排出口; 各分支的公共部分尽量集中,以减少程序代码; 无条件转移没有范围的限制,但条件转移指令只能在-128+127字节范围内转移; 调试程序时,要对每个分支进行调试。,4.4.5 循环结构程序设计,当程序处理的问题需要包含多次重复执行某些相同的操作时,在程序中可使用循环结构来实现,即用同一组指令,每次替换不同的数据,反复执行这一组指令。 使用循环结构,可以缩短程序代码,提高编程效率。,循环结构程序的组成,循环程序由以下3个部分组成。 (1)初始化

47、部分 初始化部分是循环的准备部分,在这部分应完成地址指针、循环计数、结束条件等初值的设置。 (2)循环体 循环体包括以下3个部分。 循环工作部分:是循环程序的主体。完成程序的基本操作,循环多少次,这部分语句就执行多少次。 循环修改部分:修改循环工作部分的变量地址等,保证每次循环参加执行的数据能发生有规律的变化。,循环结构程序的组成(续),循环控制部分:控制循环执行的次数,检测和修改循环控制计数器,控制循环的运行和结束。 (3)循环结束部分 在循环结束部分,完成循环结束后的处理,如数据分析、结果的存放等。,循环程序结构,设计循环结构程序时,要注意以下问题: 选用计数循环还是条件循环,采用直到型循

48、环结构还是当型循环结构; 可以用循环次数、计数器、标志位、变量值等多种方式来作为循环的控制条件,进行选择时,要综合考虑循环执行的条件和循环退出的条件; 注意不要把初始化部分放到循环体中,循环体中要有能改变循环条件的语句。,循环结构程序设计举例,【例4-6】 编程显示以“!”结尾的字符串。 如:“Welcome to MASM!”。,【例4-6】(续),DATA SEGMENT MYSTR DB Welcome to MASM! DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX,【例4-6】(续),LEA SI,MYSTR NEXTCHAR: MOV DL,SI CMP DL,! JZ FINISH MOV AH,2 INT 21H INC SI JMP NEXTCHAR,【例4-6】(续),FINISH: MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START 由于只知道循环结束的条件是该字符串以“!”结束,不知道字符串的长度,所以,采用了条件控制的方法来控制循环的次数。,循环结构程序设计举例(续),【例4-7】 编程以二进制形式显示BX的值(假设为无符号数)。 如果(BX

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1