汇编语言程序设计

Download Report

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