第10章 DOS功能调用与BIOS中断调用
利用DOS(磁盘操作系统)功能调用和BIOS(基本输入输出)中断调用,程序员在不必了解硬件I/O接口特性的情况下,能非常方便地完成标准设备输入、数据输入、文件管理和系统信息查询等操作。 MSDOS.SYS IO.SYS ROM-BIOS 输入输出设备
用户程序 ROM BIOS 基本I/O 系 统 硬 件 用户命令 BIOS和DOS中断子程层次特点 用户程序 磁盘管理模块(DOS内核) MSDOS.SYS 系统功能 基本输入/输出 BIOS 模 块 IO.SYS 设备驱动 ROM BIOS 基本I/O 系 统 硬 件 装入 命令处理模块 COMMAN D.COM 用户命令 DOS系统层次结构
层次特点: ROM BIOS中的中断子程 使用IN/OUT指令直接控制外设, 实现与外设之间的输入/输出操作, 以软件形式向其上层提供服务。 IO.SYS中的中断子程 ( 称基本输入/输出BIOS模块) 调用ROM BIOS的基本I/O功能, 向 MSDOS.SYS提供设备驱动服务。 用户程序 磁盘管理模块(DOS内核) MSDOS.SYS 系统功能 基本输入/输出 BIOS 模 块 IO.SYS 设备驱动 ROM BIOS 基本I/O 系 统 硬 件 装入 命令处理模块 COMMAN D.COM 用户命令
用户命令 MSDOS.SYS中的中断子程 ( 称DOS内核模块 ) 调用IO.SYS,实现对外设的控制。 用户程序 与标准外设有两层隔离 : 基本输入/输出 BIOS 模 块 IO.SYS 设备驱动 ROM BIOS 基本I/O 系 统 硬 件 装入 命令处理模块 COMMAN D.COM 用户命令 MSDOS.SYS中的中断子程 ( 称DOS内核模块 ) 调用IO.SYS,实现对外设的控制。 与标准外设有两层隔离 : IO.SYS和ROM BIOS。 其中21H类型的中断子程 提供了丰富的系统服务, 称21类型的中断调用 为DOS系统(功能)调用。
用户命令 用户编程原则 ①尽可能使用DOS的系统功能调用, 用户程序 提高程序可移植性。 ②在DOS功能不能实现情况下, MSDOS.SYS 系统功能 基本输入/输出 BIOS 模 块 IO.SYS 设备驱动 ROM BIOS 基本I/O 系 统 硬 件 装入 命令处理模块 COMMAN D.COM 用户命令 用户编程原则 ①尽可能使用DOS的系统功能调用, 提高程序可移植性。 ②在DOS功能不能实现情况下, 考虑用BIOS功能调用。 ③在DOS和BIOS的中断子程 不能解决问题时, 使用IN/OUT指令直接控制硬件。
中断与中断源 1、中断:当一种特殊事件发生时,CPU停止正在运行的程序,而转去执行该事件的处理程序,处理完该事件后,再返回原程序继续正确地执行下去,这个过程就称为中断。 2、中断源:引起中断的事件。
8086/8088的中断源如图所示。80286以后使用两片8259级连结构,可管理15级中断。 非屏蔽中断请求 中断逻辑 INT n 指令 INT0 除法 错误 单步 TF=1 IR0 8259A IR1 可编程 IR2 中断 IR3 控制器 IR4 (PIC) IR5 IR6 IR7 INTR NMI CPU n 4 1 系统定时器 键盘 彩色/图形接口 保留(通信) 串行通信接口 保留(ALT打印机) 软盘 保留(打印机) 8086/8088中断源 08 09 0A 0B 0C 0D 0E 0F
2. 中断类型分类 向量表中的中断类型分为七类: ① 处理CPU特殊操作( 除0、溢出 )的00H、04H类型。 ② 为DEBUG调试程序设置的单步( 01H )、断点( 03H )类型。 ③ 处理CPU的NMI引脚信号的02H类型。 非屏蔽硬中断子程 ④ 处理CPU的INTR引脚信号的08~0FH类型。 可屏蔽类型硬中断子程 ⑤ 用INT指令调用的中断子程 BIOS功能调用(如10~1AH) DOS功能调用 (如 21H) NMI INTR 8088
⑥ 保留类型 为DOS系统保留 1)指现在未用到,以后系统可能会用到。 2)已用到,但不向用户公开。 为用户保留 1)被系统子程嵌套调用了的类型 ( 如1BH、1CH )。 使用户在系统功能基础上扩充功能。 2)系统未占用类型 ( 如 60H~67H )。 ⑦ 非中断向量类型 对应向量表中的4个单元存放的不是中断向量。 (如1DH、1EH、1FH、41H、46H、22H) 通常是一些参数表的地址信息.
中断向量分配表
3. 调用方法 设置入口参数 在AH设置功能号m 执行中断指令INT N 分析、应用出口参数
例1 单字符显示功能调用 MOV DL, ‘A’ ;设置入口参数 MOV AH, 02H ;设置功能号 INT 21H ;执行中断调用 例2 单字符输入功能调用 MOV AH, 01H ;设置功能号
10.2 BIOS中断调用 BIOS中断分为四类: (1)内中断:中断类型号为00H-07H,包括被零除中断、单步中断、不可屏蔽中断、断点中断、溢出中断、屏幕拷贝等。 (2)外中断:中断类型号08H-0FH,主要处理计时器、键盘、通信端口、硬盘、软件等。 (3)设备驱动:中断类型号10H-17H,服务对象包括显示器、内存检查、通信I/O、键盘I/O、打印机I/O等。 (4)特殊中断:中断类型号18H-1FH,包括ROM BASIC、DOS自举、日期调用、键盘中断、计时器控制、显示器参数、图形字符表等。
10.2.1 BIOS中断调用方法 调用BIOS中断程序的基本过程: (1)将调用参数(入口参数)装入指定的寄存器中; (2)功能号送入AH寄存器。 (3)如需要将子功能号送入AL寄存器。 (4)发送INT n软中断指令(有时通过通用寄存器带回出口参数)。
10.2.2 常用BIOS中断调用 中断 功能 INT 10H 显示器I/O INT 16H 键盘I/O INT 11H 取设备信息 取内存容量 INT 18H ROM BASIC INT 13H 磁盘I/O INT 19H 引导装入程序 INT 14H RS-232串行口I/O INT 1AH 时钟 INT 15H 磁带I/O INT 40H 软盘BIOS
例:BIOS键盘中断 ( INT 16H) AH 功能 返回参数 0 从键盘读一字符 AL=字符码,AH=扫描码 1 读键盘缓冲区的字符 如ZF=0,AL=字符码,AH=扫描码 如ZF=1,缓冲区空 2 取键盘状态字节 AL=键盘状态字节
INT 10H 视频程序设计 (1)00H号功能 功能: 显示方式设置 入口参数: AL=显示方式 (P181) 出口参数: 无 功能: 显示方式设置 入口参数: AL=显示方式 (P181) 出口参数: 无 【例11.2】图形方式设置示例。 MOV AH,00H MOV AL,13H INT 10H ;设置320×200,256色图形方式
1. INT 10H 视频程序设计 (2)02H号功能 功能: 设置光标位置 入口参数:BH=显示页号 DH=行号 DL=列号 出口参数:无
1. INT 10H 视频程序设计 (3)06H号功能 功能: 屏幕窗口上卷(文本方式有效)或初始化 功能: 屏幕窗口上卷(文本方式有效)或初始化 入口参数: AL=滚动行数。为0时,整个屏幕为空白 CH=滚动窗口左上角字符所在的行号 CL=滚动窗口左上角字符所在的列号 DH =滚动窗口左下角字符所在的行号 DL=滚动窗口左上角字符所在的行号 BH=滚动后空行区域填充字符属性 出口参数:无
1. INT 10H 视频程序设计 (4)07H号功能(下滚,其余与06H号类似,) (5)09H号功能 功能: 在当前光标位置显示字符及其属性 入口参数: AL=字符代码(ASCⅡ码) BL=字符属性 CX=字符个数 BH=页号 出口参数: 无
【例】每屏80*25字符的彩色文本方式下,在10行20列位置以兰底白字形式显示40个 “$”。 CSEG SEGMENT ASSUME CS:CSEG STAT: MOV AH,0 ; 置显示方式 MOV AL,3 ; 80*25彩色文本方式 INT 10H MOV AH,2 ; 置光标位置 MOV DH,10 ;光标行号 MOV DL,20 ;光标列号 MOV BH,0 ;光标页号 MOV AH,09H ;显示字符及其属性 MOV AL,'$' ;字符 MOV BL,9FH ;兰底白字 MOV CX,40 ;字符个数 MOV BH,0 ;页号 INT 10H MOV AH,4CH INT 21H CSEG ENDS END STAT
在屏幕10行20~24列处显示五朵梅花,颜色各异 DATA SEGMENT ATRI DB 6EH,52H,94H,52H,6EH DATA ENDS STACK SEGMENT PARA STACK 'STACK' DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AH,0 ;设置80×25彩色文本方式 MOV AL,3 INT 10H LEA SI,ATRI;属性字节值表首址存SI MOV DI,5 ;显示5个字符 MOV DX,0A13H ;显示位置
LP:MOV AH,2;置光标位置 INC DL INT 10H MOV AL,5 ;显示梅花形字符 MOV BL,[SI] MOV CX,1 MOV AH,9 INC SI;指向下一属性字节 DEC DI;判显示完否 JNZ LP;未完转LP再显示 MOV AH,4CH;完,返回DOS INT 21H CODE ENDS END START
采用直接对显示卡的寄存器和显示缓冲区编程的方法,在VGA图形模式13H(即320×200,256色)下作图,画一条彩色的线。
DATA SEGMENT SCR_LINE DW 0 SCR_COL DW 0 CUR_COLOR db 0h DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR STAR: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV AH,0 MOV AL,13H INT 10H ;设置为模式13H
AGAIN: MOV BL,CUR_COLOR MOV DX,SCR_COL ;DX为像素点的y坐标 MOV CX,SCR_LINE ;CX为像素点的x坐标 CALL DRAW_POINT ;在(x,y)处画点 INC SCR_LINE ;指向下一行 INC SCR_COL ;指向右边的下一个点 INC CUR_COLOR ;指向下一种颜色 CMP SCR_LINE,100 ;100列做完了吗? JE ENDLINE ;做完了,结束 JMP AGAIN ;没做完则重复 ENDLINE: RET MAIN ENDP ;画线原理首先整个屏幕是320*200 256色的,ES=0A000H的附加段中放的是显示缓冲区的内容,并设置为显性结构 ;GET_ADDR子程序计算偏移地址,DI=y×320+x;然后将要显示的,显卡的端口3CDH,OUT DX,AL ;设显示缓冲区为线性内存结构
DRAW_POINT PROC NEAR PUSH ES CALL GET_ADDR ;计算偏移量,存在DI中 MOV DX,0A000H ;显示缓冲区首址的段地址 MOV ES,DX MOV DX,3CDH MOV AL,01000000B OUT DX,AL ;设显示缓冲区为线性内存结构 MOV ES:[DI],BL ;往显示缓冲区写数据 POP ES RET DRAW_POINT ENDP
GET_ADDR PROC NEAR PUSH AX PUSH DX MOV AX,320 ;每行320个点 MUL CX ;乘以行号即y×320 POP DX ADD AX,DX ;即计算地址偏移量为y×320+x MOV DI,AX ;偏移量送DI POP AX RET GET_ADDR ENDP CODE ENDS END STAR
一个简单画图程序 code segment assume cs:code start: mov ax,0012h ;置屏幕方式为vga 640*480模式 int 10h mov cx,300 ;横坐标 mov dx,240 ;纵坐标 write: mov al,0ah ;设置颜色 mov ah,0ch ;设置画点 int 10h mov ah,0 ;读键值 int 16h cmp al,1bh ;是否为esc键 jz exit ;是esc键则退出、 cmp ah, 48h ;是否为向上的方向键 jnz nup dec dx ;纵坐标减一 jmp write
nup: cmp ah,50h ;是否为向下的方向键 jnz ndown inc dx jmp write ndown: cmp ah,4dh ;是否是向下的方向键 jnz nringht inc cx nringht:cmp ah,4bh ;是否为向左的方向键 jnz write dec cx exit: mov ax,0002h ;恢复屏幕为字符方式 int 10h mov ah,4ch int 21h code ends end start
彩条显示程序
program segment assume cs:program start:main proc far mov ah, 00h ;调用INT 10H 的功能号 mov al, 10h ;选择显示方式10h(16色图形) int 10h ;调用INT 10H中断 mov bh, 0 ;显存的第0页 mov cx, 0 ;起始列号为0列 mov dx, 0 ;起始行号为0行 mov si, 0 ;设置彩条的宽度 follow: mov bl,0 color: inc bl ;设置彩条的颜色 mov si,0 cmp bl,7 ;设置彩条的颜色种类 je follow
;是否达到列的最大值 cmp dx, 350 jne line mov ax,4c00h int 21h main endp program ends end start line: mov ah, 0ch ;写像素点 mov al, bl ;像素的颜色 int 10h ;------写像素----------------------- inc cx ;是否达到一行最大值 cmp cx, 650 jne line mov cx, 0 ;起始列号为0列 inc si cmp si,5 je color inc dx
颜色显示时间
俄罗斯方块程序
汉诺塔演示程序