收藏 分享(赏)

第5章80868088汇编语言程序设计.ppt

上传人:ysd1539 文档编号:7996557 上传时间:2019-06-03 格式:PPT 页数:77 大小:404.50KB
下载 相关 举报
第5章80868088汇编语言程序设计.ppt_第1页
第1页 / 共77页
第5章80868088汇编语言程序设计.ppt_第2页
第2页 / 共77页
第5章80868088汇编语言程序设计.ppt_第3页
第3页 / 共77页
第5章80868088汇编语言程序设计.ppt_第4页
第4页 / 共77页
第5章80868088汇编语言程序设计.ppt_第5页
第5页 / 共77页
点击查看更多>>
资源描述

1、编制汇编语言源程序时,首先要使用段定义伪指令和段寻址伪指令来构造一个由若干指令和数据组成的程序。构造一个源程序的框架结构有如下两种格式: 第一种格式: MOV AH,4CH ;返回DOS INT 21H CODE ENDS END BEGIN,第5章 8086/8088汇编语言程序设计,5.1 汇编语言源程序的框架结构,第二种格式: RET ;取程序段前缀首地址 MAIN ENDP CODE ENDS END BEGIN 区别:两种格式的本质区别在于返回DOS的方法不同: 对于第一种格式,采用了调用DOS系统的4CH功能,返回DOS。具体方法是:在要返回DOS处,安排如下两条指令: MOV A

2、H,4CH INT 21H 对于第二格式,DOS返回方法是调用20H类型的中断服务程序。,5.1 汇编语言源程序的框架结构(续),顺序程序结构是指完全按照顺序逐条执行的指令序列,这种结构的流程图除了有一个开始框和结束框外,就是若干处理框,没有判断框。图5.1 顺序程序的结构形式,5.2 顺序结构程序设计,例5.1:试分别用汇编语言源程序的两种框架结构编制程序,求出表达式:(X4Y)/2的值,并保存到RESULT存储单元中,其中X,Y均为字节变量。,解:完成该功能的流程图如图5.2所示:图5.2 例5.1的功能实现流程图,5.2 顺序结构程序设计(续),参考程序1: DATA SEGMENT ;

3、数据段 X DB 2 Y DB 4 Z DB ? ;定义变量 DATA ENDS STACK SEGMENT PARA STACK DW 20H DUP(0) STACK ENDS CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA,SS:STACK,5.2 顺序结构程序设计(续),BEGIN: MOV AX,DATA MOV DS,AX ;DS赋初值 MOV AL,X ;ALX MOV CL,2 SAL AL,CL ;ALX4 SUB AL,Y ;ALX4Y SAR AL,1 ;AL(X4Y)/2 MOV Z,AL ;存结果 MOV AH,4CH ;返回DOS

4、INT 21H CODE ENDS END BEGIN,5.2 顺序结构程序设计(续),参考程序2: DATA SEGMENT X DB 2 Y DB 4 Z DB ? DATA ENDS STACK SEGMENT PARA STACK DW 20H DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK PROC1 PROC FAR ;使RET为远返回 END BEGIN,5.2 顺序结构程序设计(续),BEGIN: PUSH DS ;入栈保存地址 MOV AX,0 ;程序段前缀的首地址 PUSH AX MOV AX,D

5、ATA MOV DS,AX MOV AL,X ;ALX MOV CL,2 SAL AL,CL ;ALX4 SUB AL,Y ;ALX4Y SAR AL,1 ;AL(X4Y)/2 MOV Z,AL ;存结果 RET ;取程序段前缀首地址,5.2 顺序结构程序设计(续),PROC1 ENDP CODE ENDS,5.2 顺序结构程序设计(续),分支程序结构可以有两种形式,如图5.4所示,它们分别相当于高级语言程序中的IF-THEN-ELSE语句和CASE语句,它们适用于要根据不同条件做不同处理的情况。,5.3 分支结构程序设计,实现方法:在产生分支之前,通常用比较、测试的办法在标志寄存器中设置相应

6、的标志位,然后再选用适当的条件转移指令,以实现不同情况的分支转移。 (1)进行比较,使用比较指令: CMP DEST,SRC 该指令进行减法操作,而不保存结果,只设置标志位。 (2)进行测试,使用测试指令 TEST DEST,SRC 该指令进行逻辑与操作,而不保存结果,只设置标志位。,5.3.1 用比较/测试的方法实现IF-THEN-ELSE结构,用地址表法实现CASE结构的基本思路是:将各分支程序的入口地址依次罗列形成一个地址表,让BX指向地址表的首地址,从键盘接收或其他方式获取要转到的分支号,再让BX与分支号进行运算,使BX指向对应分支入口地址,最后即可使用JMP WORD PTR BX

7、或JMP DWORD PTR BX 指令实现所要转到的分支;程序设计流程图如图5.6所示:,5.3.2 用地址表法实现CASE结构(即多路分支),图5.6 用地址表法实现多路分支的结构框图,例5.4:编程实现菜单选择,根据不同的选择做不同的事情。,解:假设有3路分支,在地址表中的入口地址分别:A0、A1、A2;具体见图5.7所示:,5.3.2 用地址表法实现CASE结构(续),参考程序: DATA SEGMENT MENU DB 0DH,0AH,“0:Chinese!“ DB 0DH,0AH,“1:English!“ DB 0DH,0AH,“2: German!“ DB 0DH,0AH,“Pl

8、ease choose one to answer the following question:$“ ER DB 0DH,0AH,“I am sorry,you choose the mistake!$“,5.3.2 用地址表法实现CASE结构(续),S0 DB 0DH,0AH,“OK,Please answer in Chinese!$“ S1 DB 0DH,0AH,“OK,Please answer in English!$“ S2 DB 0DH,0AH,“OK,Please answer in German!$“ TAB DW A0,A1,A2 ;地址表 DATA ENDS CODE

9、SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,MENU ;显示菜单 MOV AH,9 INT 21H,5.3.2 用地址表法实现CASE结构(续),MOV AH,1 ;1号DOS功能调用,接收分支号 INT 21H CMP AL,0 ;进行合法判断 JB ERROR CMP AL,2 JA ERROR LEA BX,TAB ;取地址表首址 SUB AL,30H SHL AL,1 ;段内转移乘以2,段间转移乘以4 XOR AH,AH ;AH清零 ADD BX,AX JMP WORD PTR BX ;产生多分支

10、转移,5.3.2 用地址表法实现CASE结构(续),A0: LEA DX,S0 ;各分支程序段 MOV AH,9 INT 21H JMP EXIT1 A1: LEA DX,S1 MOV AH,9 INT 21H JMP EXIT1 A2: LEA DX,S2 MOV AH,9 INT 21H JMP EXIT1,5.3.2 用地址表法实现CASE结构(续),ERROR: MOV DX,OFFSET ER MOV AH,9 INT 21H EXIT1: MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,5.3.2 用地址表法实现CASE结构(续),用转移

11、表法实现CASE结构的基本思路:将转到各分支程序的转移指令依次罗列形成一个转移表,让BX指向转移表的首地址,从键盘接收或其他方式获取要转到的分支号,再让BX与分支号进行运算,使BX指向对应转移表中转到该分支的转移指令处,最后即可使用JMP BX指令实现所要转到的分支;具体见图5.8所示:,5.3.3 用转移表法实现CASE结构(续),图5.8 用转移表法实现多路分支的结构框图 例5.5:编程实现菜单选择,根据不同的选择做不同的事情。 解:假设有3路分支,转移表中的转移指令分别为:JMP SHORT A0、JMP SHORT A1、JMP SHORT A2;具体见图5.9所示:,5.3.3 用转

12、移表法实现CASE结构(续),参考程序: DATA SEGMENT MENU DB 0DH,0AH,“0:Chinese!“ DB 0DH,0AH,“1:English!“ DB 0DH,0AH,“2: German!“ DB 0DH,0AH,“Please choose one to answer the following question:$“,5.3.3 用转移表法实现CASE结构(续),ER DB 0DH,0AH,“I am sorry,you shoose the mistake!$“ S0 DB 0DH,0AH,“OK,Please answer in Chinese!$“ S1

13、 DB 0DH,0AH,“OK,Please answer in English!$“ S2 DB 0DH,0AH,“OK,Please answer in German!$“ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,MENU ;显示菜单 MOV AH,9 INT 21H,5.3.3 用转移表法实现CASE结构(续),MOV AH,1 ;1号DOS功能调用,接收分支号 INT 21H CMP AL,0 JB ERROR CMP AL,2 JA ERROR LEA BX,T

14、AB ;取地址表首址 SUB AL,30H SHL AL,1 ;短转移乘以2,近转移乘以3,远转移乘以5 XOR AH,AH ;AH清零 ADD BX,AX,5.3.3 用转移表法实现CASE结构(续),JMP BX ;产生多分支转移 TAB: JMP SHORT A0 ;转移表 JMP SHORT A1 JMP SHORT A2 A0: LEA DX,S0 ;各分支程序段 MOV AH,9 INT 21H JMP EXIT1 A1: LEA DX,S1 MOV AH,9 INT 21H,5.3.3 用转移表法实现CASE结构(续),JMP EXIT1 A2:LEA DX,S2 MOV AH,

15、9 INT 21H JMP EXIT1 ERROR: MOV DX,OFFSET ER MOV AH,9 INT 21H EXIT1: MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,5.3.3 用转移表法实现CASE结构(续),1.设置循环的初始状态 如置循环次数的计数值,以及为循环体正常工作的初始状态等; 2.循环体这是循环的工作主体,它由循环的工作部分及修改部分组成。3.循环控制部分它是循环程序设计的关键,每一个循环程序必须选择一个循环控制条件来控制循环的运行和结束,通常有两种方法控制循环:用计数控制循环,用条件控制循环,5.4 循环结构程序设

16、计,5.4.1 循环程序的组成,循环程序有两种结构:一种是DO-WHILE结构形式,另一种是DO-UNTIL结构形式。具体见图5.10所示:DO-WHILE结构把对循环控制条件的判断放在循环的入口,先判断条件,满足条件就执行循环体,否则退出循环。DO-UNTIL结构是先执行循环体然后再判断控制条件,不满足条件则继续执行循环操作,一旦满足条件则退出循环。一般讲,如果循环次数等于0的可能,则应选择DO-WHILE结构,否则用DO-UNTIL结构。,5.4.2 循环程序的结构形式,图5.10 循环程序的结构形式,5.4.2 循环程序的结构形式(续),这种方法直观、方便,易于程序设计。只要在编制程序时

17、,循环次数已知,就可以使用这种方法设计循环程序。然而更多的循环程序,在编制程序时并不能确切知道循环次数,但是知道循环次数是前面运算或操作的结果或者被存放在某内存单元中。,5.4.3 循环控制的方法,1.用计数控制循环,例5.6:试编制程序统计字节变量VAR中1的个数,并将它存入COUNT单元中。,解:要测试出VAR中1的个数就应该逐位进行测试,可根据最低位是否为1来计数,然后用移位的办法把各位数逐次移到最低位去,共需要测试8次。程序流程如图5.11所示:,1.用计数控制循环,5.4.3 循环控制的方法(续),图5.11 例5.6的功能实现流程图,5.4.3 循环控制的方法(续),参考程序: D

18、ATA SEGMENT VAR DB 37H COUNT DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA BEGIN: MOV AX,DATA MOV DS,AX MOV AL,VAR ;ALVAR的值 MOV CX,8 ;赋循环初值 XOR BL,BL ;赋计数器初值,5.4.3 循环控制的方法(续),LL: TEST AL,1 ;测试AL的最低位 JZ LL1 ;最低位为0转LL1 INC BL ;计数器加1 LL1: SHR AL,1 ;逻辑右移1位 LOOP LL ;循环控制 MOV COUNT,BL ;COUNT计数器BL的值 M

19、OV AH,4CH ;返回DOS INT 21H CODE ENDS END BEGIN,5.4.3 循环控制的方法(续),2.用条件控制循环,例5.8:将正整数NUM插入到一个从小到大排列好顺序的正整数字节数组序列中。,分析: 根据上述分析,可以得出程序流程如图5.13所示:,5.4.3 循环控制的方法(续),图5.13 例5.8的功能实现流程图,5.4.3 循环控制的方法(续),参考程序: NUM EQU 36H DATA SEGMENT ARRAY DB 12H,24H,48H,60H,72H,84H Y DB ? DATA ENDS CODE SEGMENT ASSUME CS:COD

20、E,DS:DATA BEGIN: MOV AX,DATA MOV DS,AX MOV CX,Y-ARRAY ;循环次数初始化 MOV AL,NUM ;插入值送AL,5.4.3 循环控制的方法(续),LEA SI,Y DEC SI ;取得ARRAY的最后元素的偏移地址 LOP: CMP ARRAYSI,AL ;比较 JLE INSERT MOV AH,ARRAYSI MOV ARRAYSI+1,AH ;数据交换 DEC SI ;修改偏移地址 LOOP LOP INSERT: MOV ARRAYSI+1,AL ;插入数据 MOV AH,4CH,5.4.3 循环控制的方法(续),INT 21H CO

21、DE ENDSEND BEGIN,5.4.3 循环控制的方法(续),5.5 子程序设计,前面我们学习了过程定义伪指令,我们也就是用它们来构成的子程序,其格式为: 子程序名 PROC (NEAR/FAR) 保存信息 恢复信息 RET 子程序名 ENDP,5.5.1 子程序的构造,IBM PC机的CALL和RET指令就分别完成了子程序的调用和返回功能。 1.调用指令:CALL 过程名执行CALL指令,首先保留断点地址于堆栈中,然后转移到目标单元,它对PSW无影响。 2.返回指令:RET一个子程序执行的最后一条指令必定是返回指令RET,用以返回到调用子程序的断点处。但在位置上并不一定就是是最后一条指

22、令。,5.5 子程序设计(续),5.5.2 子程序的调用与返回,子程序必须具有通用性 注意保存信息和恢复信息 选用适当的方法在子程序和主程序之间的进行参数传递,5.5 子程序设计(续),5.5.3 编制子程序的要求,主程序与子程序之间的信息传送称为参数传递。 它可以有以下三种: 用寄存器传递参数 用地址表传递参数 用堆栈传递参数,5.5 子程序设计(续),5.5.3 编制子程序的要求,参数传递,1宏定义 宏在使用前必须先进行宏定义。宏定义格式为: 宏指令名 MACRO 形式参数,形式参数,宏体ENDM 其中,宏指令名:宏定义的名字,不可缺省,宏调用时要使用它,第一个符号必须是字母,其后可以是字

23、母或数字,5.6 高级汇编语言技术,5.6.1 宏汇编,MACROENDM:宏定义伪指令助记符,不可缺省。它们成对出现,表示宏定义的开始和结束,ENDM前不带宏指令名。 宏体:一段有独立功能的程序代码段。 形式参数:又称哑元,各个哑元之间用逗号隔开,可以缺省。,5.6.1 宏汇编,5.6 高级汇编语言技术(续),2宏调用 经宏定义后的宏指令可以在源程序中调用,宏调用格式为: 宏指令名 实参,实参宏调用只需要有宏指令名,若宏定义中有形参,那么宏调用时必须带有实际参数来替代形参,实际参数的个数,顺序,类型与形参一一对应,各个实参之间用逗号分开。原则上实参的个数与形参的个数相等,但汇编程序不要求它们

24、必须相等,若实参个数大于形参个数,则多余的实参不予考虑,若实参个数小于形参个数,则多余的形参作“空”处理。,5.6.1 宏汇编,5.6 高级汇编语言技术(续),3宏展开汇编程序在对源程序汇编时,对每个宏调用作宏展开,每条插入的宏体指令前带上加号“+”。,例5.11:不带参数的宏定义,用宏指令来实现回车换行。 宏定义: CRLF MACRO MOV DL,0DH ;回车 MOV AH,2 INT 21H MOV DL,0AH ;换行 MOV AH,2,5.6.1 宏汇编(续),INT 21HENDM 宏调用:CRLF 宏展开:将下述程序段替换宏调用语句。 MOV DL,0DH ;回车 MOV A

25、H,2 INT 21H MOV DL,0AH ;换行 MOV AH,2 INT 21H,5.6.1 宏汇编(续),宏定义中的参数可以有多个,实参可以是数字,寄存器或操作码。宏定义还可用部分操作码作参数,但在宏定义中必须用“&”作分隔符,&是一个操作符,它在宏定义体中可作为哑元的前缀,宏展开时,可以把&前后两个符号合并成一个符号。,例5.12:宏定义带一个参数,用宏指令实现将AX中内容右移任意次(小于256)。,宏定义: SHIFT MACRO NMOV CL,NSAL AX,CLENDM 宏调用1: SHIFT 4,5.6.1 宏汇编(续),4.宏调用中参数传递,宏调用2: SHIFT 8 宏

26、展开1: MOV CL,4 ;AX中内容算术左移4次SAL AX,CL 宏展开2: MOV CL,8 ;AX中内容算术左移8次SAL AX,CL,5.宏定义嵌套 在宏定义中允许使用宏调用,但必须先定义后调用。,例5.14: 宏定义: AD1 MACRO M,NMOV BX,M,5.6.1 宏汇编(续),ADD AX,N ENDM AD1M MACRO R1,R2,R3 PUSH AX PUSH BX AD1 R1,R2 MOV X3,AX POP BX POP AX ENDM 宏调用: AD1M CX,BX,DX 宏展开: PUSH AX,5.6.1 宏汇编(续),PUSH BX AD1 R1

27、,R2 ;此语句不占内存 MOV BX,CX ;AD1宏定义展开 ADD AX,BX MOV DX,AX POP BX POP AX,5.6.1 宏汇编(续),5.6.1 宏汇编(续),格式为:PURGE 宏指令名,宏指令名 PURGE:伪指令助记符,不可缺省,因为经过定义的宏指令名,不允许重新定义,必须用PURGE语句将其取消后,才能重新定义,此语句一次可以取消多个宏指令名。,6.取消宏定义语句,5.6.1 宏汇编(续),7.宏指令与子程序的区别,过程调用使用CALL语句,由CPU执行,宏指令调用由宏汇编程序MASM中宏处理程序来识别。,过程调用时,每调用一次都要保留程序的断点和保护现场,返

28、回时要恢复现场和恢复断点,增加了操作时间,执行速度慢。而宏指令调用时,不需要这些入栈及出栈操作,执行速度较快。,一个子程序设计,一般完成某一个功能,多次调用完成相同操作,仅入口参数可以改变,而宏指令可以带哑元,调用时可以用实元取代,使不同的调用完成不同的操作,增加使用的灵活性。,过程调用的子程序与主程序分开独立存在,经汇编后在存储器中只占有一个子程序段的空间,主程序转入此处运行,因此目标代码长度短,节省内存空间。而宏调用是在汇编过程中展开,宏调用多少次,就插入多少次,因此目标代码长度大,占内存空间多;,7.宏指令与子程序的区别,5.6.1 宏汇编(续),1定重复 格式: REPT 表达式 宏体

29、 ENDM 其中,REPTENDM:伪指令助记符,必须成对出现,不可省略。宏体:表示需要重复的语句序列。表达式:表示重复次数。,5.6.2 重复汇编,重复汇编伪指令语句有以下三种:,5.6 高级汇编语言技术(续),例5.16:将2、4、8、16、32分配给连续的5个存储单元。NUM=1REPT 5NUM=NUM*2DB NUMENDM汇编后: DB 2DB 4DB 8DB 16DB 32,5.6.2 重复汇编,5.6 高级汇编语言技术(续),格式: IRP 形参,实参表宏体 ENDM 其中,IRPENDM:伪指令助记符,必须成对出现,不可省略。宏体:要重复的语句序列,重复次数由参数个数决定。实

30、数表中是每次重复时将要取的实参,实参之间用逗号隔开,实参表用尖括号括起来。每次重复,依次取实参表中一项,代入语句序列中哑元。前面将2、4、8、16、32分配给连续的5个存储单元的例子也可以用如下不定重复伪指令: IRP NUM,2,4,8,16,32DB NUMENDM,2不定重复,5.6.2 重复汇编(续),例5.17:若要把AX,BX,CX,DX的内容压入堆栈,则可以用如下不定重复伪指令: IRP REG,AX,BX,CX,DXPUSH REGENDM 汇编后展开为以下四条指令:PUSH AXPUSH BXPUSH CXPUSH DX,5.6.2 重复汇编(续),格式为:IRPC 形式参数

31、,字符串宏体ENDM 其中,IRPCENDM:伪指令助记符,必须成对出现,不可省略。宏体:重复执行的语句序列,每次重复时依次用字符串中字符代替形式参数,重复次数取决于字符串中字符的个数。字符串:可用尖括号也可不用尖括号括起来。,5.6.2 重复汇编(续),3不定重复字符,汇编后展开为以下四条指令:POP DXPOP CXPOP BXPOP AX,例5.18:若要从堆栈中弹出4个字,分别送入DX,CX,BX,AX,则可用如下不定重复字符伪指令: IRPC REG,POP REG&XENDM,3不定重复字符,5.6.2 重复汇编(续),条件汇编是对给定的条件进行测试,汇编程序根据测试结果,将一段程

32、序嵌入源程序汇编或不进行汇编,它的一般格式为: IF 表达式指令体1 ;条件为真汇编指令体1 ELSE 指令体2 ;条件为假汇编指令体2 ENDIF,5.6.3 条件汇编,5.6 高级汇编语言技术(续),其中,IFENDIF:条件汇编伪指令助记符,必须成对出现,不可省略。IF语句后的“”是指定的条件。如果“IF”指定的条件为真时则宏汇编程序将指令体1中的语句汇编成相应的目标代码,否则就把指令体2中的语句汇编成相应的目标代码。 ELSE:是任选部分,如果没有ELSE,那么“IF”指定的条件满足就汇编,否则就不汇编。,5.6 高级汇编语言技术(续),5.6.3 条件汇编,“IF”条件汇编的形式见表

33、5.1所示:,5.6.3 条件汇编,例5.20:利用条件汇编伪指令,可以根据不同情况,产生无条件转移指令如JMP,或产生条件转移指令如JE、JNE、JB、JNB等。 宏定义: GOTO MACRO LOP,X,REL,Y IFB REL JMP LOP ELSE MOV AL,X CMP AL,Y J&REL LOP ENDIF ENDM,5.6.3 条件汇编,宏调用: GOTO LOP1,VAR1,E,VAR2 GOTO EXIT1 宏展开: MOV AL,VAR1 CMP AL,VAR2 JE LOP1 JMP EXIT1 ,5.6.3 条件汇编,为了了解程序运行过程中的情况,应设法将运算

34、结果显示到显示器上,最简单的方法就是调用操作系统的I/O子程序,我们称为DOS功能调用。DOS为程序设计人员提供了许多可直接调用的功能子程序。调用时需要使用软中断指令: INT n 其中:n为中断调用类型号,其值为00FFH。在使用INT指令前,应将调用的功能号送入AH,有关入口参量送入指定寄存器中。若有出口参量,中断调用返回后,结果在指定的寄存器或存储单元中。DOS功能子程序的调用使用软中断指令“INT 21H”。DOS共有84个功能子程序。这些子程序的主要功能是:磁盘的读写控制、文件操作、目录操作、内存管理、基本输入输出管理及设置/读出系统日期、时间等。,5.7 DOS功能子程序的调用,下

35、面例举部分常用的DOS功能子程序。1带显示的键盘输入(1号功能)该功能子程序等待键盘输入,直接按下一个键(即输入一个字符),把字符的ASCII码送入AL,并在屏幕上显示该字符。如果按下的键是Ctrl-C组合键,则停止程序运行。如果按下TAB制表键,屏幕上光标自动扩展到紧接着的8个字符位置后面。1号功能调用,毋需入口参量,出口参量在AL中。如: MOV AH,01H INT 21H,5.7 DOS功能子程序的调用(续),2不带显示的键盘输入(7号功能)与1号功能类似,它仅等待键盘输入一个字符,并将字符的ASCII码送入AL中。但按下Ctrl-C组合键和TAB制表键无反应。调用方法如下: MOV

36、AH,7 INT 21H缓冲区第一个字节存放它能保存的最大字符数(1255,不能为0!),该值由用户程序自己事先设置。如果键如的字符数比此数大,那就会发出“嘟嘟”声,而且光标不再向右移动。,5.7 DOS功能子程序的调用(续),缓冲区第二个字节存放用户本次调用时实际输入的字符数(回车键除外),这个数由DOS返回时自动填入。用户从键盘输入的字符从第三个字节开始存放,直到用户输入回车键为止,并将回车键码(0DH)加在刚才输入字符串的末尾上。 调用时,用DS:DX寄存器指向输入缓冲区的段基值:偏移量。例如在数据区定义的字符缓冲区如下: MAXLEN DB 18 ACTLEN DB ? STRING

37、DB 18 DUP(0),5.7 DOS功能子程序的调用(续),则输入串的指令如下:MOV AX,SEG MAXLENMOV DS,AXMOV DX,OFFSET MAXLENMOV AH,0AHINT 21H,5.7 DOS功能子程序的调用(续),5字符显示(2号功能) 本功能子程序仅在屏幕上显示单个字符。要显示字符的ASCII码存放在DL中。如果DL中存放退格键编码,在屏幕上便向左移一个字符位置,并使该位置成为空格。移动后光标停留在那里。如要显示字符A,可用下列几条指令调用: MOV DL,A MOV AH,2 INT 21H,6字符打印(5号功能) 5号功能子程序把DL中的字符(ASCI

38、I码)送入打印机接口,打印输出。功能调用为: MOV DL,A MOV AH,5 INT 21H,5.7 DOS功能子程序的调用(续),7字符串显示(9号功能)9号功能子程序能在屏幕上显示多于一个的字符串。要显示的字符串必须先放在内存一数据区中,且字符串以美元符号作为结束标志。非显示字符,可以用它的ASCII码插入字符串中间。进行9号功能调用时,先把待显示的字符串首地址的段基值和偏移量分别存入DS和DX中。 在数据段中定义一个待显示符号串如: STRING DB “THIS IS A PROGRAM”,0AH,0DH,“”,则显示该符号串的指令为:LEA DX,STRINGMOV AH,9IN

39、T 21H,5.7 DOS功能子程序的调用(续),8取中断向量(35H号功能)35H号功能把由AL指定的中断类型号的中断向量从中断向量表中取到ES:BX中。即必须把要取出的中断类型号N送给AL,调用35H功能后,与中断类型号N对应的中断向量则保存在ES:BX中。其调用示例如下: MOV AL,N MOV AH,35H INT 21H,9设置中断向量(25H号功能)25H号功能把由AL指定的中断类型的中断向量DS:DX放置在中断向量表中。具体设置过程为:首先将要设置的中断类型号送AL,然后把要设置的中断服务程序的段地址和偏移量分别送DS、DX,最后再调用25H功能。典型的使用DOS功能调用存取中

40、断向量的程序段如下: MOV AL,N ;取出并保存原中断向量 MOV AH,35H INT 21H PUSH BX,5.7 DOS功能子程序的调用(续),PUSH ES PUSH DS MOV AX,SEG INTERRUPT MOV DS,AX MOV DX,OFFSET INTERRUPT MOV AL,N MOV AH,25H INT 21H POP DS POP DS,5.7 DOS功能子程序的调用(续),恢复原中断向量 POP DX MOV AL,N MOV AH,25H INT 21H MOV AH,4CH ;返回DOS INT 21H INTERRUPT: ;中断服务程序 IR

41、ET ,5.7 DOS功能子程序的调用(续),11设置系统日期(2BH功能)调用本功能子程序时,必须在CX和DX中设置有效日期,其中,CX中存放年号(19802099),DH中存放月号(112),DL中存放日(131)。如果日期设置有效,待功能子程序返回时,(AL)=0,否则(AL)=0FFH。所以为了检查设置是否成功,通常在调用2BH号功能后检查AL中内容。,5.7 DOS功能子程序的调用(续),10读出系统日期(2AH号功能)本功能子程序的执行,将系统的年、月、日、星期的数据读出,并存入指定的寄存器中: CX 年(19802099) DH 月(112) DL 日(131) AL 星期(0星期日,1星期一等),13设置系统时间(2DH功能)调用本功能子程序时,必须在CX和DX中设置有效时间(。如果设置时间有效,从功能子程序返回时,(AL)=0,否则(AL)=0FFH。,5.7 DOS功能子程序的调用(续),12读出系统时间(2CH功能)本功能子程序从系统中可得到当时的时间:时、分、秒和百分秒,它们分别存放在CX和DX寄存器中: CH 小时 (023) CL 分 (059) DH 秒 (059) DL 百分秒(099),

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报