1
第五节 BIOS和 DOS中断功能调用
(教材旧 P238、新 P239)
一,概述
1,BIOS和 DOS中断子程层次特点
2,中断类型分类
3,调用方法二,BIOS功能调用
1,设置显示方式 ( 10H类型,00H功能 )
2,置光标位置 ( 10H类型,02H功能 )
3,清屏,清窗口 ( 10H类型,06H或 07H功能 )
三,DOS系统功能调用 ( 21H类型中断调用 )
1,显示单字符 ( 02H功能 )
2,显示字符串 ( 09H功能 )
3,单字符输入 ( 01H,07H,08H功能 )
4,字符串输入 ( 0AH功能 )
5,检测键盘状态 ( 0BH功能 )
6,保存中断向量 ( 35H功能 ) (第六章介绍 )
7,设置中断向量 ( 25H功能 )
2
复习内容,P239~P247
预内容习,P 110~P140
作业,
1,预习实验二其中,任务 1、( 2)( 4),2必做,
任务 1、( 1)( 3)选做,
2,选择其中之一大作业
( 1),实验四 任务 1,作为家庭作业,在计算机上调通,
经过教师检查 签字
( 2)、阅读教课书中 P125 ~ P132 ( 3.8.1 ~ 3.8.4节 )
的程序并写出总结。
3
3.编写完整汇编语言程序,要求上机调试出来:
( 1)清屏,在 10行 5列上显示? Hello China!”
( 2)将 0AH功能输入的字符串,用 09H功能显示出来。
在 DOS下执行,从键盘输入‘ 123456789’回车,
屏幕上能显示‘ Hello World!’ 吗?为什么?
用在 DEBUG下查看到的 data段的内容来说明。
4.问题回答下面程序,汇编连接后
4
data SEGMENT
data ENDS
code SEGMENT
max DB 11,?,4 DUP(?)
string DB ‘ Hello World! ’,’$’
ASSUME CS:code,DS:data
start,MOV AX,data ; 置缓冲区地址于 DS:DX
MOV DS,AX
LEA DX,max
MOV AH,0AH ; 调用 0AH输入功能
INT 21H
LEA DX,string
MOV AH,09H ; 调用 09H显示功能
INT 21H
MOV AH,4CH
INT 21H ; 返回 DOScode ENDS
END start
5
第 五 节 BIOS和 DOS中断功能调用
(教材旧 P238、新 P239)
一,概述二,BIOS功能调用三,DOS系统功能调用
( 21H类型中断调用 )
6
一,概述
1,BIOS 和 DOS 中断子程层次特点
2,中断类型分类
3,调用方法
7
1,BIOS和 DOS中断子程层次特点用户程序磁盘管理模块 (DOS内核 )
MSDOS.SYS 系统功能基本输入 /输出 BIOS 模 块
IO.SYS 设备驱动
ROM BIOS 基本 I/O
系 统 硬 件装入命令处理模块
COMMAN D.COM
用户命令
DOS系统层次结构
8
层次特点:
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
用户命令
9
MSDOS.SYS中的中断子程
( 称 DOS内核模块 )
调用 IO.SYS,实现对外设的控制 。
与标准外设有两层隔离,
IO.SYS和 ROM BIOS。
其中,
21H类型的中断子程提供了丰富的系统服务,
称 21类型的中断调用为 DOS系统 (功能 )调用 。
用户程序磁盘管理模块 (DOS内核 )
MSDOS.SYS 系统功能基本输入 /输出 BIOS 模 块
IO.SYS 设备驱动
ROM BIOS 基本 I/O
系 统 硬 件装入命令处理模块
COMMAN D.COM
用户命令
10
用户编程原则
① 尽可能使用 DOS的系统功能调用,
提高程序可移植性 。
② 在 DOS功能不能实现情况下,
考虑用 BIOS功能调用 。
③ 在 DOS和 BIOS的中断子程不能解决问题时,
使用 IN/OUT指令直接控制硬件 。
用户程序磁盘管理模块 (DOS内核 )
MSDOS.SYS 系统功能基本输入 /输出 BIOS 模 块
IO.SYS 设备驱动
ROM BIOS 基本 I/O
系 统 硬 件装入命令处理模块
COMMAN D.COM
用户命令
11
2,中断类型分类
向量表中的中断类型分为七类:
① 处理 CPU特殊操作 ( 除 0,溢出 )的 00H,04H类型 。
② 为 DEBUG调试程序设置 的单步 ( 01H ),断点 ( 03H )类型 。
③ 处理 CPU的 NMI引脚信号 的 02H类型 。
非屏蔽硬中断子程
④ 处理 CPU的 INTR引脚信号 的 08~0FH类型 。
可屏蔽类型硬中断子程
⑤ 用 INT指令调用的中断子程
BIOS功能调用 ( 如 10~1AH)
DOS功能调用 ( 如 21H)
NMI
INTR
8088
12
⑥ 保留类型为 DOS系统保留
(1) 指现在未用到,以后系统可能会用到 。
(2) 已用到,但不向用户公开 。
为用户保留
(1) 被系统子程嵌套调用了的类型 ( 如 1BH,1CH )。
使用户在系统功能基础上扩充功能 。
(2) 系统未占用类型 ( 如 60H~67H )。
⑦ 非中断向量类型对应向量表中的 4个单元存放的不是中断向量 。
( 如 1DH,1EH,1FH,41H,46H,22H)
通常是一些参数表的地址信息,
13
类型号 中断功能名称 模 块 中 断 源
00H 除零错误 BI OS CP U 内部操作
01H 单步执行 BI OS DE BUG 程序
02H 非屏蔽中断 BI OS 非屏蔽硬中断
03H 断点设置 BI OS DE BUG 程序
04H 溢出错误 BI OS CP U 内部操作
05H 屏幕打印 BI OS I NT 指令
06- 07H 保留
08H 定时器中断 BI OS 可屏蔽硬中断
09H 键盘中断 BI OS 可屏蔽硬中断
0A H 保留 BI OS 可屏蔽硬中断
0B H 串行通信中断 BI OS 可屏蔽硬中断
0C H 保留 BI OS 可屏蔽硬中断
0D H 硬盘中断 BI OS 可屏蔽硬中断
0E H 软盘中断 BI OS 可屏蔽硬中断
0F H 打印机中断 BI OS 可屏蔽硬中断
中断向量分配表
14
类型号 中断功能名称 模 块 中 断 源
10H 显示器 I /O BIO S INT 指令
1 1 H 设备配置检测 BIO S INT 指令
12H 内存容量检测 BIO S INT 指令
13H 磁盘 I/ O BIO S INT 指令
14H 串行通信 I /O BIO S INT 指令
15H 盒式磁带 I /O BIO S INT 指令
16H 键盘 I/ O BIO S INT 指令
17H 打印机 I /O BIO S INT 指令
18H RO M BASIC 入口 BIO S INT 指令
19H 系统检测程序 BIO S INT 指令
1AH 日时钟 I /O BIO S INT 指令
1BH 用户 Ctr l- Br eak BIO S INT 指令
1CH 用户定时器 BIO S INT 指令
1DH 显示器参数表 BIO S 非中断向量
1EH 软盘参数表 BIO S 非中断向量
1FH 图形显示字符表 BIO S 非中断向量中断向量分配表 ( 续)
15
类型号 中断功能名称 模 块 中 断 源
20H 程序结束返回系统 DO S INT 指令
21H 系统功能调用 DO S INT 指令
22H 程序结束地址 DO S 非中断向量
23H Ctrl -Br eak 处理 DO S INT 指令
24H 严重错误处理 DO S INT 指令
25H 按扇区读磁盘 DO S INT 指令
26H 按扇区写磁盘 DO S INT 指令
27H 程序结束驻留内存 DO S INT 指令
28 - 3FH 保留
40H 软盘 I/ O BIOS INT 指令
41,46H 硬盘参数表 1,2 BIOS 非中断向量
42 - 5FH 保留
60 - 67H 为用户保留 INT 指令
68 - 7FH 保留
80 - F0H BA SIC 使用 BIOS INT 指令
F1 - FFH 保留中断向量分配表 ( 续)
16
3,调用方法设置入口参数在 AH设置功能号 m
执行中断指令 INT N
分析、应用出口参数
17
例 1 单字符显示功能调用
MOV DL,‘A’ ;设置入口参数
MOV AH,02H ;设置功能号
INT 21H ;执行中断调用例 2 单字符输入功能调用
MOV AH,01H ;设置功能号
INT 21H ;执行中断调用
CMP AL,0DH ;分析,应用出口参数
JZ exit
、、、
18
二,BIOS功能调用
基本输入 /输出模块 BIOS:
实现对输入 /输出设备的控制,
内含 0– 1CH 等类型中断子程,
包括显示器,磁盘,键盘,打印机等标准外设的驱动程序 。
( 参看中断类型分配表 )
BIOS功能调用指对 BIOS模块中的中断子程的调用 。
19
有关显示器
① 显示器通过显卡 (显示适配器 )连接到计算机上 。
② 单色显示器只能显示黑白两色 。
彩色显示器能显示多种颜色 。
20
③ 屏幕上各象素的显示信息,存放在显示缓冲区(显存)中。
640KB RAM 基本内存
0000:0000
0040:0000
0050:0000
0070:0000
A000:0000
B000:0000
C800:0000
F600:0000
FE00:0000
FE00:1FFF
显示缓存区 ( 显存 )
硬盘驱动器控制 ROM
32KB ROM BASIC
8KB ROM BIOS
IO.SYS模块
COMMAND.COM常驻模块
MSDOS.SYS模块用户程序空间
COMMAND.COM暂驻模块
256KB ROM
DOS工作区
ROM BIOS工作区
128KB RAM 保留区
1KB中断向量表
21
④ 显示器有两种显示方式,
图形方式,
将屏幕划分为 m× n的点阵,在每个点的位置显示象素,
一个点是一个象素 。
文本方式将屏幕划分为若干行和列,在每个网格位置上显示象素,
一个字符是一个象素 。
22
文本方式将屏幕划分为 m列和 n行 (m × n),在每个网格位置上显示象素,
一个字符是一个象素 。
80× 25 文本方式
A
~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
0
列
0 行
79
列
24行
B C
23
~~ ~~
640× 480 图形方式
640 点
480点图形方式,
将屏幕划分为 m× n的点阵,在每个点的位置显示象素,
一个点是一个象素 。
24
在文本方式下,
对应屏幕上的 每个字符,在显示缓冲区中占用两个单元,
一个存放 ASCII码,一个存放显示属性 。
41H
07H
42H
07H
61H
70H
62H
70H
、、、显示缓冲区
( 显存 )
字符 A,黑底白字字符 B,黑底白字字符 a,白底黑字字符 b,白底黑字
25
例 10000111B 或 87H
表示黑底白字,闪烁
01110000B 或 70H
表示白底黑字,不闪烁
16种
0000 黑 1000 灰
0010 绿 1010 浅绿
0100 红 1100 浅红
0111 灰白 1111 白
BL R G B I R G B
闪烁 背景前景
7 6 5 4 3 2 1 0
8种
000 黑
010 绿
100 红
111 白
0 不闪烁
1 闪烁属性字节的含义:
26
据显存大小,可存储若干页的字符象素 。
例 16KB 显存能存储,
80× 25方式,4页 ( 0 ~ 3 ),80× 25× 2× 4 =16000
40× 25方式,8页 ( 0 ~ 7 ),40× 25× 2× 8 =16000
27
1,设置显示方式入口参数 AL = 显示方式值
00 40× 25 黑白文本方式
01 40× 25 彩色文本方式
02 80× 25 黑白文本方式
03 80× 25 彩色文本方式
04 320× 320 彩色图形方式功能号 AH = 00H
类型号 10H
出口参数 无实现功能 将显示方式设置为指定形式例 将显示方式设置为 80× 25 彩色文本方式
MOV AL,03H
MOV AH,00
INT 10H
28
2,清屏,清窗口功能入口参数 AL = 0
CH = 窗口左上角行号
CL =窗口左上角列号
DH = 窗口右下角行号
DL =窗口右下角列号
BH = 窗口属性功能号 AH = 06H 或 AH = 07H
类型号 10H
出口参数 无实现功能 按给定属性清除指定的窗口内容
29
例 清除屏幕显示,将其属性置为反白 ( 白底黑字 ) 显示 。
MOV AL,0 ;清屏功能
MOV BH,70H ;白底黑字
MOV CH,0 ;左上角 行号
MOV CL,0 ;左上角 列号
MOV DH,24 ;右下角 行号
MOV DL,79 ;右下角 列号
MOV AH,6 ;功能号
INT 10H ;中断调用
30
3,置光标位置
光标控制开始显示的位置,
计算机有专门的硬件控制光标的显示大小,位置 。
光标只在文本方式中出现,在图形方式下光标消失 。
~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
0
列
0 行
79列
24 行
5
列1列
1 行
2 行
31
置光标位置入口参数 DH = 行号
DL = 列号
BH = 页号功能号 AH= 02H
类型号 10H
出口参数 无实现功能 将光标设置在指定的位置
32
例 将光标设置在 2行 5列 的位置
MOV DH,2
MOV DL,5
MOV BH,0
MOV AH,2
INT 10H
~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
0列
0 行
79列
24行
5列1
列
1 行
2 行
33
三,DOS系统功能调用 (21H类型中断调用 )
1,显示单字符 ( 02H功能 )
2,显示字符串 ( 09H功能 )
3,单字符输入 ( 01H,07H,08H功能 )
4,字符串输入 ( 0AH功能 )
5,检测键盘状态 ( 0BH功能 )
6,保存中断向量 ( 35H功能 ) (第六章介绍 )
7,设置中断向量 ( 25H功能 )
34
1,显示单字符 ( 02H功能 )
入口参数 DL = 要显示字符的 ASCII 码功能号 AH=02H
类型号 INT 21H
出口参数 无实现功能 显示指定字符,光标随动 。
例 显示字符 A
MOV DL,‘A’
MOV AH,02H
INT 21H
35
例 使光标回到下一行的行首 。
MOV DL,0DH ;显示回车符
MOV AH,02H
INT 21H
MOV DL,0AH ;显示换行符
MOV AH,02H
INT 21H
~~~~ ~~ ~~ ~~ ~~ ~~ ~~
H e l l o
W o r l d
36
2,显示字符串 ( 09H功能 )
入口参数 ① 定义要显示的字符串,
字符串尾应为 ’ $’,作为结束显示的标志 。
② DS,DX = 字符串的首地址功能号 AH = 09 H
类型号 21H
出口参数 无实现功能 显示字符串,遇 ’ $’停止显示,光标随动 。
37
例 编程显示字符串 ’ TsinghuaUniversity’
data SEGMENT ;定义显示的子符串
stri DB ‘Tsinghua University’,‘$’
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
start,MOV AX,data ;置缓冲区地址于 DS:DX
MOV DS,AX
LEA DX,stri
MOV AH,09H ;调显示功能
INT 21H
MOV AH,4CH ;返回 DOS
INT 21H
code ENDS
END start
38
有关键盘
① 键盘通过键盘接口电路与计算机连接 。
② 键盘上的键有三种类型,
字符键 A~Z,0~9等功能键 F1~F12,Page Up等组合控制键 Shift,Ctrl,Alt等
③ 键盘上的每个键都有一个 扫描码 。
◢ ◢ 据扫描码可确定操作的是哪个键,是按下键还是释放键;
◢ ◢ 扫描码用一个字节表示 。
低 7位是扫描码的数字编码,与键盘上的键一一对应;
最高位 D7位表示键的操作状态:
当 按下键时,D7=0 ; 当 释放键时,D7=1
39
⑤ 键盘中断子程功能 ( 09H类型中断子程 )
◢ 从键盘接口读取操作键的扫描码 ;
◢ 将扫描码转换成字符码;
大部分键的字符码为 ASCII码,
无 ASCII码键 ( 如组合键 Shift,Ctrl等 ) 的字符码为 0。
◢ 将键的扫描码,字符码存放在键盘缓冲区,
供其它有关键盘的中断子程应用 。
④ 键盘接口对按下键和释放键均向计算机发出中断申请,
如果 中断响应条件满足,CPU转去执行键盘中断子程。
键盘中断子程类型号为 09H。
40
3,单字符输入 ( 01H,07H,08H功能 )
① 入口参数 无功能号 AH = 01H
类型号 21H
出口参数 AL = 键入字符的 ASCII码实现功能 等待从键盘输入一个字符,
并在屏幕上回显,光标移动,
检测 Ctrl-Break键
41
例 利用键盘输入的字符产生分支:
MOV AH,1 ;等待从键盘输入
INT 21H
CMP AL,‘Y’ ;是 ’ Y’?
JZ yes
CMP AL,‘y’ ;是 ’ y’?
JZ yes
no,.,,
.,,
JMP exit
yes,.,,
.,,
exit,.,,
42
例 在中断向量表中 查找从键盘输入的字符,
并将其个数用二进制形式显示出来 。 ( scanskey.asm)
code SEGMENT ;代码段开始
ASSUME CS:code
begin,MOV AX,0000H ;设置查找首地址
MOV DS,AX
MOV SI,0000H
MOV CX,0400H ;设置查找长度
MOV BX,0 ;计算值初值
MOV AH,01H ;从键盘输入
INT 21H ;输入关键字
MOV DL,AL ;保存在 DL中
next,LODSB ;从串取
CMP AL,DL ;与关键字比较
JNZ point
INC BX ;计算值加 1
point,LOOP next ;查找结束?
CALL display ;调用显示子程
MOV AH,4CH ;调用 4CH功能
INT 21H ;返回 DOS;用二进制显示 BX内容子程
display PROC
MOV CX,16 ;显示位数
rotate,ROL BX,1
MOV DL,BL
AND DL,01H
ADD DL,30H
MOV AH,2H
INT 21H
LOOP rotate
RET ;子程返回
display ENDP
code ENDS ;代码段结束
END begin
43
② 入口参数 无功能号 AH = 07H
类型号 21H
出口参数 AL = 键入字符的 ASCII码实现功能 等待从键盘输入一个字符,
不在屏幕上回显,
不检测 Ctrl-Break键
44
例 用不带回显功能输入密码时:
input,MOV AH,07H ;等待从键盘输入
INT 21H
MOV [DI],AL ;存入缓冲区
CMP AL,0DH ;是回车符?
JNZ input ;不是,继续输入
check:,、、
、、、
45
4,字符串输入 ( 0AH 功能 )
入口参数 DS,DX = 缓冲区的首地址
( DS,DX ) = 限制最多输入的字符数功能号 AH = 0AH
类型号 21H
出口参数 ( DS,DX+1 ) = 实际键入的字符 (不含回车符 )
从 ( DS,DX+2 )开始顺序存放键入的字符串,
回车符 0DH为串尾最后一字符 。
实现功能 等待从键盘输入字符串,并存入设定的缓冲区内,
同时回显字符串,光标随着移动,
回车符使光标回到行首 。
注意事项,应按要求先定义缓冲区,再调用 。
46
例 应用 0AH功能输入字符串。
data SEGMENT ;定义缓冲区
max DB 11 ;定义限制最多输入个数
lenth DB? ;用于存放实际输入个数
stri DB 11 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 ;调 0A输入功能
MOX CH,0
MOV CL,lenth ;取字符串长度放 CX中
LEA BX,stri ;取字符串首址于 BX中
MOV AL,[BX] ;应用输入字符
、、、、、
code ENDS
47
data SEGMENT ;定义缓冲区
max DB 11 ;定义限制最多输入个数
lenth DB? ;用于存放实际输入个数
stri DB 11 DUP(?) ;用于存放输入的字符串
data ENDS
从键盘输入 ‘ ABCD’,回车,内存的存放结果,
0B 04 41 42 43 44 0D 00
max
0 7
00 00 00 00 00 00 00 00
8 0a 0b 0f1 2 3 4 5 6 9 0c 0d 0e
lenth
stri
地址内容
DS:DX
48
如下编程与上例相同,
data SEGMENT
max DB 11 等价于:
DB? max DB 11,?,11 DUP(?)
DB 11 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
MOX CH,0
MOV CL,max+1 ;取字符串长度放 CX中
LEA BX,max+2 ;取字符串首址于 BX中
MOV AL,[BX] ;应用输入字符
、、、
code ENDS
49
data SEGMENT
max DB 11
DB?
DB 11 DUP(?)
data ENDS
从键盘输入 ‘ ABCD’,回车,内存的存放结果,
等价于
max DB 11,?,11 DUP(?)
0B 04 41 42 43 44 0D 00
max
0 7
00 00 00 00 00 00 00 00
8 0a 0b 0f1 2 3 4 5 6 9 0c 0d 0e地址内容
DS:DX
50
0AH功能执行过程,
① 若 (DS:DX)字节单元的值为 0,则不等待从键盘输入,结束调用 。
② 若 (DS:DX) 字节单元的内容 大于 0,则等待从键盘输入,
并把输入键的 ASCII码顺序存放在 DS,DX+2开始的单元,
按回车键表示结束输入 。
当按下键的个数超过 ( DS,DX )中值,发出警告声 ’ 嘟嘟 ’,
不再接收输入的数据,直到输入回车键 。
③ 将实际输入的字符个数 (不包括回车键 )填入 (DS:DX+1),
结束调用 。
DS:DX
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
51
0AH功能注意事项,
◢ 输入的字符均带回显,且光标随字符移动 。
当输入回车符结束时,也 回显回车符 。
表现为功能调用结束后,光标回到了行首 。
◢ 回车符 0DH作为一个输入的字符存放在字符串尾,
但 计数输入个数时,不包括回车键 。
实际最多能输入的字符数 = 限制的最多数 -1
( 回车符占一个 )
◢ 执行完 0AH功能后,DS和 DX的值不变,
DS:DX仍指向缓冲区的首地址 。
◢ 整个缓冲区的大小应为,限制的最多数 +2
max DB 11,?,11 dup (?)
52
例 利用 DEBUG查看 0A功能输入结果 。
data SEGMENT
max DB 11,?,11 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
MOV CH,0
MOV CL,max+1 ;取输入长度到 CX中
MOV AH,4CH ;返回 DOS
INT 21H
code ENDS
END start
53
D:\MASM>DEBUG TEST0a.exe ;装入执行文件
-U ;反汇编程序
129E:0000 B89D12 MOV AX,129D
129E:0003 8ED8 MOV DS,AX
129E:0005 8D160000 LEA DX,[0000]
129E:0009 B40A MOV AH,0A
129E:000B CD21 INT 21
129E:000D B500 MOV CH,00
129E:000F 8A0E0100 MOV CL,[0001]
129E:0013 B44C MOV AH,4C
129E:0015 CD21 INT 21
、、、
-D 129D:0 L10 ;查看程序执行 前 缓冲区内容
129D:0000 0B 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00,...............
-G 000D ;执行程序
Hello ;从键盘输入字符串
Program terminated normally
-D 129D:0 L10 ;查看程序执行 后 缓冲区内容
129D:0000 0B 05 48 65 6C 6C 6F 0D-00 00 00 00 00 00 00 00,.Hello.........
-
54
思考:
1,若将程序改为如下形式,设想程序执行的结果 。
data SEGMENT
max DB 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
MOV AH,4CH ;返回 DOS
INT 21H
code ENDS
END start
55
结果是,不等待输入,结束 0AH功能调用 。
00 00 00 00 00 00 00 00
max
0 7
00 00 00 00 00 00 00 00
8 0a 0b 0f1 2 3 4 5 6 9 0c 0d 0e地址内容
DS:DX
注意,由于 DS:DX限制输入最大字符数为 0,
所以不等待输入,结束 0AH功能调用 。
原因是:
56
2,若将程序改为如下形式,设想程序执行的结果。
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
MOV AH,4CH ;返回 DOS
INT 21H
code ENDS
END start
57
结果是,不等待输入,结束 0AH功能调用 。
00 01 00 00 00 00 00 00
max
0 7
00 00 00 00 00 00 00 00
8 0a 0b 0f1 2 3 4 5 6 9 0c 0d 0e地址内容
DS:DX
注意,0AH功能以 字节类型应用 DS:DX指向的缓冲区 。
并不随缓冲区类型定义的变化而变化 。
原因是:
58
例 编程从键盘输入字符串,给出显示提示 ’ Please input:’
data SEGMENT
stri DB ‘PleaseInput,’,’$’
max DB 11,?,11 DUP(?)
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
start,MOV AX,data ;置缓冲区地址于 DS:DX
MOV DS,AX
LEA DX,stri
MOV AH,09H ;显示提示
INT 21H
LEA DX,max ;等待从键盘输入
MOV AH,0AH
INT 21H
MOV AH,4CH
INT 21H
code ENDS
END start
利用 DOS 功能调用,编写小程序
59
D:\MASM>DEBUG e0a09.exe
-U ;查看程序
129F:0000 B89D12 MOV AX,129D
129F:0003 8ED8 MOV DS,AX
129F:0005 8D160000 LEA DX,[0000]
129F:0009 B409 MOV AH,09
129F:000B CD21 INT 21
129F:000D 8D160F00 LEA DX,[000F]
129F:0011 B40A MOV AH,0A
129F:0013 CD21 INT 21
129F:0015 B44C MOV AH,4C
129F:0017 CD21 INT 21
-D 129D:0 L20 ;执行程序前查看 data段内容
129D:0000 50 6C 65 61 73 65 20 49-6E 70 75 74 20 3A 24 0B Please Input,$.
129D:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00,...............
-G ;执行程序
Please Input,Hello!
Program terminated normally
-D 129 D:0 L20 ;执行程序后查看 data段内容
129D:0000 50 6C 65 61 73 65 20 49-6E 70 75 74 20 3A 24 0B Please Input,$.
129D:0010 06 48 65 6C 6C 6F 21 0D-00 00 00 00 00 00 00 00,Hello!.........
-
60
data段内存情况:
stri
P l e a s e I n p u t,$ 0B
06 H e l l o ! 0D 00 00 00 00 00 00 00 00
max
61
思考,程序中少了一个 ’ $’ 符的后果。
data SEGMENT
stri DB ‘Please Input,’
max DB 11,?,11 DUP(?)
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
start,MOV AX,data ;置缓冲区地址于 DS:DX
MOV DS,AX
LEA DX,stri
MOV AH,09H ;显示提示
INT 21H
LEA DX,max ;等待从键盘输入
MOV AH,0AH
INT 21H
MOV AH,4CH
INT 21H
code ENDS
END start
62
data SEGMENT
stri DB ‘Please Input,’
max DB 11,?,11 DUP(?)
data ENDS
stri
P l e a s e I n p u t,0B 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
max
B8 A8 12 8E D8 8D 16 00 00 B4 09 CD 21 8D 16 0E
start
注意,09H功能只在遇到’ $’符才结束显示 。
63
5,检测键盘状态 ( 0BH功能 )
入口参数 无功能号 AH= 0BH
类型号 21H
出口参数 AL= FFH,表示有键按下 。
AL= 0,表示无键按下 。
实现功能 检测键盘状态 (通过检测键盘缓冲区实现 )
64
例 利用 0B功能实现按键退出循环 。
、、
continue:,、
、、
、、
MOV AH,0BH ;检测键盘缓冲区是否有键按下
INT 21H
CMP AL,0FFH
JNZ continue ;无键按下继续循环
、、
、、
MOV AH,4CH
INT 21H
65
6,保存中断向量 (35H功能 )
入口参数 AL = 要保存向量的中断类型号 N
功能号 AH = 35H
类型号 21H
出口参数 BX = ( 0:N× 4 )
ES = ( 0:N× 4 +2 )
实现功能 将类型号 N的中断向量保存在 ES,BX中
66
方法一,用堆栈保存中断向量
MOV AL,09H ;取中断向量
MOV AH,35H
INT 21H
PUSH ES ;用堆栈保存
PUSH BX
、,、
例 保存 09H类型的中断向量
67
方法二,用变量保存中断向量
save_09cs DW? ;定义变量
save_09ip DW?
、、、
MOV AX,SEG save_09cs
MOV DS,AX
MOV AL,09H ;取中断向量
MOV AH,35H
INT 21H
MOV save_09cs,ES ;用变量保存
MOV save_09ip,BX
68
7,设置中断向量 (25H功能 )
入口参数 AL = 要设置向量的中断类型号 N
DS:DX = 中断子程的入口地址 (中断向量 )
功能号 AH = 25H
类型号 21H
出口参数 无实现功能 将类型 N的中断向量设置在向量表中,即
( 0,N × 4) =类型 N中断子程入口地址的 偏移值
( 0,N × 4+2) =类型 N中断子程入口地址的 段值
69
例 1 设置中断子程 Sound 的中断向量,类型号为 60H
code SEGMENT
ASSUME CS:code
start:,、
MOV AX,SEG sound
MOV DS,AX
MOV DX,Offset sound
MOV AL,60H
MOV AH,25H
INT 21H
、、
INT 60H ;调用 60H中断子程
、、
MOV AH,4CH
INT 21H; 中断子程
sound PROC
、、、
、、、
、、、
IRET
sound ENDP
code ENDS
END start
第五节 BIOS和 DOS中断功能调用
(教材旧 P238、新 P239)
一,概述
1,BIOS和 DOS中断子程层次特点
2,中断类型分类
3,调用方法二,BIOS功能调用
1,设置显示方式 ( 10H类型,00H功能 )
2,置光标位置 ( 10H类型,02H功能 )
3,清屏,清窗口 ( 10H类型,06H或 07H功能 )
三,DOS系统功能调用 ( 21H类型中断调用 )
1,显示单字符 ( 02H功能 )
2,显示字符串 ( 09H功能 )
3,单字符输入 ( 01H,07H,08H功能 )
4,字符串输入 ( 0AH功能 )
5,检测键盘状态 ( 0BH功能 )
6,保存中断向量 ( 35H功能 ) (第六章介绍 )
7,设置中断向量 ( 25H功能 )
2
复习内容,P239~P247
预内容习,P 110~P140
作业,
1,预习实验二其中,任务 1、( 2)( 4),2必做,
任务 1、( 1)( 3)选做,
2,选择其中之一大作业
( 1),实验四 任务 1,作为家庭作业,在计算机上调通,
经过教师检查 签字
( 2)、阅读教课书中 P125 ~ P132 ( 3.8.1 ~ 3.8.4节 )
的程序并写出总结。
3
3.编写完整汇编语言程序,要求上机调试出来:
( 1)清屏,在 10行 5列上显示? Hello China!”
( 2)将 0AH功能输入的字符串,用 09H功能显示出来。
在 DOS下执行,从键盘输入‘ 123456789’回车,
屏幕上能显示‘ Hello World!’ 吗?为什么?
用在 DEBUG下查看到的 data段的内容来说明。
4.问题回答下面程序,汇编连接后
4
data SEGMENT
data ENDS
code SEGMENT
max DB 11,?,4 DUP(?)
string DB ‘ Hello World! ’,’$’
ASSUME CS:code,DS:data
start,MOV AX,data ; 置缓冲区地址于 DS:DX
MOV DS,AX
LEA DX,max
MOV AH,0AH ; 调用 0AH输入功能
INT 21H
LEA DX,string
MOV AH,09H ; 调用 09H显示功能
INT 21H
MOV AH,4CH
INT 21H ; 返回 DOScode ENDS
END start
5
第 五 节 BIOS和 DOS中断功能调用
(教材旧 P238、新 P239)
一,概述二,BIOS功能调用三,DOS系统功能调用
( 21H类型中断调用 )
6
一,概述
1,BIOS 和 DOS 中断子程层次特点
2,中断类型分类
3,调用方法
7
1,BIOS和 DOS中断子程层次特点用户程序磁盘管理模块 (DOS内核 )
MSDOS.SYS 系统功能基本输入 /输出 BIOS 模 块
IO.SYS 设备驱动
ROM BIOS 基本 I/O
系 统 硬 件装入命令处理模块
COMMAN D.COM
用户命令
DOS系统层次结构
8
层次特点:
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
用户命令
9
MSDOS.SYS中的中断子程
( 称 DOS内核模块 )
调用 IO.SYS,实现对外设的控制 。
与标准外设有两层隔离,
IO.SYS和 ROM BIOS。
其中,
21H类型的中断子程提供了丰富的系统服务,
称 21类型的中断调用为 DOS系统 (功能 )调用 。
用户程序磁盘管理模块 (DOS内核 )
MSDOS.SYS 系统功能基本输入 /输出 BIOS 模 块
IO.SYS 设备驱动
ROM BIOS 基本 I/O
系 统 硬 件装入命令处理模块
COMMAN D.COM
用户命令
10
用户编程原则
① 尽可能使用 DOS的系统功能调用,
提高程序可移植性 。
② 在 DOS功能不能实现情况下,
考虑用 BIOS功能调用 。
③ 在 DOS和 BIOS的中断子程不能解决问题时,
使用 IN/OUT指令直接控制硬件 。
用户程序磁盘管理模块 (DOS内核 )
MSDOS.SYS 系统功能基本输入 /输出 BIOS 模 块
IO.SYS 设备驱动
ROM BIOS 基本 I/O
系 统 硬 件装入命令处理模块
COMMAN D.COM
用户命令
11
2,中断类型分类
向量表中的中断类型分为七类:
① 处理 CPU特殊操作 ( 除 0,溢出 )的 00H,04H类型 。
② 为 DEBUG调试程序设置 的单步 ( 01H ),断点 ( 03H )类型 。
③ 处理 CPU的 NMI引脚信号 的 02H类型 。
非屏蔽硬中断子程
④ 处理 CPU的 INTR引脚信号 的 08~0FH类型 。
可屏蔽类型硬中断子程
⑤ 用 INT指令调用的中断子程
BIOS功能调用 ( 如 10~1AH)
DOS功能调用 ( 如 21H)
NMI
INTR
8088
12
⑥ 保留类型为 DOS系统保留
(1) 指现在未用到,以后系统可能会用到 。
(2) 已用到,但不向用户公开 。
为用户保留
(1) 被系统子程嵌套调用了的类型 ( 如 1BH,1CH )。
使用户在系统功能基础上扩充功能 。
(2) 系统未占用类型 ( 如 60H~67H )。
⑦ 非中断向量类型对应向量表中的 4个单元存放的不是中断向量 。
( 如 1DH,1EH,1FH,41H,46H,22H)
通常是一些参数表的地址信息,
13
类型号 中断功能名称 模 块 中 断 源
00H 除零错误 BI OS CP U 内部操作
01H 单步执行 BI OS DE BUG 程序
02H 非屏蔽中断 BI OS 非屏蔽硬中断
03H 断点设置 BI OS DE BUG 程序
04H 溢出错误 BI OS CP U 内部操作
05H 屏幕打印 BI OS I NT 指令
06- 07H 保留
08H 定时器中断 BI OS 可屏蔽硬中断
09H 键盘中断 BI OS 可屏蔽硬中断
0A H 保留 BI OS 可屏蔽硬中断
0B H 串行通信中断 BI OS 可屏蔽硬中断
0C H 保留 BI OS 可屏蔽硬中断
0D H 硬盘中断 BI OS 可屏蔽硬中断
0E H 软盘中断 BI OS 可屏蔽硬中断
0F H 打印机中断 BI OS 可屏蔽硬中断
中断向量分配表
14
类型号 中断功能名称 模 块 中 断 源
10H 显示器 I /O BIO S INT 指令
1 1 H 设备配置检测 BIO S INT 指令
12H 内存容量检测 BIO S INT 指令
13H 磁盘 I/ O BIO S INT 指令
14H 串行通信 I /O BIO S INT 指令
15H 盒式磁带 I /O BIO S INT 指令
16H 键盘 I/ O BIO S INT 指令
17H 打印机 I /O BIO S INT 指令
18H RO M BASIC 入口 BIO S INT 指令
19H 系统检测程序 BIO S INT 指令
1AH 日时钟 I /O BIO S INT 指令
1BH 用户 Ctr l- Br eak BIO S INT 指令
1CH 用户定时器 BIO S INT 指令
1DH 显示器参数表 BIO S 非中断向量
1EH 软盘参数表 BIO S 非中断向量
1FH 图形显示字符表 BIO S 非中断向量中断向量分配表 ( 续)
15
类型号 中断功能名称 模 块 中 断 源
20H 程序结束返回系统 DO S INT 指令
21H 系统功能调用 DO S INT 指令
22H 程序结束地址 DO S 非中断向量
23H Ctrl -Br eak 处理 DO S INT 指令
24H 严重错误处理 DO S INT 指令
25H 按扇区读磁盘 DO S INT 指令
26H 按扇区写磁盘 DO S INT 指令
27H 程序结束驻留内存 DO S INT 指令
28 - 3FH 保留
40H 软盘 I/ O BIOS INT 指令
41,46H 硬盘参数表 1,2 BIOS 非中断向量
42 - 5FH 保留
60 - 67H 为用户保留 INT 指令
68 - 7FH 保留
80 - F0H BA SIC 使用 BIOS INT 指令
F1 - FFH 保留中断向量分配表 ( 续)
16
3,调用方法设置入口参数在 AH设置功能号 m
执行中断指令 INT N
分析、应用出口参数
17
例 1 单字符显示功能调用
MOV DL,‘A’ ;设置入口参数
MOV AH,02H ;设置功能号
INT 21H ;执行中断调用例 2 单字符输入功能调用
MOV AH,01H ;设置功能号
INT 21H ;执行中断调用
CMP AL,0DH ;分析,应用出口参数
JZ exit
、、、
18
二,BIOS功能调用
基本输入 /输出模块 BIOS:
实现对输入 /输出设备的控制,
内含 0– 1CH 等类型中断子程,
包括显示器,磁盘,键盘,打印机等标准外设的驱动程序 。
( 参看中断类型分配表 )
BIOS功能调用指对 BIOS模块中的中断子程的调用 。
19
有关显示器
① 显示器通过显卡 (显示适配器 )连接到计算机上 。
② 单色显示器只能显示黑白两色 。
彩色显示器能显示多种颜色 。
20
③ 屏幕上各象素的显示信息,存放在显示缓冲区(显存)中。
640KB RAM 基本内存
0000:0000
0040:0000
0050:0000
0070:0000
A000:0000
B000:0000
C800:0000
F600:0000
FE00:0000
FE00:1FFF
显示缓存区 ( 显存 )
硬盘驱动器控制 ROM
32KB ROM BASIC
8KB ROM BIOS
IO.SYS模块
COMMAND.COM常驻模块
MSDOS.SYS模块用户程序空间
COMMAND.COM暂驻模块
256KB ROM
DOS工作区
ROM BIOS工作区
128KB RAM 保留区
1KB中断向量表
21
④ 显示器有两种显示方式,
图形方式,
将屏幕划分为 m× n的点阵,在每个点的位置显示象素,
一个点是一个象素 。
文本方式将屏幕划分为若干行和列,在每个网格位置上显示象素,
一个字符是一个象素 。
22
文本方式将屏幕划分为 m列和 n行 (m × n),在每个网格位置上显示象素,
一个字符是一个象素 。
80× 25 文本方式
A
~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
0
列
0 行
79
列
24行
B C
23
~~ ~~
640× 480 图形方式
640 点
480点图形方式,
将屏幕划分为 m× n的点阵,在每个点的位置显示象素,
一个点是一个象素 。
24
在文本方式下,
对应屏幕上的 每个字符,在显示缓冲区中占用两个单元,
一个存放 ASCII码,一个存放显示属性 。
41H
07H
42H
07H
61H
70H
62H
70H
、、、显示缓冲区
( 显存 )
字符 A,黑底白字字符 B,黑底白字字符 a,白底黑字字符 b,白底黑字
25
例 10000111B 或 87H
表示黑底白字,闪烁
01110000B 或 70H
表示白底黑字,不闪烁
16种
0000 黑 1000 灰
0010 绿 1010 浅绿
0100 红 1100 浅红
0111 灰白 1111 白
BL R G B I R G B
闪烁 背景前景
7 6 5 4 3 2 1 0
8种
000 黑
010 绿
100 红
111 白
0 不闪烁
1 闪烁属性字节的含义:
26
据显存大小,可存储若干页的字符象素 。
例 16KB 显存能存储,
80× 25方式,4页 ( 0 ~ 3 ),80× 25× 2× 4 =16000
40× 25方式,8页 ( 0 ~ 7 ),40× 25× 2× 8 =16000
27
1,设置显示方式入口参数 AL = 显示方式值
00 40× 25 黑白文本方式
01 40× 25 彩色文本方式
02 80× 25 黑白文本方式
03 80× 25 彩色文本方式
04 320× 320 彩色图形方式功能号 AH = 00H
类型号 10H
出口参数 无实现功能 将显示方式设置为指定形式例 将显示方式设置为 80× 25 彩色文本方式
MOV AL,03H
MOV AH,00
INT 10H
28
2,清屏,清窗口功能入口参数 AL = 0
CH = 窗口左上角行号
CL =窗口左上角列号
DH = 窗口右下角行号
DL =窗口右下角列号
BH = 窗口属性功能号 AH = 06H 或 AH = 07H
类型号 10H
出口参数 无实现功能 按给定属性清除指定的窗口内容
29
例 清除屏幕显示,将其属性置为反白 ( 白底黑字 ) 显示 。
MOV AL,0 ;清屏功能
MOV BH,70H ;白底黑字
MOV CH,0 ;左上角 行号
MOV CL,0 ;左上角 列号
MOV DH,24 ;右下角 行号
MOV DL,79 ;右下角 列号
MOV AH,6 ;功能号
INT 10H ;中断调用
30
3,置光标位置
光标控制开始显示的位置,
计算机有专门的硬件控制光标的显示大小,位置 。
光标只在文本方式中出现,在图形方式下光标消失 。
~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
0
列
0 行
79列
24 行
5
列1列
1 行
2 行
31
置光标位置入口参数 DH = 行号
DL = 列号
BH = 页号功能号 AH= 02H
类型号 10H
出口参数 无实现功能 将光标设置在指定的位置
32
例 将光标设置在 2行 5列 的位置
MOV DH,2
MOV DL,5
MOV BH,0
MOV AH,2
INT 10H
~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
0列
0 行
79列
24行
5列1
列
1 行
2 行
33
三,DOS系统功能调用 (21H类型中断调用 )
1,显示单字符 ( 02H功能 )
2,显示字符串 ( 09H功能 )
3,单字符输入 ( 01H,07H,08H功能 )
4,字符串输入 ( 0AH功能 )
5,检测键盘状态 ( 0BH功能 )
6,保存中断向量 ( 35H功能 ) (第六章介绍 )
7,设置中断向量 ( 25H功能 )
34
1,显示单字符 ( 02H功能 )
入口参数 DL = 要显示字符的 ASCII 码功能号 AH=02H
类型号 INT 21H
出口参数 无实现功能 显示指定字符,光标随动 。
例 显示字符 A
MOV DL,‘A’
MOV AH,02H
INT 21H
35
例 使光标回到下一行的行首 。
MOV DL,0DH ;显示回车符
MOV AH,02H
INT 21H
MOV DL,0AH ;显示换行符
MOV AH,02H
INT 21H
~~~~ ~~ ~~ ~~ ~~ ~~ ~~
H e l l o
W o r l d
36
2,显示字符串 ( 09H功能 )
入口参数 ① 定义要显示的字符串,
字符串尾应为 ’ $’,作为结束显示的标志 。
② DS,DX = 字符串的首地址功能号 AH = 09 H
类型号 21H
出口参数 无实现功能 显示字符串,遇 ’ $’停止显示,光标随动 。
37
例 编程显示字符串 ’ TsinghuaUniversity’
data SEGMENT ;定义显示的子符串
stri DB ‘Tsinghua University’,‘$’
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
start,MOV AX,data ;置缓冲区地址于 DS:DX
MOV DS,AX
LEA DX,stri
MOV AH,09H ;调显示功能
INT 21H
MOV AH,4CH ;返回 DOS
INT 21H
code ENDS
END start
38
有关键盘
① 键盘通过键盘接口电路与计算机连接 。
② 键盘上的键有三种类型,
字符键 A~Z,0~9等功能键 F1~F12,Page Up等组合控制键 Shift,Ctrl,Alt等
③ 键盘上的每个键都有一个 扫描码 。
◢ ◢ 据扫描码可确定操作的是哪个键,是按下键还是释放键;
◢ ◢ 扫描码用一个字节表示 。
低 7位是扫描码的数字编码,与键盘上的键一一对应;
最高位 D7位表示键的操作状态:
当 按下键时,D7=0 ; 当 释放键时,D7=1
39
⑤ 键盘中断子程功能 ( 09H类型中断子程 )
◢ 从键盘接口读取操作键的扫描码 ;
◢ 将扫描码转换成字符码;
大部分键的字符码为 ASCII码,
无 ASCII码键 ( 如组合键 Shift,Ctrl等 ) 的字符码为 0。
◢ 将键的扫描码,字符码存放在键盘缓冲区,
供其它有关键盘的中断子程应用 。
④ 键盘接口对按下键和释放键均向计算机发出中断申请,
如果 中断响应条件满足,CPU转去执行键盘中断子程。
键盘中断子程类型号为 09H。
40
3,单字符输入 ( 01H,07H,08H功能 )
① 入口参数 无功能号 AH = 01H
类型号 21H
出口参数 AL = 键入字符的 ASCII码实现功能 等待从键盘输入一个字符,
并在屏幕上回显,光标移动,
检测 Ctrl-Break键
41
例 利用键盘输入的字符产生分支:
MOV AH,1 ;等待从键盘输入
INT 21H
CMP AL,‘Y’ ;是 ’ Y’?
JZ yes
CMP AL,‘y’ ;是 ’ y’?
JZ yes
no,.,,
.,,
JMP exit
yes,.,,
.,,
exit,.,,
42
例 在中断向量表中 查找从键盘输入的字符,
并将其个数用二进制形式显示出来 。 ( scanskey.asm)
code SEGMENT ;代码段开始
ASSUME CS:code
begin,MOV AX,0000H ;设置查找首地址
MOV DS,AX
MOV SI,0000H
MOV CX,0400H ;设置查找长度
MOV BX,0 ;计算值初值
MOV AH,01H ;从键盘输入
INT 21H ;输入关键字
MOV DL,AL ;保存在 DL中
next,LODSB ;从串取
CMP AL,DL ;与关键字比较
JNZ point
INC BX ;计算值加 1
point,LOOP next ;查找结束?
CALL display ;调用显示子程
MOV AH,4CH ;调用 4CH功能
INT 21H ;返回 DOS;用二进制显示 BX内容子程
display PROC
MOV CX,16 ;显示位数
rotate,ROL BX,1
MOV DL,BL
AND DL,01H
ADD DL,30H
MOV AH,2H
INT 21H
LOOP rotate
RET ;子程返回
display ENDP
code ENDS ;代码段结束
END begin
43
② 入口参数 无功能号 AH = 07H
类型号 21H
出口参数 AL = 键入字符的 ASCII码实现功能 等待从键盘输入一个字符,
不在屏幕上回显,
不检测 Ctrl-Break键
44
例 用不带回显功能输入密码时:
input,MOV AH,07H ;等待从键盘输入
INT 21H
MOV [DI],AL ;存入缓冲区
CMP AL,0DH ;是回车符?
JNZ input ;不是,继续输入
check:,、、
、、、
45
4,字符串输入 ( 0AH 功能 )
入口参数 DS,DX = 缓冲区的首地址
( DS,DX ) = 限制最多输入的字符数功能号 AH = 0AH
类型号 21H
出口参数 ( DS,DX+1 ) = 实际键入的字符 (不含回车符 )
从 ( DS,DX+2 )开始顺序存放键入的字符串,
回车符 0DH为串尾最后一字符 。
实现功能 等待从键盘输入字符串,并存入设定的缓冲区内,
同时回显字符串,光标随着移动,
回车符使光标回到行首 。
注意事项,应按要求先定义缓冲区,再调用 。
46
例 应用 0AH功能输入字符串。
data SEGMENT ;定义缓冲区
max DB 11 ;定义限制最多输入个数
lenth DB? ;用于存放实际输入个数
stri DB 11 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 ;调 0A输入功能
MOX CH,0
MOV CL,lenth ;取字符串长度放 CX中
LEA BX,stri ;取字符串首址于 BX中
MOV AL,[BX] ;应用输入字符
、、、、、
code ENDS
47
data SEGMENT ;定义缓冲区
max DB 11 ;定义限制最多输入个数
lenth DB? ;用于存放实际输入个数
stri DB 11 DUP(?) ;用于存放输入的字符串
data ENDS
从键盘输入 ‘ ABCD’,回车,内存的存放结果,
0B 04 41 42 43 44 0D 00
max
0 7
00 00 00 00 00 00 00 00
8 0a 0b 0f1 2 3 4 5 6 9 0c 0d 0e
lenth
stri
地址内容
DS:DX
48
如下编程与上例相同,
data SEGMENT
max DB 11 等价于:
DB? max DB 11,?,11 DUP(?)
DB 11 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
MOX CH,0
MOV CL,max+1 ;取字符串长度放 CX中
LEA BX,max+2 ;取字符串首址于 BX中
MOV AL,[BX] ;应用输入字符
、、、
code ENDS
49
data SEGMENT
max DB 11
DB?
DB 11 DUP(?)
data ENDS
从键盘输入 ‘ ABCD’,回车,内存的存放结果,
等价于
max DB 11,?,11 DUP(?)
0B 04 41 42 43 44 0D 00
max
0 7
00 00 00 00 00 00 00 00
8 0a 0b 0f1 2 3 4 5 6 9 0c 0d 0e地址内容
DS:DX
50
0AH功能执行过程,
① 若 (DS:DX)字节单元的值为 0,则不等待从键盘输入,结束调用 。
② 若 (DS:DX) 字节单元的内容 大于 0,则等待从键盘输入,
并把输入键的 ASCII码顺序存放在 DS,DX+2开始的单元,
按回车键表示结束输入 。
当按下键的个数超过 ( DS,DX )中值,发出警告声 ’ 嘟嘟 ’,
不再接收输入的数据,直到输入回车键 。
③ 将实际输入的字符个数 (不包括回车键 )填入 (DS:DX+1),
结束调用 。
DS:DX
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
51
0AH功能注意事项,
◢ 输入的字符均带回显,且光标随字符移动 。
当输入回车符结束时,也 回显回车符 。
表现为功能调用结束后,光标回到了行首 。
◢ 回车符 0DH作为一个输入的字符存放在字符串尾,
但 计数输入个数时,不包括回车键 。
实际最多能输入的字符数 = 限制的最多数 -1
( 回车符占一个 )
◢ 执行完 0AH功能后,DS和 DX的值不变,
DS:DX仍指向缓冲区的首地址 。
◢ 整个缓冲区的大小应为,限制的最多数 +2
max DB 11,?,11 dup (?)
52
例 利用 DEBUG查看 0A功能输入结果 。
data SEGMENT
max DB 11,?,11 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
MOV CH,0
MOV CL,max+1 ;取输入长度到 CX中
MOV AH,4CH ;返回 DOS
INT 21H
code ENDS
END start
53
D:\MASM>DEBUG TEST0a.exe ;装入执行文件
-U ;反汇编程序
129E:0000 B89D12 MOV AX,129D
129E:0003 8ED8 MOV DS,AX
129E:0005 8D160000 LEA DX,[0000]
129E:0009 B40A MOV AH,0A
129E:000B CD21 INT 21
129E:000D B500 MOV CH,00
129E:000F 8A0E0100 MOV CL,[0001]
129E:0013 B44C MOV AH,4C
129E:0015 CD21 INT 21
、、、
-D 129D:0 L10 ;查看程序执行 前 缓冲区内容
129D:0000 0B 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00,...............
-G 000D ;执行程序
Hello ;从键盘输入字符串
Program terminated normally
-D 129D:0 L10 ;查看程序执行 后 缓冲区内容
129D:0000 0B 05 48 65 6C 6C 6F 0D-00 00 00 00 00 00 00 00,.Hello.........
-
54
思考:
1,若将程序改为如下形式,设想程序执行的结果 。
data SEGMENT
max DB 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
MOV AH,4CH ;返回 DOS
INT 21H
code ENDS
END start
55
结果是,不等待输入,结束 0AH功能调用 。
00 00 00 00 00 00 00 00
max
0 7
00 00 00 00 00 00 00 00
8 0a 0b 0f1 2 3 4 5 6 9 0c 0d 0e地址内容
DS:DX
注意,由于 DS:DX限制输入最大字符数为 0,
所以不等待输入,结束 0AH功能调用 。
原因是:
56
2,若将程序改为如下形式,设想程序执行的结果。
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
MOV AH,4CH ;返回 DOS
INT 21H
code ENDS
END start
57
结果是,不等待输入,结束 0AH功能调用 。
00 01 00 00 00 00 00 00
max
0 7
00 00 00 00 00 00 00 00
8 0a 0b 0f1 2 3 4 5 6 9 0c 0d 0e地址内容
DS:DX
注意,0AH功能以 字节类型应用 DS:DX指向的缓冲区 。
并不随缓冲区类型定义的变化而变化 。
原因是:
58
例 编程从键盘输入字符串,给出显示提示 ’ Please input:’
data SEGMENT
stri DB ‘PleaseInput,’,’$’
max DB 11,?,11 DUP(?)
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
start,MOV AX,data ;置缓冲区地址于 DS:DX
MOV DS,AX
LEA DX,stri
MOV AH,09H ;显示提示
INT 21H
LEA DX,max ;等待从键盘输入
MOV AH,0AH
INT 21H
MOV AH,4CH
INT 21H
code ENDS
END start
利用 DOS 功能调用,编写小程序
59
D:\MASM>DEBUG e0a09.exe
-U ;查看程序
129F:0000 B89D12 MOV AX,129D
129F:0003 8ED8 MOV DS,AX
129F:0005 8D160000 LEA DX,[0000]
129F:0009 B409 MOV AH,09
129F:000B CD21 INT 21
129F:000D 8D160F00 LEA DX,[000F]
129F:0011 B40A MOV AH,0A
129F:0013 CD21 INT 21
129F:0015 B44C MOV AH,4C
129F:0017 CD21 INT 21
-D 129D:0 L20 ;执行程序前查看 data段内容
129D:0000 50 6C 65 61 73 65 20 49-6E 70 75 74 20 3A 24 0B Please Input,$.
129D:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00,...............
-G ;执行程序
Please Input,Hello!
Program terminated normally
-D 129 D:0 L20 ;执行程序后查看 data段内容
129D:0000 50 6C 65 61 73 65 20 49-6E 70 75 74 20 3A 24 0B Please Input,$.
129D:0010 06 48 65 6C 6C 6F 21 0D-00 00 00 00 00 00 00 00,Hello!.........
-
60
data段内存情况:
stri
P l e a s e I n p u t,$ 0B
06 H e l l o ! 0D 00 00 00 00 00 00 00 00
max
61
思考,程序中少了一个 ’ $’ 符的后果。
data SEGMENT
stri DB ‘Please Input,’
max DB 11,?,11 DUP(?)
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
start,MOV AX,data ;置缓冲区地址于 DS:DX
MOV DS,AX
LEA DX,stri
MOV AH,09H ;显示提示
INT 21H
LEA DX,max ;等待从键盘输入
MOV AH,0AH
INT 21H
MOV AH,4CH
INT 21H
code ENDS
END start
62
data SEGMENT
stri DB ‘Please Input,’
max DB 11,?,11 DUP(?)
data ENDS
stri
P l e a s e I n p u t,0B 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
max
B8 A8 12 8E D8 8D 16 00 00 B4 09 CD 21 8D 16 0E
start
注意,09H功能只在遇到’ $’符才结束显示 。
63
5,检测键盘状态 ( 0BH功能 )
入口参数 无功能号 AH= 0BH
类型号 21H
出口参数 AL= FFH,表示有键按下 。
AL= 0,表示无键按下 。
实现功能 检测键盘状态 (通过检测键盘缓冲区实现 )
64
例 利用 0B功能实现按键退出循环 。
、、
continue:,、
、、
、、
MOV AH,0BH ;检测键盘缓冲区是否有键按下
INT 21H
CMP AL,0FFH
JNZ continue ;无键按下继续循环
、、
、、
MOV AH,4CH
INT 21H
65
6,保存中断向量 (35H功能 )
入口参数 AL = 要保存向量的中断类型号 N
功能号 AH = 35H
类型号 21H
出口参数 BX = ( 0:N× 4 )
ES = ( 0:N× 4 +2 )
实现功能 将类型号 N的中断向量保存在 ES,BX中
66
方法一,用堆栈保存中断向量
MOV AL,09H ;取中断向量
MOV AH,35H
INT 21H
PUSH ES ;用堆栈保存
PUSH BX
、,、
例 保存 09H类型的中断向量
67
方法二,用变量保存中断向量
save_09cs DW? ;定义变量
save_09ip DW?
、、、
MOV AX,SEG save_09cs
MOV DS,AX
MOV AL,09H ;取中断向量
MOV AH,35H
INT 21H
MOV save_09cs,ES ;用变量保存
MOV save_09ip,BX
68
7,设置中断向量 (25H功能 )
入口参数 AL = 要设置向量的中断类型号 N
DS:DX = 中断子程的入口地址 (中断向量 )
功能号 AH = 25H
类型号 21H
出口参数 无实现功能 将类型 N的中断向量设置在向量表中,即
( 0,N × 4) =类型 N中断子程入口地址的 偏移值
( 0,N × 4+2) =类型 N中断子程入口地址的 段值
69
例 1 设置中断子程 Sound 的中断向量,类型号为 60H
code SEGMENT
ASSUME CS:code
start:,、
MOV AX,SEG sound
MOV DS,AX
MOV DX,Offset sound
MOV AL,60H
MOV AH,25H
INT 21H
、、
INT 60H ;调用 60H中断子程
、、
MOV AH,4CH
INT 21H; 中断子程
sound PROC
、、、
、、、
、、、
IRET
sound ENDP
code ENDS
END start