第九章 BIOS和DOS中断 在存储器系统中,从地址0FE000H开始的8K ROM(只读存储器)中装有BIOS(Basic Iuput /output System)例行程序。驻留在ROM中的BIOS给PC系列的不同微处理器提供了兼容的系统加电自检,引导装入,主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大方便,程序员不必了解硬件操作的具体细节,直接用指令设置参数,然后中断调用BIOS中的子功能,所以利用BIOS功能编写的程序简洁,可读性好,而且易于移植。
DOS(Disk Operating System)是PC机上最重要的操作系统,它是由软盘或硬盘提供的。它的两个DOS模块IBMBIO DOS(Disk Operating System)是PC机上最重要的操作系统,它是由软盘或硬盘提供的。它的两个DOS模块IBMBIO.COM和IBMDOS.COM使BIOS用起来更方便,因为DOS模块提供了更多更必要的测试,使DOS操作比使用相应功能的BIOS操作更简易,而且DOS对硬件的依赖性更少些。
§9.1键盘I/O 键盘是计算机最基本的一种输入设备,用来输入信息,以达到人机对话的目的。键盘主要由三种基本类型的键组成: 1、字符数字键,如字母A(a)到Z(z),数字0到9以及%、$,# 等常用字符。 2、扩展功能键,如Home,End,Backspace,Arrows,Return,Delete,Insert,PgUp,pgDn 以及程序功能键F1~F10等。 3、和其它键组合使用的控制键,如Alt,Ctrl和Shift等。
§9.1键盘I/O 键盘和主机通过五芯电缆相连,这五根线分别是电源线、地线、复位线以及键盘数据线和键盘时钟线。PC机系列的键盘触点电路按16行×8列的矩阵来排列,用单片机Intel 8048来控制对键盘的扫描。按键的识别采用行列扫描法,即根据对行线和列线的扫描结果来确定闭合键的位置,并通过键盘数据线将闭合键所对应的扫描码(8位)送往主机。
§9.1键盘I/O 字符码与扫描码 当我们在键盘上"按下"或"放开"一个键时,如果键盘中断是允许的(21H端口第1位=0),就会产生一个类型9的中断,并转入到BIOS的键盘中断处理程序。该处理程序从8255可编程序外围接口芯片的输入端口60H读取一个字节,这个字节的低7位是键的扫描码。最高位为0或为1,分别表示键是"按下"状态还是"放开"状态。按下时,取得的字节称为通码,放开时取得的字节称为断码。如按下Esc键时产生一个通码为01H(0000001B),放开Esc键时产生一个断码为81H(10000001B)。
§9.1键盘I/O BIOS键盘中断
§9.1键盘I/O
§9.1键盘I/O 例9.1 读取键盘状态字节,并以十六进制显示出各位的状态。 AGAIN: MOV AH,02H INT 16H MOV BX,AX CALL BINIHEX MOV DL,0DH MOV AH,02H INT 21H JMP AGAIN
§9.1键盘I/O DOS键盘功能调用 上面介绍了BIOS键盘中断(16H),它能同时回送字符码和扫描码,这在使用功能键和变换键的程序中是很重要的。但对一般的键盘操作,我们最好使用适应能力更强的INT 21H中断提供的键盘功能调用。在编写程序时,你会感到使用DOS 21H键盘功能调用非常方便。
§9.1键盘I/O
§9.1键盘I/O 单字符输入 例9.2 GET_KEY: MOV AH, 1 INT 21H CMP AL,'Y' JE YES CMP AL,'N' JE NO JNE GET_KEY
§9.1键盘I/O 例9.4 MOV AH, 7 INT 21H CMP AL, 0 JE GET_EC JMP ERROR GET_EC: MOV AH, 7 INT 21H CMP AL, 3BH JE OPTION1 CMP AL, 3CH JE OPTION2 CMP AL, 3DH JE OPTION3 JMP ERROR
§9.1键盘I/O 输入字符串 中断21H的功能A能从键盘读入一串字符并把它存入用户定义的缓冲区中 缓冲区的第一个字节保存最大字符数 缓冲区的第二个字节是实际输入字符的个数
§9.1键盘I/O 例如,在数据区定义的字符缓冲区如下: MAXLEN DB 32 ACTLEN DB ? STRING DB 32 DUP(?) 输入字符串的指令如下: LEA DX, MAXLEN MOV AH, 0AH INT 21H
§9.1键盘I/O By brooks too broad for leaping↙
§9.1键盘I/O .model small .stack .data User_string db 50,0,50 dup (?) .code Read_keys proc far mov ax,@data mov ds,ax Lea dx,user_string Mov ah,0ah Int 21h Sub ch,ch Mov cl,user_string+1 add dx,2 Exit: mov ax,4c00h int 21h Read_keys endp end read_keys
§9.1键盘I/O 清除键盘缓冲区 从键盘输入的字符实际上先放在一个16字节的键盘缓冲区内,功能1,7,8和0AH实际上是从键盘缓冲区取得字符。 功能0CH的用法如下: MOV AH, 0CH MOV AL, 08H INT 21H
§9.1键盘I/O 检验键盘状态 例9.6 SOUNDER: ┆ MOV AH , 0BH INT 21H INC AL JNZ SOUNDER RET
§9.2显示器I/O 显示字符
§9.2显示器I/O 文本方式设置 INT 10h AH=0 设置显示方式 AL=00 40×25 黑白文本,16级灰度
§9.2显示器I/O 单色字符显示
§9.2显示器I/O
§9.2显示器I/O 彩色字符显示
§9.2显示器I/O
§9.2显示器I/O 显示存储器 显存地址B800:0000 假设显存16KB,可保存4屏幕(页)数据 B800:0000,B800:1000,B800:2000,B800:3000 屏幕上某一字符位置在显存中的偏移地址: Char_offset=Page_offset+((row×width)+column)×byte
§9.2显示器I/O
§9.2显示器I/O 例9.7 计算屏幕上某一字符位置所对应的显存地址 Video_addr MACRO width,page_num ;input :DH= row, DL= column ;output:DI = Char_offset push ax mov al,width mul dh xor dh,dh add ax,dx shl ax,1 add ax,page_num * 1000h mov di,ax pop ax ENDM
§9.2显示器I/O BIOS中断
§9.2显示器I/O 控制光标大小、位置 例9.8 置光标开始行为5,结束行为7,并把它设置到第5行第6列。 MOV CH,5 ;光标开始行 MOV CL,7 ;光标结束行 MOV AH,1 ;显现光标 INT 10H ;BIOS调用 MOV DH,4 ;5行 MOV DL,5 ;6列 MOV BH,0 ;0页 MOV AH,2 ;设置光标位置 INT 10H ;BIOS 调用
§9.2显示器I/O 读光标位置 例9.9 读0页的当前光标位置。 MOV AH,3 ;读光标位置 MOV BH,0 ;0页 INT 10H ;BIOS 调用 选择显示页 例9.10 选择显示页 MOV AL,vpage ;AL = 显示页号 MOV AH,5 ;功能号 INT 10H ;BIOS调用
§9.2显示器I/O 清屏和卷屏 ;clear screen mov ah, 6 ;to scroll up screen mov al, 0 ;blank screen mov bh, 7 ;blank line mov ch, 0 ;upper left row mov cl, 0 ;upper left column mov dh, 24 ;lower right row mov dl, 79 ;lower right column int 10h ;call video BIOS
§9.2显示器I/O 例9.12 清除左上角为(0,0),右下角为(24,39)的窗口,初始化为反相显示,该窗口相当于全屏幕的左半部分。 MOV AH,7 ;下卷功能 MOV AL,0 ;清屏 MOV BH,70H ;反相显示属性 MOV CH,0 ;左上行 MOV CL,0 ;左上列 MOV DH,24 ;右下行 MOV DL,39 ;右下列 INT 10H ;BIOS显示调用 例9.13见书P331
§9.2显示器I/O 字符显示 功能09H BH 显示页 AL 显示字符 BL 属性 CX 字符重复的次数 功能0AH
§9.2显示器I/O 例9.14 置光标到0显示页的(20,25)位置,并以正常属性显示一个星号'*'。 MOV AH,2 ;置光标位置 MOV BH,0 ;0页 MOV DH,20 ;20行 MOV DL,25 ;25列 INT 10H ;BIOS调用 MOV AH,9 ;写字符 MOV AL,'*' ;字符'*' MOV BH,0 ;0页 MOV BL,7 ;正常属性 MOV CX,1 ;字符重复次数 INT 10H ;BIOS调用
§9.2显示器I/O 例9.15 在0显示页的(11,0)位置读取字符和属性。 MOV AH,2 ;置光标位置 MOV BH,0 ;0页 MOV DH,11 ;11行 MOV DL,0 ;0列 INT 10H ;BIOS调用 MOV AH,8 ;读字符和属性 MOV BH,0 ;0页 INT 10H ;BIOS调用
§9.2显示器I/O 彩色和字符串显示
§9.2显示器I/O 例9.16 在品红背景下,显示5个浅绿色闪烁的星号。 例9.16 在品红背景下,显示5个浅绿色闪烁的星号。 MOV AH,09 ;显示字符和属性功能 MOV AL,'*' ;显示字符 MOV BH,0 ;0页 MOV BL,0DAH ;彩色属性 MOV CX,05 ;字符显示次数 INT 10H ;BIOS调用
§9.2显示器I/O 13H 共有4种工作方式,AL=0,1要指定整个显示字符串的属性,AL=2,3要指定每个字符的属性 例9.17,例9.18
§9.2显示器I/O DOS显示功能调用
§9.4串行通信口I/O 并行 串行 异步方式 一次传送一个数据块 同步方式 一次传送一个字节
§9.4串行通信口I/O 波特率 比特率
§9.4串行通信口I/O 串口功能调用 AH 功能 调用参数 返回参数 3 从串行通信口读一个字符 AL=输入的8位数据 4 DOS串口通信口功能 AH 功能 调用参数 返回参数 3 从串行通信口读一个字符 AL=输入的8位数据 4 向串行通信口写一个字符 DL=输出的8位数据
§9.4串行通信口I/O 例9.24 从串行通信口输入一字符并存入INPUT_CHAR单元中。 MOV AH, 3 ; 从串行通信口读字符 INT 21H ; DOS调用 MOV INPUT_CHAR, AL ; 输入字符在AL中 . . INPUT_CHAR DB 0
§9.4串行通信口I/O 例9.25 将字符串HELLO输出到串行通信口。 MOV BX, SEG BUFFER ; DS: BX = 串地址 MOV DS, BX MOV BX, OFFSET BUFFER MOV CX, BUF_LEN ; CX = 串长度 NEXT: MOV DL, [BX] ; 取字符 MOV AH, 4 ; 通信口输出 INT 21H ; DOS调用 INC BX ; 指针加1 LOOP NEXT . . BUFFER DB 'HELLO' BUF_LEN EQU $-BUFFER
§9.4串行通信口I/O 串口功能调用 BIOS串行口通信功能(INT 14h)
§9.4串行通信口I/O
§9.4串行通信口I/O