2019/11/1 3.4常用D0S系统功能调用 微机技术与仪器系统设计 ·将控制外设的过程编写成程序,作为操作系统的一 部分事先放在系统盘上,用户在需要时只要按规定 的格式设置好参数,直接调用即可。这种方式叫做 第三章 汇编语言程序设计 利用操作系统的标准功能调用进行输入输出。 系统功能调用NT21H •调用方法 ·设置入口参数 ·DOS规定使用软中断指令NT21H作为各功能子 程序的总入口,再为每个功能调用规定一个功能 在AH设置功能号m 号,调用功能号即可进入相应的子程序入口。 执行中断指令NT21H [分桥、应用出口参数
2019/11/1 1 微机技术与仪器系统设计 第三章 汇编语言程序设计 1 3.4 常用DOS系统功能调用 •将控制外设的过程编写成程序,作为操作系统的一 部分事先放在系统盘上,用户在需要时只要按规定 的格式设置好参数,直接调用即可。这种方式叫做 利用操作系统的标准功能调用进行输入/输出。 系统功能调用 INT 21H • DOS规定使用软中断指令INT 21H作为各功能子 程序的总入口,再为每个功能调用规定一个功能 号,调用功能号即可进入相应的子程序入口。 •调用方法 •设置入口参数 •在AH设置功能号m •执行中断指令INT 21H •分析、应用出口参数 1 2 3 4
2019/11/1 修检查能盘状态 入特丰从健去热收字特事内替入道 入口:AH=0BH 出口:AL=FFH(有赞按下),AL=OOH(无幢按 入口:AH=0AH,DSD区抛向李特率首址, 下) 被字特奉以“回车”姑见。 2)带显示的健造输入 出口:是示字将事 入:AH=01H 注:要求亭先定义一个输入城冲区, 出口,L=输入字符轴码并在屏幕显示字符 第一小学节为所能保存的最大李符数 幕二个字节为夹际楼收的李特个数 3)显示单个字符 第三个字节起旅次存放所输入乎符的ASCI网 入口:AH=02H,DL=字符箱码 调用时,要求DSD区指向前入城冲区的首地址。就入寺韩事 出口:显示字符 以国车结来。 ”有 SEGMENT 箭:从键盘输入一个小于50个字符的字符串数据。 DATA SEGMENT DB 80 DUP(?) BUF DB 50 DB? DATA ENDS DB 50 DUP(?) DATA ENDS C-COOE CODE SEGMENT MOV DX,OFFSET BUF INT 21H MOV AH.10 INT 21H 如此时输入字符率THIS IS A PROGRAM☑,藏冲 区INBUFFER中的存馈单元内容分别为 CODE ENDS P
2019/11/1 2 1)检查键盘状态 入口: AH=0BH 出口:AL=FFH(有键按下);AL=00H(无键按 下) 2)带显示的键盘输入 入口: AH=01H 出口:AL=输入字符编码并在屏幕显示字符 3)显示单个字符 入口: AH=02H,DL=字符编码 出口:显示字符 4)输入字符串(从键盘接收字符串到内存输入缓冲区) 入口: AH=0AH,DS:DX指向字符串首址, 该字符串以“回车”结尾。 出口:显示字符串 注:要求事先定义一个输入缓冲区, 第一个字节为所能保存的最大字符数 第二个字节为实际接收的字符个数 第三个字节起依次存放所输入字符的ASCII码 调用时,要求DS:DX指向输入缓冲区的首地址。键入字符串 以回车结束。 • 例:从键盘输入一个小于50个字符的字符串数据。 DATA SEGMENT BUF DB 50 DB ? DB 50 DUP(?) DATA ENDS • CODE SEGMENT • . • MOV DX, OFFSET BUF • MOV AH, 10 • INT 21H • . • CODE ENDS DATA SEGMENT INBUFFER DB 81 DB ? DB 80 DUP(?) . DATA ENDS . CODE SEGMENT ASSUME DS:DATA, SS:STACK, CS:CODE . MOV DX,OFFSET INBUFFER MOV AH,0AH INT 21H . CODE ENDS • 如果此时输入字符串END . THIS IS A PROGRAM↙,缓冲 区INBUFFER中的存储单元内容分别为 5 6 7 8
2019/11/1 .data SEGMENT max DW100H,?,100HDUP(?) :定义为字类型 .data ENDS 0123456789-0a-0b0c0d-0e0f code SEGMENT 内容 0-01o0-o0-oo0-o0-o0-o0-o0-00-o0-o0og-o0-o0 ASSUME CS:code,DS:data start: MOV AX,data ;置缓冲区地址于D$:DX ax MOV DS,AX 结果是:不等待输入,结束0A功能调用。 -DS:DX LEA DX,max 。 MOV AH,OAH ;调输入功能 注意:0AH功能以字节类型应用DSDX指向的最冲区。 INT 21H 并不随颜冲区类型定义的变化而变化。 4 .code ENDS END start :5)显示输出字符串,将级冲区中的一组以“$”结束的字 符申送标准输出设备输出。调用前必须将输出领冲区的首 地址送DS:DX。 入8Aa生8光PS:DX指向字符串首址, BUF DB 'HOW DO YOU DO 7 $ DATA ENDS CODE SEGMENT MOV DX,OFFSET BUF MOV AH,9 INT 21H CODE ENDS 11 3
2019/11/1 3 9 •data SEGMENT •max DW 100H,? ,100H DUP ( ? ) ;定义为字类型 •data ENDS •code SEGMENT • ASSUME CS:code, DS:data •start: MOV AX, data ;置缓冲区地址于DS:DX • MOV DS, AX • LEA DX, max • MOV AH, 0AH ;调输入功能 • INT 21H • . •code ENDS • END start •结果是:不等待输入,结束0AH功能调用。 •00•01•00•00•00•00•00•00 •max •0 •7 •00•00•00•00•00•00•00•00 •地址 •1 •2 •3 •4 •5 •6 •8 •9 •0a•0b•0c•0d•0e •0f •内容 •DS:DX •注意:0AH功能以字节类型应用DS:DX指向的缓冲区。 • 并不随缓冲区类型定义的变化而变化。 5)显示输出字符串,将缓冲区中的一组以“$”结束的字 符串送标准输出设备输出。调用前必须将输出缓冲区的首 地址送DS:DX。 入口: AH=09H,DS:DX指向字符串首址, 该字符串以“$”结尾。 出口:显示字符串 • DATA SEGMENT • BUF DB ‘HOW DO YOU DO ? $’ • DATA ENDS • CODE SEGMENT • . • MOV DX, OFFSET BUF • MOV AH, 9 • INT 21H • . • CODE ENDS 9 10 11 12
2019/11/1 ATA SEGMENT BUFE1 DR OAH NUMBER'S 从 DATA ENDS CODE SEGMENT 6)结束程序,返回操作系统 AH.O1H 入口: AH=4CH NUMBER INT 21H snaspsinnuxber 香则显示 CMP AL,30H 出口:屏幕显示操作系统提示符 ERROR IC SHOWE egsimnba CMP AL,3AH INC SHOWE OWBUFF LEA DX.SHOWBUFF MOV AH,09 5 INT 21H MOV AH,4CH T21 13 DATA SEGMENT INBUFF DB 28 LEA DXCRLF :率、换行 H,09 28 DUP(7 例从能盘 DB OdH OAH.'S 入一 LEA DXINI8UFF+2:示抛入的 STACK SEGMENT STACK 符,并将该 DW 100H DUP(?) OV AH,9 串字符在下 行显示。 int 2h 4ch CS:CODEDS:DATA.SSS START:MOV AX,DATA CODE ENDS MOV DS,AX END START MOV DX SET INBU听 UFF+2 平 MOV BYTE PTRISI,室 15 4
2019/11/1 4 6)结束程序,返回操作系统 入口: AH=4CH 出口:屏幕显示操作系统提示符 例. 从键盘 输入一个字 符,如果为 数字键,显 示 NUMBER, 否则显示 ERROR DATA SEGMENT SHOWBUFF1 DB 0AH,'NUMBER','$' SHOWBUFF2 DB 0AH,'ERROR$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AH,01H INT 21H CMP AL,30H JC SHOWE CMP AL,3AH JNC SHOWE LEA DX,SHOWBUFF1 JMP DONE SHOWE: LEA DX,SHOWBUFF2 DONE: MOV AH,09 INT 21H MOV AH,4CH INT 21H CODE ENDS END START 例.从键盘 输入一串字 符,并将该 串字符在下 一行显示。 DATA SEGMENT INBUFF DB 28 DB ? DB 28 DUP(?) CRLF DB 0dH, 0AH,'$' DATA ENDS STACK SEGMENT STACK DW 100H DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET INBUFF MOV AH,0AH INT 21H MOV AL,INBUFF+1 ;给输入的字 符串末尾添加'$' CBW LEA SI,INBUFF+2 ADD SI,AX MOV BYTE PTR[SI],'$' LEA DX,CRLF ;回车、换行 MOV AH,09 INT 21H LEA DX,INBUFF+2 ;显示输入的 字符串 MOV AH,9 INT 21H mov ah, 4ch int 21h CODE ENDS END START 13 14 15