Transcript 汇编语言程序设计
汇编语言程序设计 主讲:陶雪丽 E-mail:[email protected] 单位:河南师范大学计算机与信息技术学院 教学重点 有了前面输入输出程序设 计的基础,本章来了解 BIOS中断和DOS中断。熟 悉: BIOS键盘I/O DOS键盘功能调用 BIOS显示I/O DOS显示功能调用 第9章 BIOS和DOS中断 9.1 键盘I/O 9.2 显示器I/O 9.3 打印机I/O 9.4 串行通信口I/O 目 录 前一页 后一页 退出 BIOS和DOS 基本输入输出系统(basic input/output system , BIOS)例 行程序,驻留在系统的从地址0FE000H开始的8KB的只读 存储器中。 BIOS给PC系列的不同微处理器提供了兼容的系统加电自 检、引导装入、主要I/O设备的处理程序以及接口控制等 功能模块来处理所有的系统中断。 使用DOS操作比使用BIOS操作更简易,而且DOS对硬件 的依赖性更少些。 有些情况既能选择DOS中断也能选择BIOS中断。如字符 输入输出等。 但有些功能DOS没有提供,这时只能考虑用I/O指令在端 口级上编程。如声音控制等。 目 退出 前一页 后一页 录 DOS和BIOS功能调用的步骤 目 录 将调用参数装入指定的寄存器中; 如需功能号,把它装入AH; 如需子功能号,把它装入AL; 按中断号调用DOS或BIOS中断; 检查返回参数是否正确。 前一页 后一页 退出 9.1 键盘I/O 9.1.1 字符码与扫描码 9.1.2 BIOS键盘中断 9.1.3 DOS键盘功能调用 目 录 前一页 后一页 退出 键盘的基本键 键盘的主要三种基本类型键: 字符数字键。如A(a)~Z(z),数字0~9以及%,$,#等 常用字符。 扩展功能键。如Home,End,Backspace,Delete的等。 和其他键组合使用的控制键。如Alt,Ctrl和Shift等。 字符数字键给计算机传送一个ASCII码字符; 扩展功能键产生一个动作; 组合控制键能改变其他键所产生的字符码。 目 录 前一页 后一页 退出 9.1.1 字符码和扫描码 当在键盘上“按下”或“放开”一个键时,如果键盘中断 是允许的(21H端口的D1=0),就会产生一个类型号为9 的中断,并转入到BIOS的键盘中断处理程序。 该处理程序从8255可编程外围接口芯片的输入端口60H读 取一个字节,这个字节的低7位是键的扫描码。而最高位 为0或为1,分别表示键的“按下”和“放开”状态。 按下时,取得的字节称为通码;放开时取得的字符称为断 码。 键盘上每个键都对应一个扫描码。根据扫描码能惟一地确 定哪一个键改变了状态。 P317的表9.3给出了键盘上每个键对应的扫描码。 目 退出 前一页 后一页 录 BIOS键盘中断处理程序 BIOS键盘中断处理程序将取得到扫描码转换成相应的字 符码,大部分键的字符码是一个标准的ASCII码。 转换成的字符码以及扫描码存储在ROM BIOS数据区的键 盘缓冲区KB_BUFFER中。 0040:001A BUFF_HEAD DW ? ;键盘缓冲区的首地址 0040:001C BUFF_TAIL DW ? ;键盘缓冲区的末地址 0040:001E KB_BUFFER DW 16DUP(?) ;16个输入量的空间 0040:003D KB_BUFFER_END LABEL WORD 这个缓冲区是一个先进先出的循环队列,当首尾指针相等 时,缓冲区为空。CPU要得到键盘输入时,调用BIOS键 盘例行程序,按其接收时的次序从缓冲区取出字符和扫描 码,回送CPU。 目 退出 前一页 后一页 录 9.1.2 BIOS键盘中断 表9.4 BIOS键盘中断(INT 16H) 单个字符输入 AH=0 例9.1 读取键盘状态字节 目 录 前一页 后一页 退出 9.1.3 DOS键盘功能调用 表9.5 DOS键盘操作(INT 21H) 例9.2 单个字符输入 AH=1 单个字符输入 AH=7 例9.3 、例9.4 输入字符串 例9.5 清除键盘缓冲区 目 录 前一页 检验键盘状态 例9.6 后一页 退出 9.2 显示器I/O 9.2.1 字符属性 9.2.2 BIOS显示中断 9.2.3 DOS显示调用 目 录 前一页 后一页 退出 图9.4 显示屏幕上的字符位置 目 录 前一页 后一页 退出 9.2.1 字符属性 单色字符显示 彩色字符显示 显示存储器 目 录 前一页 后一页 退出 1.单色字符显示 目 录 对单色字符显示,字符的属性定义了字符的显示特性。 属性可以有不同的组合。 属性值可以任意组合。表9.6是一些单色显示的属性。 屏幕上的字符可以按相同的属性显示,也可以按不同的属 性显示,如果设置的属性为00H,字符就显示不出来。 前一页 后一页 退出 图9.5 单色显示的属性字节 目 录 前一页 后一页 退出 表9.6 单色显示的属性 目 录 前一页 后一页 退出 2. 彩色字符显示 在显示彩色文本时,属性字节能够选择前景(显示的字符) 和背景的颜色。 每个字符可以选择16种颜色中的一种,背景有8种颜色可 以选择。 图9.6是16色文本方式显示的属性字节。 表9.7列出了16色字符方式颜色的组合。 目 录 前一页 后一页 退出 图9.6 16色方式下的属性字节 目 录 前一页 后一页 退出 表9.7 16种颜色的组合 目 录 前一页 后一页 退出 3. 显示存储器 对于所有的显示适配器,文本方式下显示字符的原理都是 一样的,所不同的是各种适配器的视频显示存储器(又称 显存)的起始地址不同: DMA,显存的起始地址为B000:0000; CGA/EGA/VGA,是B800:0000. 每个字符的ASCII码和属性码字节存放于连续的两个字节 中。 图9.7表明了显示存储单元与屏幕上字符的对应关系。 目 录 前一页 后一页 退出 显示存储单元与屏幕上字符的对应 关系 在25×80的文本显示方式下,屏幕可有2000个字符位置, 因每个字符需要用两个字节来表示,所以显存容量需要 4KB。如果显存有16KB,则可保存4屏幕的字符数据,通 常称为4页数据。 表示一个字符所用的字节数, CGA/EGA/VGA的80列显示方式,0页在显存中的起始地 在字符显示方式下,byte=2。 址是B800:0000,1页是B800:1000,2页是B800:0000,3页 是B800:3000。 相对于屏幕左上角位置(0,0) 屏幕上某一字符位置在显存中的偏移地址可由下列公式算 的行列坐标。 出: Char_offset=Page_offset+((row×width)+column)×byte 目 录 前一页 后一页 退出 9.2.2 BIOS显示中断 表9.8 类型10H的显示操作 例9.8 控制光标 例9.9 读光标位置 例9.10 选择显示页 清屏和卷屏 例9.11、例9.12、例9.13 字符显示 例9.14、例9.15 彩色和字符串显示 例9.16、例9.17、例9.18 目 录 前一页 后一页 退出 9.2.3 DOS显示调用 表9.10 INT 21H显示操作 显示字符串 使用赋值伪操作 显示字符串的宏定义 目 录 前一页 后一页 例9.19 退出 表9.4 BIOS键盘中断(INT16H) 单个字符输入AH=0 MOV AH , 0 INT 16H MOV BX , AX CALL BINIHEX ;二进制转换成十六进制 图9.2 键盘状态字节 例9.1 读取键盘状态字节,并以十六进制打印出来 AGAIN: MOV AH , 02H INT 16H MOV BX , AX CALL BINIHEX MOV DL , 0DH MOV AH , 02H INT 21H JMP AGAIN 表9.5 DOS键盘操作(INT 21H) 例9.2单个字符输入AH=1 接收键盘输入并对其进行测试 GET_KEY: MOV INT CMP JE CMP JE JNE AH , 1 21H AL , ‘Y’ YES AL , ‘N’ NO GET_KEY 例9.3 单个字符输入AH=7 检测键盘输入的字符是否时回车键 WAIT_HERE: MOV AH , 7 INT 21H CMP AL , 0DH JNE WAIT_HERE 检测键盘输入的功能键。 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.4单个字符输入AH=7 ;F1? ;F2? ;F3? .model small 例9.5输入字符串程序 .stack .data user_sting db 50 , 0 , 50 dup(?) .code .startup lea dx , user_string mov ah , 0ah int 21h .exit 0 end 清除键盘缓冲区 INT 21H的功能0CH能清除键盘缓冲区,然后执行在AL 中指定的功能。AL指定的功能可以是1,6,7,8或0AH。 使用0CH功能可以使程序在输入一个字符之前,将以前输 入的字符清除掉。 使用0CH功能的好处是可以避免由于偶然超前键入的字符 而出现的错误。 例如: MOV AH , 0CH MOV AL , 08H INT 21H 例9.6检验键盘状态 该功能并不返回实际字符码,仅提供一种是否按键的提示。 ;在未按键之前,程序总是不断循环执行,只要按下一个键, 程序就退出循环并返回。 SOUNDER: … … MOV AH , 0BH INT 21H INC AL JNZ SOUNDER RET 图9.7 显示存储单元与显 示屏幕上字符对应关系 例9.7 计算屏幕上某一字符位置所对应的显存地址。 Video_addr MACRO width , page_num ;入口参数:DH=row , DL=column ;出口参数: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.7 表9.8 类型10H的显示操作 表9.8 类型10H的显示操作 ;置光标开始行为5,结束行为7, ;并把它设置到第5行第6列。 MOV CH , 5 ;置光标类型 MOV CL , 7 MOV AH , 1 INT 10H MOV MOV MOV MOV INT DH , 4 DL , 5 BH , 0 AH , 2 10H ;置关标位置 例9.8 控制光标 例9.9 读光标位置 读0页的当前光标位置 MOV AH , 3 MOV BH , 0 INT 10H 例9.10 选择显示页 INT 10H的功能5可由程序确定显存中的显示区域。ROM BIOS将CGA的显存分为4页,每页25×80个字符,或分为 8页,每页25×40个字符。每一页的起始地址在1KB的边 界。这四页的起始地址分别为B800:0000 , B800:1000 , B800:2000 , B800:3000。 MOV AL , vpage ;AL=页号 MOV AH , 5 INT 10H 清除全屏幕的子程序 clear_screen proc near push ax push bx push cx push dx ;clear screen mov ah , 6 mov al , 0 mov bh , 7 mov ch , 0 mov cl , 0 mov dh , 24 例9.11-1/2 mov int dl , 79 10h mov mov int ;restore registers pop pop pop pop clear_screen dx , 0 ah , 2 10h ;locate cursor dx cx bx ax endp 例9.11-2/2 例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 在屏幕中心的小窗口显示字符。 .model small .stack .data Esc_key equ 1bh win_ulc equ 30 win_ulr equ 8 win_lrc equ 50 win_lrr equ 16 win_width equ 20 .code include cls.inc 例9.13-1/3 ;clear the screen .startup call clear_screen locate: mov ah , 2 mov dh , win_lrr mov dl , win_ulc mov bh , 0 int 10h mov cx , win_width get_char: mov ah , 1 int 21h cmp al , Esc_key jz exit loop get_char 例9.13-2/3 例9.13-3/3 ;scroll up mov mov mov mov mov mov mov int jmp .exit end ah , 6 al , 1 ch , win_ulr cl , win_ulc dh , win_lrr dl , win_lrc bh , 7 10h locate 0 置光标到0显示页的(20,25)位置, 并以正常属性显示一个星号‘*’。 MOV AH , 2 MOV BH , 0 MOV DH , 20 MOV DL , 25 INT 10H MOV AH , 9 MOV AH , ‘*’ MOV BH , 0 MOV BL , 7 MOV CX , 1 INT 10H 例9.14字符显示 例9.15 在0页显示页的(11,0)位置读取字符和属性 MOV AH , 2 MOV BH , 0 MOV DH , 11 MOV DL , 0 INT 10H MOV AH , 8 MOV BH , 0 INT 10H 彩色和字符串显示 例9.16 BL中设置的为前景和背景的属性值,属性值的典型组合 如表9.9。 ;在品红背景下,显示5个浅绿色闪烁的星号。 MOV AH , 09 MOV AL , ’*’ MOV BH , 0 MOV BL , 0DAH MOV CX , 05 INT 10H 表9.9 属性字节的典型组合 在屏幕上以红底蓝字显示字符串: “WORLD SCENERY” STRING DB ‘WORLD SCENERY’ LEN_STR EQU $-STRING … MOV AL , 3 MOV AH , 0 INT 10H MOV BP , SEG STRING MOV ES , BP MOV BP , OFFSET STRING MOV CX , LEN_STR MOV DX , 0 MOV BL , 41H MOV AL , 0 MOV AH , 13H INT 10H 例9.17 例9.18-1/2 在屏幕上以红底蓝字显示“WORLD”,然后分别以红底 绿字和红底蓝字相间地显示“SCENERY”。 STRING1 DB ‘WORLD’ STRING2 DB ‘$’ , 42H , ‘C’ , 41H , ‘E’, 42H , ‘N’ , 41H DB ‘E’ , 42H , ‘R’ , 41H , ‘Y’ , 42H LEN_STR2 EQU $-STRING2 … MOV AL , 3 MOV AH , 0 INT 10H MOV BP , SEG STRING1 MOV ES , BP MOV MOV MOV MOV MOV MOV INT MOV INT MOV MOV MOV MOV INT BP , OFFSET STRING1 例9.18-2/2 CX , STRING2-STRING1 DX , 0 BL , 41H AL , 1 AH , 13H 10H AH , 3 10H BP , OFFSET STRING2 CX , LEN_STR2 AL , 3 AH , 13H 10H 表9.10 INT 21H显示操作 显示字符串1 MESSAGE … MOV MOV MOV MOV INT DB ‘The sort operation is finished.’, 13 , 10 , ‘$’ AH , 9 DX , SEG MESSAGE DS , DX DX , OFFSET MESSAGE 21H 显示字符串2 使用赋值伪操作可以使程序的可读性更好。 也可以根据显示格式的要求使用TAB符,它的ASCII码位 为09。 CR EQU 13 ;CR EQU 0DH LF EQU 10 ;LF EQU 0AH TAB EQU 09 MESSAGE DB TAB, ‘The sort operation is finished.’ DB CR , LF ,’$’ 例9.19显示字符串的宏定义文件 print macro str_addr push dx push ax ;print the string mov dx , offset mov ah ,09h int 21h ;restore register pop ax pop dx endm str_addr