第 7章 中断调用程序设计
第 7章 中断调用程序设计
? 7.1 概述
? 7.2 键盘输入中断调用
? 7.3 显示器输出中断调用
? 7.4 磁盘 文件管理
开 始
第 7章 中断调用程序设计
7.1 概述
? 7.1.1 DOS中断和 BIOS中断
? 7.1.2 DOS中断和 BIOS中断使用方法
第 7章 中断调用程序设计
7.1.1 DOS中断和 BIOS中断
在存储器系统中, 内存器高端 8K的 ROM中存放有
基本输入输出系统 ( Basic Input/Output System,BIOS)
例行程序 。 BIOS给 PC系列的不同微处理器提供了兼容
的系统加电自检, 引导装入, 主要 I/O设备的处理程序
以及接口控制等功能模块来处理所有的系统中断 。 使用
BIOS功能调用, 给程序员编程带来极大方便 。 程序员
不必了解硬件的具体细节, 可直接使用指令设置参数,
并中断调用 BIOS例行程序, 所以利用 BIOS功能调用编
写的程序简洁, 可读性好, 而且易于移植 。
第 7章 中断调用程序设计
磁盘操作系统( Disk Operating System)是 PC机上
最重要的操作系统,它是由软盘或硬盘提供的。它的两
个 DOS模块 IBMBIO.COM和 IBMDOS.COM使 BIOS使用起
来更方便。因为 DOS模块提供了更多更必要的测试,使
DOS操作比使用相应功能的 BIOS操作更简易,而且 DOS
对硬件的依赖性更少些。 DOS模块和 ROM BIOS的关系
如下图所示。
第 7章 中断调用程序设计
7.1.2 DOS中断和 BIOS中断使用方法
DOS功能调用与 BIOS功能都通过软件中断调用 。
在中断调用前需要把功能号装入 AH寄存器,
把子功能号装入 AL寄存器, 除此之外, 还需要
在 CPU的寄存器中提供专门的调用参数 。 一般
来说, 调用 DOS或 BIOS功能时, 有以下几个步
骤,
( 1) 将调用参数装入指定的寄存器 。
( 2) 如需功能调用号, 把它装入 AH。
( 3) 如需子功能调用号, 把它装入 AL。
( 4) 按中断号调用 DOS或 BIOS。
( 5)检查返回参数是否正确。
第 7章 中断调用程序设计
7.2 键盘输入中断调用
7.2.1 ASCII与扫描码
7.2.2 BIOS键盘中断
7.2.3 DOS中断调用
第 7章 中断调用程序设计
7.2.1 ASCII与扫描码
键盘是计算机最基本的一种输入设备,
用来输入信息, 以达到人机对话的目的 。 键
盘主要由 3种基本类型的键组成,
( 1)字符数字键,
( 2)扩展功能键:如 Home,End,Backspace、
Delete,Insert,PgUp,PgD以及功能键 F1~
F10
( 3)和其他键组合使用的控制键:如 Alt,Ctrl,
Shift等
第 7章 中断调用程序设计
键盘和主机通过 5芯电缆相连,这 5根线
分别是电源线、地线、复位线以及键盘数据
线和键盘时钟线。 PC机系列的键盘触点电路
按 16行 × 8列的矩阵来排列,用单片机
Intel8048来控制对键盘的扫描。按键的识别
采用行列扫描法,即根据对行线和列线的扫
描结果来确定闭合键的位置,这个位置值称
为按键的扫描码,通过数据线将 8位扫描码送
往主机。当在键盘上“按下”或“放开”一
个键时,如果键盘中断是允许的( 21H端口
的第一位等于 0),就会产生一个类型 9的中
断,并转入到 BIOS的键盘中断处理程序。
第 7章 中断调用程序设计
该处理程序从 8255可编程外围接口芯片的输
入端口读取一个字节,这个字节的低 7位是按键
的扫描码。最高位为 0或者为 1,分别表示键是
“按下”状态还是“放开”状态。按下时,取得
的字节称为通码,放开时取得的字节称为断码。
如 ESC键按下取得的通码为 01H( 00000001B),
放开 ESC键时会产生一个断码 81H
( 10000001B)。 BIOS键盘处理程序将取得的扫
描码转换成相应的字符码,大部分的字符码是一
个标准的 ASCII码;没有相应 ASCII的键,如 Alt
和功能键( F1~ F10),字符码为 0;还有一些非
ASCII码键产生一个指定的操作。
第 7章 中断调用程序设计
7.2.2 BIOS键盘中断
类型 16H的中断提供了基本的键盘操作,它的
中断处理程序包括 3个不同的功能,分别根据 AH寄
存器中的子功能号来确定。
( 1) AH=0 本功能为从键盘读字符到 AL寄存器中 。
( 2) AH=1 本功能为读键盘缓冲区字符到 AL寄存器
中, 并置 ZF标志位 。
( 3) AH=2 本功能为读取特殊功能键的状态 。
第 7章 中断调用程序设计
【 例 7.1】
下面给出一个利用键盘 I/O功能的程序例 。 用 INT 16H
( AH=0) 调用实现键盘输入字符 。
DATA SEGMENT
BUFF DB 100 DUP(?)
MESS DB ‘NO CHARACTER!’,0DH,0AH,‘ $’
DATA ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
第 7章 中断调用程序设计
START,MOV AX,DATA
MOV DS,AX
MOV CX,100
MOV BX,OFFSET BUFF ;内存缓冲区首址
LOP1,MOV AH,1
PUSH CX
MOV CX,0
MOV DX,0
INT 1AH ;设置时间计数器值为 0
第 7章 中断调用程序设计
LOP2,MOV AH,0
INT 1AH ;读时间计数值
CMP DL,100
NZ LOP2 ;定时时间未到, 等待
MOV AH,1
INT 16H ;判有无键入字符
JZ DONE ;无键输入, 则结束
MOV AH,0
INT 16H ;有键输入, 则读出键的 ASCII码
第 7章 中断调用程序设计
MOV BX,AL ;存入内存缓冲区
INC BX
POP CX
LOOP LOP1 ; 100个未输完
JMP EN
DONE,MOV DX,OFFSET MESS
MOV AH,09H
INT 21H ;显示提示信息
EN,MOV AH,4CH INT 21H
CODE ENDS END START
返回本节
第 7章 中断调用程序设计
7.2.3 DOS中断调用
第 7章 中断调用程序设计
7.3 显示器输出中断调用
10H中断调用为显示器中断,共有 17种功
能。下面列出几种主要功能的使用情况。
( 1) 设置显示方式 ( 0号功能 )
入口参数,AH=0( 功能号 ), AL=设置方式 ( 0~7) 。
出口参数:无 。
( 2)设置光标类型( 1号功能)
入口参数,AH=1(功能号),CH=光标开始行,CL=光标
结束行。
出口参数:无 。 根据 CX给出光标的大小 。
第 7章 中断调用程序设计
AL
显示方式
0
40× 25黑白文本方式
1
40× 25彩色文本方式
2
80× 25黑白文本方式
3
80× 25彩色文本方式
4
320× 200彩色图形方式
5
320× 200黑白图形方式
6
640× 200黑白图形方式
7
80× 25黑白文本方式(单色显示卡)
第 7章 中断调用程序设计
( 3) 设置光标位置 ( 2号功能 )
入口参数,AH=2( 功能号 ), BH=页号, DH=行号, DL=
列号 。
出口参数:无 。 根据 DX确定了光标位置 。
( 4) 读当前光标位置 ( 3号功能 )
入口参数; AH=3( 功能号 ), BH=页号 。
出口参数,DH=行号, DL=列号, CX=光标大小 。 ( 5) 初始
窗口或向上滚动 ( 6号功能 )
入口参数,AH=6,AL=上滚行数, CX=上滚窗口左上角的行,
列号 。 DX=上滚窗口右下角的行,
第 7章 中断调用程序设计
列号 。 BH=空白行的属性 。
出口参数:无 。 当滚动后, 底部为空白输入行 。
( 6)初始窗口或向下滚动( 7号功能)
入口参数,AH=7,AL=下滚行数, CX=下滚窗口
左上角的行, 列号 。 DX=下滚窗口右下角的行, 列
号 。 BH=空白行的属性 。
出口参数:无 。 当滚动后, 顶部为空白输入行 。
( 7) 读当前光标位置的字符与属性 ( 8号功能 )
入口参数,AH=08H,BH=页号 。
出口参数,AL为读出的字符, AH为字符属性 。
第 7章 中断调用程序设计
表 7.1 黑白方式显示属性字节
第 7章 中断调用程序设计
表 7.2 彩色文本方式显示属性字节
位号 7 6 5 4 3 2 1 0
属性
字节
BL R G B I R G B
闪烁选择 背景颜色 前景颜色
第 7章 中断调用程序设计
110 棕
RGB 颜色
000 黑
001 蓝
010 绿
011 青
100 红
101 品红
111 白

7.
3






第 7章 中断调用程序设计
IRGB
颜色
IRGB
颜色
0000

1000

0001

1001
浅蓝
0010
绿
1010
浅绿
0011

1011
浅青
0100

1100
浅红
0101
品红
1101
浅品红
0110

1110

0111

1111
强度白

7.
4





第 7章 中断调用程序设计
( 8) 在当前光标位置写字符和属性 ( 9号功能 )
入口参数,AH=9,BH=页号, AL=字符的 ASCII码, BL=字
符属性, CX=写入字符数 。
出口参数:无 。
( 9) 在当前光标位置写字符 ( 10号功能 )
入口参数,AH=0AH,BH=页号, AL=字符的 ASCII码,
CX=写入字符数 。
出口参数:无 。
( 10) 设置彩色组或背景颜色 ( 11号功能 )
第 7章 中断调用程序设计
入口参数,AH=0BH,BH=0或 1,BH为 0时, 设置背景颜
色 。 当 BH=1时, 可设置彩色组, 即为显示的像素点确定
颜色组 。
出口参数:无 。 背颜色与对应值见表 5.8。
( 11) 写像素 ( 12号功能 )
入口参数,AH=0CH,DX=行数, CX=列数, AL=彩色值
( AL的 D7为 1,则彩色值与当前点内容作 ‘ 异或 ’ 运算 ) 。
出口参数:无 。
( 12) 读像素 ( 13号功能 )
第 7章 中断调用程序设计
BL
IRGB
颜色
BL
IRGB
颜色
0
0000

8
1000

1
0001

9
1001
浅蓝
2
0010
绿
10
1010
浅绿
3
0011

11
1011
浅青蓝
4
0100

12
1100
浅红
5
0101
品红
13
1101
浅品红
6
0110

14
1110

7
0111
亮灰
15
1111


7.
5







第 7章 中断调用程序设计
表 7.6 彩色分组
第 7章 中断调用程序设计
入口参数,AH=0DH,DX=行数, CX=列数 。
出口参数,AL=彩色值 。
( 13) 写字符并移光标位置 ( 14号功能 )
入口参数,AH=0EH,AL=写入字符, BH=页号,
BL=前景颜色 ( 图形方式 ) 。
出口参数:无 。
( 14) 读当前显示状态 ( 15号功能 )
入口参数,AH=0FH。
出口参数,AL=当前显示方式, BH=页号, AL=屏
幕上字符列数 。
第 7章 中断调用程序设计
【 例 7.2】 在屏幕 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
第 7章 中断调用程序设计
ASSUME CS,CODE,DS,DATA,SS,STACK
ST,MOV AX,DATA
MOV DS,AX
MOV AH,0 ;设置 80× 25彩色文本方式
MOV AL,3
INT 10H
LEN SI,ATRI;属性字节值表首址存 SI
MOV DI,5 ;显示 5个字符
第 7章 中断调用程序设计
MOV DX,0A13H ;显示位置
MOV AH,15;取当前页号
INT 10H LP,MOVAH,2;置光标位置
INC DL
INT 10H
MOV AL,5 ;显示梅花形字符
MOV BL,[SI]
MOV CX,1
第 7章 中断调用程序设计
MOV AH,9
INT 10H
INC SI,;指向下一属性字节
DEC DI;判显示完否
JNZ LP;未完转 LP再显示
MOV AH,4CH;完, 返回 DOS
INT 21H
CODE ENDS
END ST
返回本节
第 7章 中断调用程序设计
【 例 7.3】 采用直接对显示卡的寄存器和显示
缓冲区编程的方法,在 VGA图形模式 13H(即
320× 200,256色)下作图,画一条彩色的线。
DATA SEGMENT
SCR-LINE DW 0
SCR-COL DW 0
CUR-COLOR DD 0h
DATA ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
MAIN PROC FAR
第 7章 中断调用程序设计
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坐标
第 7章 中断调用程序设计
MOV CX,SCR-LINE ; CX为像素点的 x坐标
CALL DRAW-POINT ;在 ( x,y) 处画点
MOV DX,SCR-COL
MOV CX,SCR-LINE
CALL READ-POINT ;将 ( x,y) 处像素值读出
MOV DX,SCR-COL
MOV CX,SCR-LINE
ADD DX,4 ; x+4为新点的 x坐标
CALL DRAW-POINT ;在 ( x+4,y) 处画点
INC SCR-LINE ;指向下一行
第 7章 中断调用程序设计
INC SCR-COL ;指向右边的下一个点
INC CUR-COLOR ;指向下一种颜色
CMP SCR-LINE,200 ; 200列做完了吗?
JE ENDLINE ;做完了, 结束
JMP AGAIN ;没做完则重复
ENDLINE,RET
MAIN ENDP
DRAW-POINT PROC NEAR
PUSH ES
CALL GET-ADDR ;计算偏移量, 存在 DI中
第 7章 中断调用程序设计
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
READ-POINT PROC NEAR
第 7章 中断调用程序设计
PUSH ES
CALL GET-ADDR ;计算偏移量, 存在 DI中
MOV DX,0A000H
MOV ES,DX ;设显示缓冲区首址的段地址
MOV DX,3CDH
MOV AL,01000000B
OUT DX,AL;设显示缓冲区为线性内存结构
MOV BL,ES,[DI] ;从显示缓冲区读值
POP ES
RET
第 7章 中断调用程序设计
READ-LINT ENDP
GET-ADDR PROC NEAR
PUSH AX
PUSH DX
MOV AX,320 ;每行 320个点
MUL CX ;乘以行号即 y× 320
POP DX
ADD AX,2X ;即计算地址偏移量为 y× 320+x
MOV DI,AX ;偏移量送 DI
POP AX
第 7章 中断调用程序设计
RET
GET-ADDR ENDP
CODE ENDS
END STAR
MOV AH,2
INT 10H
JMP PRT1 ;再输入, 再打印
EXIT,RET PRNTY ENDP
CODE ENDS
END PRNTYP
返回本节
第 7章 中断调用程序设计
7.4 磁盘文件管理
7.4.1 BIOS磁盘存取功能
7.4.2 DOS磁盘存取功能
第 7章 中断调用程序设计
7.4.1 BIOS磁盘存取功能
BIOS磁盘操作 INT 13H处理的记录都是一个扇区的大小, 都
是以实际的磁道号和扇区号寻址的 。
读, 写和检查磁盘文件之前, 都要把下列寄存器初始化,
AH:子功能号 ( 读, 写, 检查或格式化 ) 。
AL:扇区数 。
CH:柱面 /磁道号 ( 0为起始号 ) 。
CL:起始的扇区号 ( 1为起始号 ) 。
DH:磁头 /盘面号 ( 对软盘是 0或 1) 。
DL:驱动器号 ( 软盘,0=驱动器 A,1=驱动器 B,…, 硬盘:
80H=驱动器 1,81H=驱动器 2,… 。 )
ES,BX:数据区中 I/O缓冲区的地址 。
第 7章 中断调用程序设计
1,0号功能
功能:复位磁盘系统 。
入口参数,( AH) = 0。
出口参数:无 。
这个操作执行对磁盘控制器的硬件复位 。 如果在
其他磁盘操作之后调用这个功能, 则返回一系
列错误 。
2,1号功能
功能:读磁盘状态 。
入口参数,( AH) = 1。
出口参数,( AL) 中返回状态字节 。
第 7章 中断调用程序设计
3,2号功能
功能:从指定磁盘的指定位置读取数据 。
入口参数,( AH) = 2
( AL) =扇区数, ( CH), ( CL) =磁道号, 扇区号
( DH), ( DL) =磁头号, 驱动器号
( ES,BX),数据缓冲区地址
出口参数:读成功, ( AH) = 0,( AL) =读出的扇区数;
读失败, ( AH) =出错代码 。
4,3号功能
功能:向指定磁盘的指定位置写数据 。
入口参数,( AH) = 3
( AL) =扇区数, ( CH), ( CL) =磁道号, 扇区号
( DH), ( DL) =磁头号, 驱动器号
( ES,BX),数据缓冲区地址
出口参数:写成功, ( AH) = 0,( AL) =写入的扇区数;
写失败,( AH)=出错代码。
第 7章 中断调用程序设计
5,4号功能
功能:检验磁盘扇区 。
入口参数,( AH) = 4
( AL) =扇区数, ( CH), ( CL) =磁道号, 扇区号
( DH), ( DL) =磁头号, 驱动器号
出口参数:检查成功, ( AH) = 0,( AL) =检验的扇
区数;
检查失败, ( AH) =出错代码 。
第 7章 中断调用程序设计
7.4.2 DOS磁盘存取功能
DOS功能调用中断( INT 21H)提供了两类磁
盘文件管理功能,一类是 FCB表控制方式,另
一类是文件代号式存取方式。
当用户需要打开或建立一个文件时, 必须提供文
件标识符 。 文件标识符用 ASCII Z字符串表示 。
ASCII Z字符串是指文件标识符的 ASCII字符串
后面再加 1个, 0”字符 。 文件标识符的字符串
包括驱动器名, 路径名和文件名 。 其格式为
[d:][path]filename[.exe]
其中 d为驱动器名,path为路径名,.exe为文件名
后缀。
第 7章 中断调用程序设计
1,建立文件 ( 3CH)
功能:按指定文件名建立文件 。
入口参数,( AH) = 3CH,DS,DX指向
ASCII Z字符串的段地址和偏移地址,
( CX) =文件属性 。
出口参数:若操作成功, 则 CF= 0,( AX)
=文件代号;
若操作失败, 则 CF= 1,( AX) =错
误代码 。
第 7章 中断调用程序设计
2,打开文件 ( 3DH)
功能:打开由 ASCII Z串指定的文件 。
入口参数,( AH) = 3DH,DS,DX指向
ASCII Z字符串的段地址和偏移地址,
( AL) =存取方式代码 ( 0:读文件,
1:写文件, 2:读, 写文件 ) 。
出口参数:若操作成功, 则 CF= 0,( AX)
=文件代号;
若操作失败, 则 CF= 1,( AX) =错
误代码 。
第 7章 中断调用程序设计
3,关闭文件 ( 3EH)
功能:关闭文件代号指定的文件 。
入口参数,( AH) = 3EH,( BX) =文件
代号 。
出口参数:若操作成功, 则 CF= 0;
若操作失败,则 CF= 1,( AX)=错
误代码。
第 7章 中断调用程序设计
4,读文件 ( 3FH)
功能:按文件代号读取文件 。
入口参数,( AH) = 3FH,( BX) =文件
代号, ( CX) =要读取的字节数;
DS,DX指向接收数据缓冲区的段地
址和偏移地址 。
出口参数:若操作成功, 则 CF= 0,( AX)
=实际读入字节数, ( AX) = 0,文件
结束;
若操作失败, 则 CF= 1,( AX) =错
误代码 。
第 7章 中断调用程序设计
5,写文件 ( 40H)
功能:按文件代号写文件 。
入口参数,( AH) = 40H,( BX) =文件
代号, ( CX) =要写入的字节数;
DS,DX指向存放写入信息数据缓冲
区的段地址和偏移地址 。
出口参数:若操作成功, 则 CF= 0,( AX)
=写入字节数;
若操作失败, 则 CF= 1,( AX) =错
误代码 。
第 7章 中断调用程序设计
6,取 /置文件属性 ( 43H)
功能:按文件代号写文件 。
入口参数,( AH) = 43H,DS,DX指向 ASCII
Z串的段地址和偏移地址 。
( AL) = 0,取文件属性, ( AL) = 1,置
文件属性;
置文件属性时, ( CX) =新文件属性 ( 低
字节 ) 。
出口参数:若操作成功, 则 CF= 0,若为取属性,
( CX) =文件属性;
若操作失败, 则 CF= 1,( AX) =错误代
码 。
第 7章 中断调用程序设计
【 例 7.4】 在屏幕上显示包括隐含文
件在内的所有文件目录
程序如下,
STACK SEGMENT PARA STACK ‘STACK’
DB 256 DUP( 0) ; ; 256个字节栈
STACK ENDS
DATA SEGMENT PARA PUBLIC ‘DATA’
DIRECTORY DB 3584 DUP( 0) ;存放盘目录区域
NAME COUNT DB 0;文件名计数
ERRMSG DB ‘DISK ACCESS ERROR!!!’
第 7章 中断调用程序设计
DATA ENDS
CODE SEGMENT PARA PUBLIC ‘CODE’
START PROC FAR
ASSUME CS,CODE
PUSH DS ;保留 PSP段址
MOV AX,0
PUSH AX ;保留返回地址偏移
MOV AX,DATA
MOV DS,AX ;建立数据段可寻址性
ASSUME DS,DATA
第 7章 中断调用程序设计
MOV ES,AX ;建立特别段可寻址性
ASSUME ES,DATA
MOV CX,3 ;读盘次数
RETRY,PUSH CX ;保留再试计
MOV BX,OFFSET DIRECTORY ;指向内
存目录存放区
MOV DL,0 ;驱动器号 A
MOV DH,0 ;盘的 0面
MOV CH,0 ; 0道
MOV CL,6 ; 6个扇区
第 7章 中断调用程序设计
MOV AL,7 ;从第 7扇区开始
MOV AH,2 ;读盘功能号
INT 13H ; BIOS 读盘
POP CX ;恢复计数值
JNC READOK; CF=0读盘成功转 READOK
MOV AH,0 ; CF=1置 AH=0
INT 13H ;复位磁盘 BIOS调用
LOOP RETRY;不够三次转 RETRY再试
ERROR,MOV BX,OFFSET ERRMSG;够三
次不成功取出错信息位移
第 7章 中断调用程序设计
CALL DISPLAY ;转子显示错信息
RET ;返回
READOK,MOV CX,112 ;双面双密软盘目录数
NEXT,CMP BYTE PTR[BX],0E5H ;是空目录标志 E5H吗
JZ EMPTY ;是转
PUSH BX ;不是保护 BX
MOV DL,8 ;文件名主名长度
PNAME,MOV AL,[BX] ;取文件名字符
CALL DISPCHAR ;显示
第 7章 中断调用程序设计
INC BX ;下一字符
DEC DL ;字符数减 1
JNZ PNAME ;不够 8个转 PNAME,够顺序执行
MOV AL,’.’
CALL DISPCHAR ;显示主名与扩展名之间的分隔符 ’,’
MOV DL,3 ;扩展名长度
ENAME,MOV AL,[BX] ;取扩展名字符
CALL DISPCHAR ;显示
INC BX
第 7章 中断调用程序设计
DEC DL
JNZ ENAME
POP BX ;恢复 BX
MOV DL,8 ;空格数
BLANK,MOV AL,’ ’
CALL DISPCHAR ;显示文件名间的
DEC DL ; 8个空格
JNZ BLANK
INC NAMECOUNT ;文件名计数增 1
CMP NAMECOUNT,92 ;满屏吗?
第 7章 中断调用程序设计
JNZ EMPTY ;若不,转
MOV AH,0 ;读键盘功能号
INT 16H ; BIOS键盘入,用户击键后继续
MOV NAMECOUNT,0 ;复原计数初值
EMPTY,ADD BX,32 ;指向下一目录项,每项 32个字节
LOOP NEXT ;不够 112个转, 够顺序执行
RET ;返回 DOS
DISPLAY PROC NEAR ;显示信息子程序
MOV CX,30 ;显示字符数
DISP1,MOV AL,[BX] ;取字符
第 7章 中断调用程序设计
CALL DISPCHAR ;转子显示
INC BX
LOOP DISP1 ;做 30次
MOV AL,0DH ;回车
CALL DISPCHAR
MOV AL,0AH ;换行
CALL DISPCHAR
RET ;返回
DISPLAY ENDP
DISPCHAR PROC NEAR ;显示字符子程序
第 7章 中断调用程序设计
PUSH BX ;保护 BX
MOV BX,0
MOV AH,14 ;写功能号
INT 10H ; BIOS 视频功能调用
POP BX ;恢复 BX
RET ;返回
DISPCHAR ENDP
START ENDP
CODE ENDS
END START
返回本节
第 7章 中断调用程序设计
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坐标
第 7章 中断调用程序设计
MOV CX,SCR-LINE ; CX为像素点的 x坐标
CALL DRAW-POINT ;在 ( x,y) 处画点
MOV DX,SCR-COL
MOV CX,SCR-LINE
CALL READ-POINT ;将 ( x,y) 处像素值读出
MOV DX,SCR-COL
MOV CX,SCR-LINE
ADD DX,4 ; x+4为新点的 x坐标
CALL DRAW-POINT ;在 ( x+4,y) 处画点
INC SCR-LINE ;指向下一行
第 7章 中断调用程序设计
INC SCR-COL ;指向右边的下一个点
INC CUR-COLOR ;指向下一种颜色
CMP SCR-LINE,200 ; 200列做完了吗?
JE ENDLINE ;做完了, 结束
JMP AGAIN ;没做完则重复
ENDLINE,RET
MAIN ENDP
DRAW-POINT PROC NEAR
PUSH ES
CALL GET-ADDR ;计算偏移量, 存在 DI中
第 7章 中断调用程序设计
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
READ-POINT PROC NEAR
第 7章 中断调用程序设计
PUSH ES
CALL GET-ADDR ;计算偏移量, 存在 DI中
MOV DX,0A000H
MOV ES,DX ;设显示缓冲区首址的段地址
MOV DX,3CDH
MOV AL,01000000B
OUT DX,AL;设显示缓冲区为线性内存结构
MOV BL,ES,[DI] ;从显示缓冲区读值
POP ES
RET
第 7章 中断调用程序设计
READ-LINT ENDP
GET-ADDR PROC NEAR
PUSH AX
PUSH DX
MOV AX,320 ;每行 320个点
MUL CX ;乘以行号即 y× 320
POP DX
ADD AX,2X ;即计算地址偏移量为 y× 320+x
MOV DI,AX ;偏移量送 DI
POP AX
第 7章 中断调用程序设计
RET
GET-ADDR ENDP
CODE ENDS
END STAR
MOV AH,2
INT 10H
JMP PRT1 ;再输入, 再打印
EXIT,RET PRNTY ENDP
CODE ENDS
END PRNTYP
返回本节
第 7章 中断调用程序设计
本章小结
对外设进行控制, 使用其完成输入 /输
出工作 。 汇编语言能直接控制硬件工作, 因
此成为编写高性能输入 /输出程序最有效的
程序设计语言 。
本章在中断调用指令的基础上详细讲解
了 BIOS中断调用和 DOS系统功能调用的使用
方法 。 分别介绍了键盘, 显示器, 磁盘文件
的输入 /输出方法, 以及两种调用的区别,
并举例说明了常见的输入 /输出程序的编写
方法 。 在今后如果用到中断调用的其他功能,
可以查看有关资料 。
第 7章 中断调用程序设计
Thank you very much !
?本章到此结束,
?谢谢您的光临!
返回本章目录 结 束