79
微微微微微微微 微微微微4 微微微微微微微微 微微微

微型计算机技术

Embed Size (px)

DESCRIPTION

微型计算机技术. 学习辅导( 4 ). 太原广播电视大学 郭建勇. 第四章 汇编语言程序设计基础 4 . 1 循环程序设计 在程序设计中,常常需要一段程序反复执行若干次,这通常用循环的方法来实现,借助几种循环控制指令和前缀可以方便地实现循环。 4 . 1 . 1 基本结构的循环程序 (1) 初始化部分:循环前的准备工作,包括建立指针、设置变量及循环初值等。 (2) 循环体:这是循环程序的工作部分,完成循环的基本操作。 (3) 修改部分:修改参数,包括操作数地址、循环计数值或其他控制变量。 (4) 控制部分:根据对循环条件的判断结果,控制循环的执行或结束。. - PowerPoint PPT Presentation

Citation preview

Page 1: 微型计算机技术

微型计算机技术 学习辅导( 4 )

太原广播电视大学 郭建勇

Page 2: 微型计算机技术

第四章 汇编语言程序设计基础 4 . 1 循环程序设计 在程序设计中,常常需要一段程序反复执行若干次,这通常用循环的方法来实现,借助几种循环控制指令和前缀可以方便地实现循环。 4 . 1 . 1 基本结构的循环程序 (1) 初始化部分:循环前的准备工作,包括建立指针、设置变量及循环初值等。 (2) 循环体:这是循环程序的工作部分,完成循环的基本操作。 (3) 修改部分:修改参数,包括操作数地址、循环计数值或其他控制变量。 (4) 控制部分:根据对循环条件的判断结果,控制循环的执行或结束。

初始化循环体

初始化

修改部分修改部分

循环体循环控制

循环控制

Y

N

N

Y先工作后判断

先判断后工作

Page 3: 微型计算机技术

例:编制一个程序,将 BX 寄存器中的二进制数用十六进制数的形式显示出来。 ( 1 ) BX 寄存器中的二进制数可用 4 位十六进制数显示,故循环次数为 4 ,放入 CH 中。 ( 2 ) BX 循环左移 4 次,最高位数字 移到最低位置; ( 3 ) 0 ~ 9 的数字与 ASCII 码差为 30H ; A ~ F ( 41H ~ 46H )与 ASCII 码差为 37H ;故 0 ~ 9 的数字 +30H ,而 A ~ F 应 +37H 。

开始CX← 循环记数值BX 循环左移 4 次转换为 ASCII 码

> 9 ?+7

显示次数 =0 ?

结束

Page 4: 微型计算机技术

PROGNAM SEGMENT MOV AH , 4CH MAIN PROC FAR INT 21H ASSUME CS : PROGNAM MAIN ENDP START : MOV CH , 4 PROGNAM ENDS ROTATE : MOV CL , 4 ROL BX , CL MOV AL , BL AND AL , 0FH ADD AL , 30H CMP AL , 3AH JL PIRNTIT ADD AL , 07H PIRNTIT : MOV DL , AL MOV AH , 4CH INT 21H DEC CH JNZ ROTATE

Page 5: 微型计算机技术

例:统计某字单元中二进制数位值为 1 的个数,统计结果存放在变量 ONE 中。 DATA SEGMENT NUM DW 1669H FINI : MOV AH , 4CH ONE DB ? INT 21H DATA ENDS CODE ENDS CODE SEGMENT END START ASSNUM CS : CODE DS : DATA START : MOV AX , DATA MOV DS , AX MOV AX , NUM COMP : CMP AX , 0 JZ FINI SHL AX , 1 JNC COMP INC ONE JMP COMP

开始AX←NUM

AX=0 ?AX 左移一位

CF=1 ?ONE+1

结束Y

Y

Page 6: 微型计算机技术

4 . 1 . 2 多重循环程序 一个计算过程可能要依赖几个互相独立变化的参数,这就需要在一个循环过程中再包含一个循环过程,形成外层循环嵌套内层循环的结构形式,这种程序就称为多重循环程序。 多重循环程序设计的基本方法和单重循环程序设计是一致的,应分别考虑各层循环的控制条件及其程序实现,相互之间不能混淆。另外要注意在每次通过外层循环再次进入内层循环时,初始条件必须重新设置。 例:有一个首地址为 A 的 N 字数组,请编制程序使该数组中的数按照从小到大的次序排列(整序)。 采用起泡排序算法实现整序:从第一个数开始依次对相邻两个数 Ki 和 Ki 十 l进行比较,若 Ki ≤ Ki 十 l , Ki 的位置不动, Ki 十 l 继续和 Ki 十 2 比较;若 Ki > Ki 十 1 ,则两者交换位置。 Ki 十 1 (交换前的 Ki) 继续和 Ki 十 2比较。 可以看出,在第一遍比较了 N-1 次后,最大的数已经放到了最后,所以在第二遍时,只需比较 N-2 次,同样道理,第三遍只需比较 n-3 次…。如果有N 个数,最多要比较 n-1 遍。

Page 7: 微型计算机技术

序号 数 比较遍数 1 2 3 4 比较次数 1 2 3 4 1 2 3 1 2 1 1 32 32 32 16 16 15 15 8 8 2 85 85 16 16 32 15 15 16 8 8 15 15 3 16 16 85 15 15 15 32 8 8 8 16 16 16 4 15 15 85 8 8 8 32 32 32 32 5 8 8 85 85 85 85 85 第一遍 比较 5-1=4 次 挑出最大数 85 第二遍 比较 5-2=3 次 挑出第二大数 32 第三遍 比较 5-3=2 次 挑出第三大数 16 第四遍 比较 5-4=1 次 挑出第四大数 15 完成整序

Page 8: 微型计算机技术

开始置外循环次数 N-1

置内循环次数 N-1

I=0

KI≤KI+1 ?

CNUNT2-1

=0 ?

=0 ?CNUNT1-1

结束

KI←→KI+1

I=I+1

N

N

N

Page 9: 微型计算机技术

DSEG SEGMENT N EQU 5 A DW 5 DUP (?) DSEG ENDS CSEG SEGMENT MAIN PROC FAR ASSUME CS : CSEG , DS : DSEG START : MOV AX , DSEG MOV DS , AX NUM : ADD SI , 2 MOX CX , N LOOP LOOP2 DEC CX MOV CX , DX LOOP1 : MOV DX , CX LOOP LOOP1 MOV SI , 0 MOV AH , 4CH LOOP2 : MOV AX , A[SI] INT 21H CMP AX , A[SI+2] MAIN ENDP JLE NUM XCHG AX , A[SI+2] CSEG ENDS MOV A[SI] , AX END START

Page 10: 微型计算机技术

4 . 2 分支程序设计 4.2.1 分支程序结构

两路(单重)分支结构 多路(多重)分支结构 这两种结构都要求先对条件进行判定,然后根据判定结果确定执行哪路分支,判定一次只能有一路分支被选择。一般来讲一个条件两路分支; N 个条件, 2N路分支。

判定条件 判定条件

A B A B X

Y

N

Page 11: 微型计算机技术

4.2.2 分支程序的设计方法 分支程序的实现方法有多种,最常用的方法有:利用比较和条件转移指令实现分支, 利用逻辑尺控制分支,以及利用地址跳转表实现分支等方法。 例: X/2 X< 0 Y= 2 X=0 2X X > 0 这个问题可以通过 X 与 0的比较,利用条件转移指令来确定三个计算分支中的某一支。 MOV AL , X CMP AL , 0 JL M1 JZ M2 SAL AL , 1 JMP NEXT M1 : SAR AL , 1 JMP NEXT M2 : MOV AL , 2 NEXT : MOV X , AL

AL←X

X< 0 ?AL÷2 X=0 ?

AL←2 AL×2

X←AL

Y N

Y N

Page 12: 微型计算机技术

利用逻辑尺控制分支也是常见的一种分支程序设计方法。例:编写一个显示程序,要求显示 A 和 B共 8次,显示次序为 A3 次, B2 次, A1 次, B2 次。因此,可设计一个逻辑尺: 00011011 , 0 表示显示 A , 1表示显尔 B 。编程时,逐值测试逻辑尺,是 0则执行显示 A 的分支,是 l 则执行显示 B 的分支。部分程序如下: .. .. .. MOV CX , 8 MOV BL, 00011011B LOP: SHL BL, 1 JC M1 CALL AA1 JMP NEXT M1 : CALL BB1 NEXT: LOOP LOP HLT

CX← 次数BL←逻辑尺逻辑尺左移一位

=1 ?执行 A执行 B

Y N

CX-1=0 ?N分支程序设计时要注意各个分支一定要转入到公共操作上。本例和上例中的橙色框。

Page 13: 微型计算机技术

利用地址跳转表的方法主要用于多路分支 (三路分支以上 ) 的情况,下面通过一个实例来说明这种程序设计方法。 在调用 DOS 文件管理功能时,如出现了错误 (如使用了非法功能号 ) , DOS 则根据 AX 中的错误码,将相应的错误信息显示出来。 (AX)= 1 ~ 5各表示一种错误,其错误信息分别为 ERl ~ ER5。 AX除 l ~ 5之外的数码是无效的。 ( 1 )错误信息提示的地址 分别为 ERl ~ ER5。 ( 2 ) ERl ~ ER5构成跳 转表,表首地址为 ERTAB 。 ( 3 )表中各项的地址为 表首址 +(功能号 -1 )×2

1号错误提示2号错误提示3号错误提示4号错误提示5 号错误提示

ER1

ER2

ER3

ER4

ER5

ER1

ER2

ER3

ER5

ER4

ERTAB

ERTAB+2

ERTAB+4

ERTAB+6ERTAB+8

Page 14: 微型计算机技术

DATA SEGMENT CMP AX , 5 OUTR DB “非 1 ~ 5 $” JG OUTR ;≥ 5转至 OUTR ER1 DB “错误 1提示$” CMP AX , 1 ER2 DB “错误 2提示$” JGE TADR ; 1 ~ 5转 TADR ER3 DB “错误 3提示$” OUTR: LEA DX , OUTR ER4 DB “错误 1提示$” JMP DISPM ;转至DISPM ER5 DB “错误 1提示$” TADR: MOV BX , AX EVEN DEC BX ERTAB DW ER1 , ER2 , ER3 SHL BX , 1 DW ER4 , ER5 MOV DX , ERTAB[BX] DATA ENDS DISPM: MOV AH , 9 CODE SEGMENT INT 21H SHOWERR PROC FAR POP BX ;恢复现场 ASSUME CS: CODE , DS: DATA POP DX MOV SI , DATA POP AX MOV DS , SI REG PHSU AX ;保护现场 SHOWERR ENDP PUSH DX CODE ENDS PUSH BX END

Page 15: 微型计算机技术

4.3 子程序设计 子程序又称为过程,在程序实现中,如果要多次用到一些功能相同的程序段,那么就可以用伪操作 PROC和 ENDP把这些程序段定义成子程序。需要时用 CALL指令来调用它,调用程序也称为主程序。 子程序有两种属性: NEAR(缺省的属性)和 FAR。和调用程序在同一代码段中的子程序使用 NEAR属性,和调用程序不在同一代码段中的子程序使用 FAR属性。 4.3.1 主程序与子程序之间的参数传送 主程序在调用子程序时,需要传送一些参数(入口参数)给子程序,子程序运行完后也要将运行结果(出口参数)回送给主程序。 利用寄存器传送参数 传送参数的方式: 利用存储区传送参数 利用堆栈传送参数 1 .利用寄存器传送参数 这种参数传送的方式方便、快速,但只适合传送参数较少的情况。 例:编写程序,将一个 16位二进制数转换成用 ASCII 表示的十进制数。 这是一个常用的转换子程序,应提供给所有的用户调用。因此,要将该子程序的人口参数和出口参数注释清楚,方便调用。

Page 16: 微型计算机技术

本例是通过 DX 和 DI寄存器传递参数的。 DATA SEGMENT OUTB DB 5 DUP ( 30H) N EQU 12345H DATA ENDS COND SEGMENT ASSUME CS: CODE , DS: DATA START: MOV AX , DATA MOV DS , AX MOV DX , N ;入口参数 LEA SI , OUTB ;入口参数 CALL BIN-TO-ASC ;调子程序 MOV AX , 4C00H INT 21H

Page 17: 微型计算机技术

入口参数: DX = 被转换数 DI = 结果单元首地址 出口参数: DI = ASCII 码结果单元首地址 BIN-TO-ASC PROC PUSH CX ;保护现场 POP DI;恢复现场 PUSH AX POP AX PUSH DI POP CX ADD DI , 4 ;指向最低位 RET BINAO : MOV AX , DX BIN-TO-ASC ENDP MOV DX , 0 CODE ENDS MOV CX , 10 END START DIV CX ;÷10 XCHG AX , DX ;商←→余数 ADD AL, 30H ;转换 ASCII码 MOV [DI], AL ;存结果 DEC DI ;修改指针 CMP DX , 0 JNZ BINA0 ;≠ 0,转 BINA0

本例中, N 为二进制数,先除10 ,余数为个位,或 30H 变为ASCII 码;再对商除 10 ,余数为十位,或 30H 变为 ASCII 码;直至商为 0 。

Page 18: 微型计算机技术

2 .利用存储区传送参数 参数存放在存储区中,入口参数为存储区首地址。适合参数较多的情况。 例: TABLE 数组中存有 15个十进制数,挑出最大数存放在MAX 单元中。 DATA SEGMENT FOUNT PROC TABLE DB 4 , 6, 8, 4 , 9… MOV AL , [SI] N EQU 15 DEC CX MAX DB ? INC SI DATA ENDS LOP : CMP AL , [SI] CODE SEGMENT JG L1 ASSUME CS; CODE , DS: DATA MOV AL , [SI] START: MOV AX , DATA L1 : INC SI MOV DS , AX LOOP LOP MOV CX , N FOUNT ENDP LEA SI , TABLE ;入口参数 CODE ENDS CALL FOUNT END START MOV MAX , AL MOV AH , 4CH INT 21H

Page 19: 微型计算机技术

3. 利用堆栈传送函数 利用堆栈适合于传送参数多,而且子程序有嵌套、递归调用的情况。主程序将参数或参数地址推入堆栈,子程序从堆栈中取出参数或参数地址。利用堆栈传送涵数一定要注意堆栈的变化,如果参数和返回地址混淆,会造成子程序不能正确返回的错误。 例:调加密子程序将数组中的数据 Aj 加密。秘约规则为 Aj×2 ,再各位求反。 DSEG SEGMENT START: MOV AX , DSEG N EQU 20 MOV DS , AX ARAY DW N DUP(?) MOV AX , SSEG DSEG ENDS MOV SS , AX SSEG SEGMENT LEA SP , TOP ;指定栈底 DW 64 DUP(?) LEA BX , ARAY TOP LABEL WORD PUSH BX ;首地址入栈 SSEG ENDS MOV BX , N ;个数入栈 CSEG SEGMENT PUSH BX ASSUME CS: CSEG, CALL ECRY SS: SSEG, MOV AX , 4C00H DS: DSEG INT 21H

Page 20: 微型计算机技术

ECRY PROC POP BX PUSH BP ;用 BP取 POP AX MOV BP , SP ;入口参数 POP BP PUSH AX ;保护现场 RET 4 PUSH BX ECRY ENDP PUSH CX CSEG ENDS PUSH SI END START MOV SI , 0 MOV CX , [BP+4];取入口参数 MOV BX , [BP+6] DONE :MOV AX , [BX+SI] SHL AX , 1 XOR AX , 0FFFFH ADD SI , 2 LOOP DONE POP SI ;恢复现场 POP CX 保护现场后 恢复现场后

SICXBXAXBP

个数 N首地址栈底

BP 返回地址首地址返回地址个数 N

栈底

SPMOV BP , SP

Page 21: 微型计算机技术

4.4 I / O 程序设计 信息交换 地址端口 : 地址信息 主机 I/O接口 数据端口 : 状态信息 状态端口 : 数据信息 4.4.1 直接控制 I / O 的程序设计 1 . I / O端口 在 80x86微机中, I / O端口编址在一个独立的地址空间中,这个 I / O空间允许设置 64K(65536) 个 8位端口或 32K(32768) 个 16位端口。 2 . I / O 程序举例 对于 I/ O 和存储器分离的地址空间系统, 80x86有专门的 I / O 指令与端口进行通信。下面通过几个 I / O 程序的例子,说明使用 I / O 指令直接在端口级上输入输出的方法。 输入指令 输出指令 IN AN , 30H OUT 30H , AL IN AX , 40H OUT 40H , AX IN AL, DX ; DX←16位端口地址 OUT DX , AX ; DX←16位端口地址 IN AX , DX ; DX←16位端口地址 OUT DX , AX ; DX←16位端口地址

Page 22: 微型计算机技术

例: SOUND程序。 程序通过 I / O 指令使设备控制寄存器 (1/ O端口地址为 61H) 的第 1 位交替为 0和 l ,而 61H端口的第 l 位和扬声器的脉冲门相连,交替为 0和 l 的脉冲电流被放大后送到扬声器使之发出了声音。 7 6 5 4 3 2 1 0

SOUND PROC PUSH AX PUSH DX MOV DX , 1000 IN AL , 61H DEC DX AND AL , 11111100B JNZ TRIG TRIG: XOR AL , 00000010B POP DX OUT 61H , AL POP AX MOV CX , 6000 RET DELAY: LOOP DELAY SOUND ENDP

1/0

与门 放大器

端口 61H

本例中 CX=6000它决定发声频率值小声音尖锐,值大声音低沉。DX=1000决定发声时间长短。

Page 23: 微型计算机技术

例: PRT—CHAR程序。 这是一个采用查询方式的打印字符程序。程序通过反复渎取并测试打印机的状态来控制输出。在打印机接口中,数据寄存器的端口地址为 378H,状态寄存器的端口地址为 379H,控制寄存器的端口地址为 37AH。 7 6 5 4 3 2 1 0 忙位( 0=忙) 未用 应答( 0=可接受) 打印出错( 0=出错) 纸出界( 1=出界) 联机状态( 1=联机) 7 6 5 4 3 2 1 0

未用 选通( 1=输出数据) 工作方式 自动换行( 1=换行) ( 0=禁止中断方式) 初始化( 1=正常) 选择位( 1=接通)

状态寄存器端口 379H

控制寄存器 端口 37AH

Page 24: 微型计算机技术

DATA SEGMENT MOV DX , 37AH MESS DB ‘PRINTER IS NORMAL’ MOV AL, 0DH ;选通输出 COUNT EQU $ -MESS OUT DX , AL DATA ENDS MOV AL, 0CH CSEG SEGMENT OUT DX , AL ASSUME CS: CSEG, DS: DATA INC SI START: MOV AX , DATA LOOP NEXT MOV DX , AX MOV AH, 4CH LEA SI,MESS ;建地址指针 INT 21H MOV CX , COUNT; CX←次数 CSEG ENDS NEXT: MOV DX , 379H ; DX←状态地址 END START WAIT: IN AL, DX ; AL←状态端口 TEST AL, 80H ;测忙否 JZ WAIT ;忙( =0)再测 MOV AL, [SI] ;不忙,输出 MOV DX , 378H ; DX←数据地址 OUT DX , AL

TEST 指令测状态寄存器的第 7位,为 0表示忙,循环再测,直至为 1空闲时,再取字符输 出打印。称为查询方式。 0DH 为控制寄存器选通信号,

0CH 为结束选通。

Page 25: 微型计算机技术

又例: CPU要从 3 个设备轮流输人数据, PROCl , PROC2 , PROC3 分别是设备 l ,设备 2 和设备 3 的数据输入程序,它们的状态寄存器的端口地址分别用 STAT1 , STAT2 , STAT3表示,这三个状态寄存器的 5位是输入准备位。轮流查询三个数据输入设备的程序段: INPUT: IN AL , STAT1 ; AL←状态寄存器 1 TEST AL , 20H ;输入准备好? JZ DEV2 ;否,转 DEV2 CALL FAR PTR PROC1 ;准备好,调PROC1 DEV2 : IN AL , STAT2 TEST AL , 20H JZ DEV3 CALL FAR PTR PROC2 DEV3 : IN AL , STAT3 TEST AL , 20H JZ NO-INPUT CALL FAR PTR PROC1 NO-INPUT:……

查询方式的优点:可以安排优先次序,最先查询的设备优先级最高。修改查询次序就修改了设备的优先级。缺点:查询等待浪费CPU的时间,在设备多时由询问转向处理程序的时间较长。

Page 26: 微型计算机技术

4.4.2 中断程序设计 中断是一种使 CPU中止正在执行的程序而转去处理特殊事件的操作,引起中断的事件称为中断源。 中断是 CPU和外部设备进行输入/输出的有效方法。可以避免因反复查询外部设备的状态而浪费时间,从而提高 CPU的效率。 中断源分为软件中断 ( 或称内中断 ) 和硬件中断 ( 或称外中断 ) ,系统通过分配给这些中断的类型号来加以识别和处理。

80x86中断源及其中断类型号

IR0 8259A IR1 可编程 IR2 中断 IR3 控制器 IR4 ( PIC) IR5 IR6 IR7

08系统定时器09键盘0A彩色 /图形0B串行 COM20C串行 COM10D LTP2 控制0E磁盘控制器0F LTP1 控制

非屏蔽中断请求

中断逻辑

INTn指令 单步TF=1

除法错误INT0指令

INTRNMI2

4 0 1n

CPU

Page 27: 微型计算机技术

1. 软件中断的执行 (1) 中断指令 INT n的执行。 CPU执行一条 INTn指令时,中断系统立即产生类型为 n的中断,并且通过中断向量调用相应的中断处理程序来完成其中断功能。 (2)处理CPU某些错误的中断。 除法错中断:在执行除法指令时,若发现除数为 0或商超过了寄存器所能表达的范围,则立即产生一个类型为 0的中断。 溢出中断:有一条专门的指令 INTO 来中断发生溢出的算术操作。如果 OF= 1 , INTO 指令引起中断,如 OF:= 0,则不发生中断, CPU继续运行原程序。溢出中断的类型号为 4 。 (3) 为调试程序没置的中断。 单步中断:单步是一种很有用的调试方法。当标志位 TF设置为 l 时,每条指令执行后, CPU自动产生类型号为 1 的单步中断。 断点中断:断点可以设置在程序的任何地方,设置断点实际上是把一条断点指令 INT3插入程序中, CPU每执行到断点处的 INT3 指令便产生一个中断。 INT指令和 INTO 指令产生的中断。以及除法错中断都不能被禁止,并且比任何外部中断的优先权都高。

Page 28: 微型计算机技术

2 .硬件中断的执行 硬件中断:非屏蔽中断 (NMI) 外部设备的请求引起的可屏蔽中断。 CPU响应中断的条件:该外设的中断请求是否屏蔽:中断屏蔽寄存器 (IMR) CPU是否允许响应中断:标志寄存器中断允许位 IF 中断屏蔽寄存器 (IMR) 的 I / O端口地址是 21H。通过设置这个寄存器的某位为 0 允许中断;为 1禁止(屏蔽)中断。 中断屏蔽寄存器 7 6 5 4 3 2 1 0 ( I/O端口 20H) 打 软 硬 串 串 保 键 定 印 行 行 时 机 盘 盘 通 通 留 盘 器 信 信 例:只允许键盘中断,可设置如下中断屏蔽字: MOV AL , 11111101B ; AL←中断屏蔽字 OUT 21H , AL ;送入中断屏蔽寄存器 IMR

Page 29: 微型计算机技术

如果系统增设键蛊中断,则可用下列指令实现: IN AL , 21H ;取中断屏蔽字 AND AL , 11111101B ;将第 1 为置 0,保留其余位不变 OUT 21H , AL ;回送 21H端口 中断标志位 IF的设置: STI ;设置中断允许位 (IF = 1) ,允许中断(开中断) CLI ;清除中断允许位 (1F = 0) ,禁止中断(关中断) 中断命令寄存器 7 6 5 4 3 2 1 0 ( I/O端口 20H) 中断命令寄存器: EOI是中断结束位,当 EOI为 1 时,当前正在处理的硬件中断请求就被清除,所以在中断处理完成后,必须把中断结束位置为 1 。 结束硬件中断用下面的指令: MOV AL , 20H ; 20H = 00100000B ,置 EOI为 1 OUT 20H , AL ;

R SL EOI 0 0 L2 L1 L0

Page 30: 微型计算机技术

3. 中断操作步骤 8086 / 8088中断系统能处理 256种类型的中断,类型号为 0~ 0FFH。中断向量表是各类型中断处理程序的人口地址表。中断向量的地址可由中断类型号乘以 4 计算出来。 以 BIOS中断 INT 4AH为例, 表示出中断操作的以下 5个步骤: ①取中断类型号; ⑦计算中断向量地址; ③取中断向量,偏移地址 送 IP,段地址送CS; ④转人中断处理程序; ⑤中断返问到 INT指令的 下一条指令。

类型 49H中断向量0518

F000

类型 4BH中断向量

0 :1280 :1290 : 12A0 :12B

0 :124

INT 4AHMOV CX , 30H向量地址=4AH×4=128

STI PUSH DS

IRET

1805

F000

IP

CS

中断处理程序F000 : 1805

④⑤

采用向量中断可加快CPU 中断处理速度。

Page 31: 微型计算机技术

利用保留的中断类型号扩充中断功能,需要在中断向量表中建立相应的中断向量。为中断类型 N 设置中断向量的方法: MOV AX , 0 MOV ES , AX MOV BX , N﹡4 MOV AX , OFFSET INHAND MOV ES :WORD PTR [BX] , AX MOV AX , SEG INHAND MOV ES :WORD PTR[BX+2] , AX INHAND:

IRET

中断向量表

子程序IRET

INHAND

( BX ) = N4﹡( BX )+2

OFFSET INHAND

SEG INHAND

0 :0000

IPCS①

① ②

Page 32: 微型计算机技术

用自己编写的中断处理程序代替系统中的某个中断处理功能时: ( 1 )利用 DOS 功能调用 (21H)保存原中断向量 ( 2 )设置新的中断向量; ( 3 )在程序结束之前恢复原中断向量 设置中断向量的 DOS 功能调用 把由 AL指定的中断类型的中断向量 DS: DX 放在中断向量表中. 预置: AH= 25H AL =中断类型号 DS: DX=中断向量 执行: INT 21H 取中断向量的 DOS 功能调用 把由 AL指定的中断类型的中断向量从中断向量表中取到 ES: BX 中 预置: AH = 35H AL =中断类型号 执行: INT 21H 例:使用 DOS功能调用存取中断向量。

Page 33: 微型计算机技术

MOV AL , N ; MOV AH , 35H ; INT 21H ; PUSH ES PUSH BX PUSH DS MOV AX , SEG INTNAND MOV DS , AX MOV DX , OFFSET INTHAND MOV AL , N MOV AH , 25H POP DS

利用功能号 35H的 DOS 功能调用把 N类型的中断向量取到 ES: BX 中,进行压栈

保存。

新的中断向量 DS: DX利用功能号 25H的 DOS 功能调用存入到中断向量表中。中断类型为 N 。

Page 34: 微型计算机技术

POP DX ; POP DS ; MOV AL , N MOV AH , 25H INT 21H RET INTHAND:

IRET

将原来压栈保护的中断向量弹出到 DS: DX 中,利用功能号 25H的 DOS 功能调用再存入到中断向量表中。

INTHAND 是新的中断服务子程序的入口符号地址。

Page 35: 微型计算机技术

4 .中断过程 中断过程: 1. 保存返回地址 CS: IP、 保存标志寄存器 FLAGS。 2.CPU还自动清除 IF位和 TF位,目的是使 CPU转人中断 处理程序后, 不允许再产生 新的中断。 3.转入中断服务程序。

IRET

中断服务

1.FKAGS、 CS、 IP入栈2. 清除 IF、 TF3.转中断处理程序 INTHAND

产生中断

1.IP、 CS和 FLAGS出栈2. 返回断点,继续执行下一条指令。

中断返回

Page 36: 微型计算机技术

5.中断优先级 中断优先级: CPU根据中断源的轻重缓急为中断源事先安排的中断优先级次序。 当多个中断源同时向CPU请求中断时, CPU先比较它们的优先级,然后从优先级高到优先级低的次序来依次处理各个中断源的中断请求。 8086 规定中断的优先级次序为: 优先级高 软件中断 (除法错, INTO , INT) 非屏蔽中断 (NMI) 可屏蔽中断 (INTR) 低 单步中断 可屏蔽中断的优先权又分为八级,在正常的优先级方式下,优先级次序是: 优先级高 低 IR0, IR1 , IR2 , IR3 , IR4 , IR5, IR6, IR7

Page 37: 微型计算机技术

4.4.3 中断程序设计举例 中断处理程序的编写应注意: ( 1 )中断处理程序若不允许被打断,则清除 IF和 TF,若允许其他设备中断,则需用 STI指令把 IF位置 1 。 ( 2 ) CPU产生一次中断, I / O 设备只完成一个字节 ( 或字 ) 的输入/输出,所以中断处理程序所用的指针变量或数据变量一般应设置存储单元来保存。 ( 3 )硬件设备的中断处理结束后,一般要发出中断结束命令 (E0I) 。否则将屏蔽同级或低级的中断。 例:编写一个中断处理程序,要求在主程序运行过程中,每隔 10s 响铃一次,同时在屏幕上显示出信息“ The bell is ring!”。 本例中用新设计的处理程序来代替原有的 1CH中断程序,为此: 在主程序的初始化部分,先保存当前 1CH的中断向量,再设置新的中断向量。 在主程序的结束部分恢复保存的 1CH中断向量。

Page 38: 微型计算机技术

SCATK1 SEGMENT PARA STACK DW 100 DUP (?) STACK1 ENDS DATA SEGMENT COUNT DW 1 MSG DB ‘The bell is ring’,0dh,0ah,’$’ DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS : CODE , DS : DATA , SS : STACK1 START : MOV AX , DATA MOV DS , AX MOV AL , 1CH ;取功能号 1CH 的中断向量压栈保存 MOV AH , 35H INT 21H PUSH ES PUSH BX PUSH DS

Page 39: 微型计算机技术

MOV DX , OFFSET RING ;子程序入口地址的偏移量送 DX MOV AX , SEG RING ;子程序入口地址的段基值送 DS MOV DS , AX ;中断向量送 DS : DX MOV AL , 1CH MOV AH , 25H INT 21H POP DS POP DX POP DS STI MOV AL , 1CH

MOV DI , 20000 MOV AH , 25 DELAY : MOV SI , 30000 INT 21HDELAY1 : DEC SI MOV AH , 4CH JNZ DELAY1 INT 21H DEC DI MAIN ENDP JNZ DELAY

IN 21H AND AL , 11111110B

OUT 21H , AL

设置时钟中断

延时

Page 40: 微型计算机技术

RING PROC NEAR SOUNT: XOR AL , 02H PUSH DS OUT 61H , AL PUSH AX MOV CX , 1400H PUSH CX WAIT1 : LOOP WAIT1 PUSH DX DEC DX MOV AX , DATA JNZ SOUNT MOV DS , AX MOV COUNT , 182 STI ;开中断 EXIT: CLI ;关中断 DEC COUNT MOV AL , 20H JNZ EXIT OUT 20H , AL MOV DX , OFFSET MSG POP DX MOV AH , 09H POP CX INT 21H POP AX MOV DX , 100 POP DS IN AL , 61H IRET AND AL , 0FCH RING ENDP END START

显示提示语

响铃程序

EOI=1清除中断请求

保护寄存器

恢复寄存器

Page 41: 微型计算机技术

4.5 BIOS和 DOS基本调用 在存储器系统中从地址 0FE000H开始的 8K ROM(只读存储器 ) 中装有 BIOS例行程序:系统加电自检、引导装入、主要 I / O 设备的管理程序以及接口控制等功能模块来处理所有的系统中断。 使用 BIOS 功能调用,给程序员编程带来很大方便。 DOS提供了一组系统功能调用子程序:包括 I / O 设备处理程序、文件管理程序和一些其他的处理程序。 DOS操作比相应功能的 BIOS操作更简易,而且对硬件的依赖性更少些。 BIOS中断类型 CPU中断类型 0 除法错 1 单步 2 非屏蔽中断 3 断点 4 溢出 5 打印屏幕 6 保留 7 保留 8259中断类型 8 系统定时器 (IRQ0) C COM1 控制器 (IRQ4) 9 键盘 (IRQ1) D I‘PT2 控制器 (IRQ5) A 彩色/图形接口 (IRQ2) E 磁盘控制器 (IRQ6) B COM2 控制器 (IRQ3) F LPT1 控制器 (1RQ7)

Page 42: 微型计算机技术

BIOS中断类型 10 显示器 I / O 11 取设备信息 12 取内存容量 13 磁盘 I / O 14 RS—232串行口 I / O 15 磁带 I / O 16 键盘 I / O 17 打印机 I / O 18 ROM BASIC 19 引导装入程序 1A 时钟 40 软盘 BIOS 用户应用程序 1B 键盘终止地址 (Ctrl-Break) 1C 定时器 4A 报警 ( 用户闹钟 ) 数据表指针 1D 显示器参数表 41 0﹟硬盘参数表 1E 软盘参数表 46 1﹟硬盘参数表 1F 图形字符扩展码 49 指向键盘增强服务变换表

Page 43: 微型计算机技术

DOS中断类型 20 程序终止 27 结束并驻留内存 21 功能调用 28 键盘忙循环 22 终止地址 29 快速写字符 23 Ctrl-C 中断向量 2A 网络接口 24 严重错误向量 2E 执行命令 25 绝对磁盘读 2F 多路转接接口 26 绝对磁盘写 30~ 3F 保留给DOS DOS功能与 BIOS 功能都通过软件中断调用。 基本步骤: (1) 将调用参数装入指定的寄存器中; (2)如需功能号,把它装入 AH; (3)如需子功能号,把它装入 AL; (4) 按中断号调用 DOS或 BIOS中断; (5)检查返回参数是否正确。

Page 44: 微型计算机技术

4.5.1 键盘 I / O 键盘由三种基本类型的键组成: (1) 字符数字键,如字母 A(a) 一 Z(z) ,数字 0—9以及%、$, #等常用字符。 (2)扩展功能键,如Home, End, Backspace, Arrows, Return, Delete, Insert, PgUp, PgD,以及程序功能键 F1 一 F10等。 (3) 和其他键组合使用的控制键,如 A1t, Ctrl 和 Shift等。 字符数字键— ASCII码字符; 扩展功能键产生一个动作 :如按下Home键能把光标移到屏幕的左上角,End键使光标移到屏幕上文本的末尾; 组合控制键改变其他键所产生的字符码。 1 .字符码与扫描码 键盘上的每个键都对应一个扫描码,根据扫描码就能唯一地确定哪一个键改变了状态。 字符码是每个键代表的字符和符号的 ASCII码(祥见教材 P150页表 4.6)

Page 45: 微型计算机技术

2 . BIOS 键盘中断 BIOS 键盘中断( INT 16H)的中断处理程序包括 3 个不同的功能: AH 功 能 返 回 参 数 0 从键盘读一字符 AL=字符码, AH=扫描码 1 读键盘缓冲区的字符 如ZF=0, AL=字符码, AH=扫描码 ZF=1 ,缓冲区空 2 取键盘状态字节 AL= 键盘状态字节 调用方法: ( 1 )功能号送入 AH ( 2 )执行 INT 16H 的 BIOS中断 例如,要查看按键的扫描码和 ASCII码,可以调用中断类型 16H的 0 功能。 MOV AH , 0 ; AH←功能号 0, INT 16H MOV BX , AX ;( AX ) =( BX ) = 扫描码和 ASCII码 CALL BINHEX ;调用二进制转换十六进制的子程序

Page 46: 微型计算机技术

键盘上不具有 ASCII码的键,如Shift、 Ctrl 、 Alt、 Num Lock、 Scro11 、 Ins和 Caps lock等,按动了它们能改变其他键所产生的代码。是通过键盘状态字节进行判断按动与否。

1=按下右移键R SHIFT 1=按下左移键 L SHIFT 1=按下控制键CTRL 1=按下交替键 ALT 1=SCOLL LOCK状态已变 1=NUM LOCK状态已变 1=CAPS LOCK状态已变 1=INSERT状态已变

键盘状态字节 KB-FLAG

Page 47: 微型计算机技术

例:读取键盘状态字节,并以十六进制打印出来。 MOV AH,02H INT 16H ; BIOS 16H 中断 MOV BX , AX ;( AX ) =( BX ) = 键盘状态字节 CALL BINIHEX ;转换十六进制打印 MOV DL , 0DH ;显示 CR字符( 02号DOS功能调用) MOV AH , 02H AGAIN :MOV AH , 02H ;功能号 02H→AH INT 21H JMP AGAIN

Page 48: 微型计算机技术

3 . DOS键盘功能调用 DOS 键盘操作( INT 21H 功能调用) AH 功 能 调用参数 返回参数 1 输入一个字符并显示 AL=字符 (检测Ctrl-C或 Ctrl-break,并调用 INT 23H结束程序) 6 读键盘字符,不回显 DL=0FFH 有字符, AL=字符, ZF=0 无字符, AL=0 , ZF=1 7 输入一个字符不显示 AL=字符 (不支持检测Ctrl-C或 Ctrl-break) 8 输入一个字符不显示 AL=字符 (检测Ctrl-C或 Ctrl-break,并调用 INT 23H结束程序) A 输入字符到缓冲区 DS: DX ;缓冲区首址 B 读键盘状态 AL=0FFH 有键入 AL=00H 无键入 C 清除键盘缓冲区 AL= 键盘功能号 调用一种键盘功能 ( 1 、 6、 7、 8、 A )

Page 49: 微型计算机技术

(1) 单字符输入 交互程序中常常需要用户对一个提示做出应答,例如,程序显示出一串信息,要求你回答 Y或 N ,回答 Y,程序将转入标号为 YES的程序段,而回答 N 使程序转入标号为 NO 的程序段,按下其他键程序就等待。 GET-KEY: MOV AH , 1 ; AH←功能号 1 INT 21H CMP AL ,’ Y’ ;是 Y吗? JE YES ;是 Y,转程序 YES CMP AL ,’ N’ ;是 N吗? JE NO ;是 N ,转程序 NO JNE GET-KEY ;等待输入 Y或 N 如果想检测 Enter(Return)键,就要在指令中写出它的 ASCII码 0DH,例如: WAIT-HERE : MOV AH , 7 ;检测键,但不显示或不执行 INT 21H CMP AL , 0DH ;是 Enter 吗?( 0DH回车键的 ASCII码) JNE WAIT-HERE

Page 50: 微型计算机技术

要求程序能接收功能键或数字组合键必须进行两次 DOS 调用,第一次回送00,第二次回送扫描码。例如,程序显示出一个菜单,要求用户通过键入 F1 ,F2 或 F3 来选择 1 , 2 或 3项,按其他键则产生错误信息。 例:检测键盘输入的功能键 MOV AH , 7 INT 21H ;第一次回送 00 CMP AL , 0 JE GET-EC ;为 0,功能键 JMP ERROR ;非 0,转错误信息 GET-EC: MOV AH, 7 INT 21H CMP AL , 3BH ; F1 ? JE OPTION1 CMP AL , 3CH ; F2 ? JE OPTION2 CMP AL , 3DH ; F3 ? JE OPTION3 JMP ERROR ;都不是,转错误信息

Page 51: 微型计算机技术

(2)输入字符串 中断 21H的 A功能从键盘读入一串字符并把它存人用户定义的缓冲区中。缓冲区的第一个字节为预输入数,第二个字节为实际输入数,第三个字节起是输入的字符串,最后一个为回车( 0DH)。例如: LAMLEN DB 32 ACTLEN DB ? STRING DB 32 DUP(?) ;建立缓冲区 执行输入字符串的指令: LEA DX MAXLEN MOV AH , 0AH INT 21H 假定输入字符串为: ABCDEFGH ……XYZ↙的缓冲区:

实际输入字符数 26( 1AH) 预定输入字符数

20H1AH A B C D E F G X Y Z ↙

CX← 实际字符数 DS : DX 指向第一个字 符可用如下指令: SUB AH , AH

MOV AL , LAMLEN+1 ADD DX , 2

Page 52: 微型计算机技术

(3)清除键盘缓冲区 0CH功能:清除键盘缓冲区,再执行 AL指定的( 1 、 6、 7、 8、 AH)功能。 例如: MOV AH , 0CH ;清除以前键入的字符 MOV AL , 08H ;再执行 08 号功能 INT 21H 可以避免由于偶然超前打入的字符而出现的错误 (4)检验键盘状态 0BH功能:如按键,则 AL=0FFH,如没按键,则 AL=00,无论哪种都将继续执行程序中的下一条指令。 例:未按键,程序不断循环,只要按下任意键,程序就退出循环并返回。 SOUNDER: …… .. …….. MOV AH , 0BH INT 21H INC AL JNZ SOUNDER RET

按键 AL=0FFH , +1 为 0不按键 AL=0 , +1 不为 0故非 0 循环。

Page 53: 微型计算机技术

4.5.2 显示器 I / O 1 .字符属性 屏幕上的字符,在存储器中由连续的两个字节表示,一个字节保存 ASCII码,另一个字节保存字符的属性。 在屏幕上处理字母、数字以及一些字符图形称为文本方式。 (1) 单色字符显示 单色显示属性字节: 7 6 5 4 3 2 1 0

闪烁 亮度 0 =正常显示 0 =正常亮度 1=闪烁显示 1=加强亮度

背景 前景 000=黑111=白 000=黑111=白

Page 54: 微型计算机技术

单色显示的属性表 属性值(二进制) 属性值(十六进制) 显示效果 00000000 00 无显示 00000001 01 黑底白字,下划线 00000111 07 黑底白字,正常显示 00001111 0F 黑底白字,高亮度 01110000 70 白底黑字,反相显示 10000111 87 黑底白字,闪烁 11110000 F0 白底黑字,反相闪烁 (2)彩色字符显示 彩色文本显示时,属性字节选择前景 ( 显示的字符 ) 和背景的颜色。字符可以选择 16种颜色中的一种,背景有 8种颜色可以选择。 16 色方式下的属性字节

BL R G B I R G B

闪烁背景 前景

Page 55: 微型计算机技术

16 色字符方式颜色的组合 颜色 I R G B 颜色 I R G B 颜色 I R G B 颜色 I R G B 黑 0 0 0 0 灰 1 0 0 0 红 0 1 0 0 浅红 1 1 0 0 蓝 0 0 0 1 浅蓝 1 0 0 1 品红 0 1 0 1 浅品红 1 1 0 1 绿 0 0 1 0 浅绿 1 0 1 0 棕 0 1 1 0 黄 1 1 1 0 青 0 0 1 1 浅青 1 0 1 1 灰白 0 1 1 1 白 1 1 1 1 背景颜色只能是表中 I为 0的 8种颜色。如果前景和背景是同一种颜色,显示出的字符是看不见的,但属性字节中的位 7可以使字符闪烁 (BL = 1) 。 2 . BIOS显示中断 中断类型 10H的部分显示操作及所用的寄存器表 AH 功能 调用参数 返回参数 1 置光标类型 ( CH) 0~ 3=光标开始行 ( CL) 0~ 3=光标结束行 BH = 页号 2 置光标位置 DH = 行 DL = 列 3 读光标位置 BH = 页号 CH/CL = 光标开始 /结束行 DH/DL = 行 /列

Page 56: 微型计算机技术

AH 功能 调用参数 返回参数 5 置当前显示页 AL = 页号 6 屏幕初始化或上卷 AL = 上卷行数 AL = 0全屏幕为空白 BH = 卷入行属性 CH = 左上角行号 CL = 左上角列号 DH = 右下角行号 DL = 右下角列号 7 屏幕初始化或下卷 AL = 下卷行数 AL = 0全屏幕为空白 BH = 卷入行属性 CH = 左上角行号 CL = 左上角列号 DH = 右下角行号 DL = 右下角列号 8 读光标位置的 BH = 显示页 AH = 属性 属性和字符 AL = 字符

Page 57: 微型计算机技术

AH 功能 调用参数 返回参数 /注释 9 在光标位置显示 BH = 显示页 字符及其属性 AL = 字符, BL = 属性 CX = 字符重复次数 A 在光标位置 BH = 显示页, AL = 字符 只显示字符 CX = 字符重复次数 E 显示字符 AL = 字符 光标跟随字符移动 (光标前移) BL = 前景色 13H 显示字符串 ES: BP = 串地址 CX = 串长度, BH = 页号 DH、 DL = 其始行列 AL = 0, BL = 属性 串: CHAR, CHAR,……, CHAR 光标返回起始位置 AL = 1 , BL = 属性 串: CHAR, CHAR,……, CHAR 光标跟随移动 AL = 2 串: CHAR, ATTR,……, CHAR, ATTR 光标返回起始位置 AL = 3 串: CHAR, ATTR,……, CHAR, ATTR 光标跟随串移动

Page 58: 微型计算机技术

(1) 控制光标 功能 1 :光标显现或关闭。 CH和 CL的低 4 位 (0—3) 存放光标行开始和结束的数据,当 CH的第 4 位为 1 时,光标不显现出来 (关闭 ) ;当第 4 位为0时,光标在屏幕上显现出来。单色显示器的光标大小的范围从 0~ 13 。 功能 2 :设置光标位置。光标位置的行号设在 DH中,列号设在 DL中。在25×80的显示方式中,坐标 (0, 0) 是屏幕的左上角, (24 , 79) 是屏幕的右下角。 BH中必须包含被输出的页号,对单色显示器来说,页号总是 0。 例:置光标开始行为 5,结束行为 7,并把它设置到第 5行第 6列。 MOV CH , 5 ;开始行为 5 MOV CL , 7 ;结束行为 7 MOV AH , 1 ;功能号 1 INT 10H MOV DH , 4 ;置光标位置 MOV DL , 5 ;到第 5行第 6列 MOV BH , 0 MOV AH , 2 ;功能号 2 INT 10H

屏幕文本方式

0行

24 行

0 列 79列

Page 59: 微型计算机技术

(2)读光标位置 INTl0H功能 3 是读光标位置, BH指定页号。此功能把光标位置的行号回送给DH,列号回送给DL。光标大小的参数填入 CH和 CL。 例:读 0页的当前光标位置。 MOV AH, 3 MOV BH, 0 INT 10H (3)选择显示页 INTl0H的功能 5可确定显存中的显示区域。 ROM BIOS将 CGA 的显存分为 4页,每页 25×80个字符,或分为 8页,每页 25×40个字符。每一页的起始地址在 1KB 的边界。这 4页的起始地址分别为 B 800: 0000, B 800:1000, B 800: 2000, B 800: 3000。 例:选择显示页。 MOV AL, vpage MOV AH, 5 INT 10H

Page 60: 微型计算机技术

(4)清屏和卷屏 INTl0H功能 6能使屏幕内容上卷指定的行,这个功能需要设置 7个参数。 例:编写清除全屏幕的子程序。 CLEAR-SCREEN PROC NEAR PUSH AX MOV DX , 0 PUSH BX MOV AH , 2 PUSH CX INT 10H PUSH DX POP DX MOV AH , 6 ;功能号 6 POP CX MOV AL , 0 ;屏幕空白 POP BX MOV BH , 7 ;正常显示 POP AX MOV CH , 0 ;左上行号 RET MOV CL , 0 ;左上列号 CLEAR-SCREEN ENDP MOV DH , 24 ;右下行号 MOV DL , 79 ;右下列号 INT 10H

功能号为 2 : BH=0, BL=0 置光标左上角保护寄存器

恢复寄存器

Page 61: 微型计算机技术

10H的功能 7和功能 6 类似,也能使屏幕 ( 或窗口 ) 初始化或使屏幕 ( 或窗口 ) 的内容下卷指定的行。 例:清除左上角为 (0, 0) ,右下角为 (24 , 39) 的窗口,初始化为反相显示,该窗口相当于全屏幕的左半部分。 MOV AH , 7 ;功能号 7 MOV AL , 0 ;全屏幕为空白 MOV BH , 0 ;卷入行属性 MOV CH , 0 ;左上角行号 MOV CL , 0 ;左上角列号 MOV DH , 24 ;右下角行号 MOV DL , 39 ;右下角列号 INT 21H

00

24 39

Page 62: 微型计算机技术

编写程序在屏幕的中间建立一个 20列宽和 9行高的窗口,然后把键盘输入的内容在这个窗口显示出来。键人的字符将被显示在窗口的最下面一行,每当输入 20个字符,该行就向上卷动, 9行字符输入完后,顶端行的内容消失。 .CODE ESC-KEY EQU 1BH ; 1BH为 ESC的 ASCII码 WIN-ULC EQU 30 ; WIN-ULR EQU 8 WIN-LIC EQU 50 WIN-LRR EQU 16 WIN-WIDTH EQU 20 MAIN PROC FAR LOCATE :MOV AH , 2 MOV DH,WIN-LRR ; DH=16 MOV DL,WIN-ULC ; DL=30 MOV BH, 0 ;无显示 INT 10H

8

16

30 50

置光标位置: 第 16 行,第 30 列

Page 63: 微型计算机技术

MOV CX ,WIN-WIDTH GET-CHAR: MOV AH, 1 ;键盘输入 INT 21H ; DOS 调用 CMP AL, ESC-KEY ;是 ESC吗? JZ EXIT ;是转 EXIT LOOP GET-CHAR MOV AH, 6 ; 6 号功能 MOX AL, 1 ;上卷 1 行 MOV CH,WIN-ULR ;上卷行的起始行列号 MOV CL,WIN-ULC MOV DH,WIN-LRR ;上卷行的结束行列号 MOV DL,WIN-LRC MOV BH, 7 ;字符属性 7,正常显示 INT 10H JMP LOCATE EXIT: MOV AH, 4CH ;返回DOS INT 21H MAIN ENDP END MAIN

键盘输入字符,若是ESC则转到 EXIT结束,否连续输入 20个字符。

输入 20 个字符后, 进行上卷。

Page 64: 微型计算机技术

(5) 字符显示 功能 9:字符及其属性输出到当前光标位置上 功能 0A :字符输出到当前光标位置上 然后光标返回到它的初始位置,所以在当前光标位置上写一个字符之后,必须用 INT l0H的功能 02 移动光标到下一个字符位置上。 例:置光标到 0显示页的 (20, 25) 例:在 0页( 11 , 0)读字符及 位置,并以正常属性显示一个星号‘ *’ 属性 MOV AH, 2 ; 2号功能 MOV AH, 2 MOV BH, 0 MOV BH, 0 MOV DH, 20 MOV DH, 11 MOV DL, 25 MOV DL, 0 INT 10H INT 10H MOV AH, 9 ; 9 号功能 MOV AH, 8 MOV AL,’ *’ ;字符的 ASCII码 MOV BH, 0 MOV BH, 0 ;显示页号 0 INT 10H MOV BL, 7 ;正常显示 MOV CX , 1 ;重复次数为 1 INT 10H

设置光标:0页 20 行 25 列 设置光标:

0页 11 行 0 列

读字符及属性:( AL) =字符( AH) = 属性

Page 65: 微型计算机技术

例:在屏幕上显示一个用字符构成的“汽车”图形 “汽车”由 7个字符组成,从左到右,车体是由字母 R(ASCII码 52H) 、 1/ 2阴影符 (ASCII码 B1H) 以及两个实心方块 (ASCII码 DBH) 组成。头两个字符用反相属性显示,后两个用正常属性显示。两个车轮是字母 O(ASCII码 4FH) ,它和笑脸符 (ASCII码 02)都是以正常属性显示。 显示的位置可以用相对位移量来表示。 R是显示的第一个字符,相对位移量定为 (0, 0) ,阴影符在 R的右边一列,相对 R的位移量为 (0, 1) ,两个实心方块都是在前一个字符的同一行的右边一列,位移量都为 (0, 1) 。后轮相对最后一个方块符行数加 1 ,列数不变,所以位移量为 (1 , 0) ,前轮相对于后轮的位移量为 (0,一 3) ,笑脸符相对于前轮的位移量为 ( 一 2 , 1) 。

R

( -2 ,1 )( 0,0)( 0,1 ) ( 0,1 )

( 0,1 )( 1 ,0)( 0, -3 )

Page 66: 微型计算机技术

每个字符由 4 个参数表示: ASCII码,显示属性,相对的行和列位移量。可以把它们定义在一个字符图形表里。 D-SEG SEGMENT C-SEG SEGMENT CAR DB 7 ASSUME CS : C-SEG , DS : D-SEG DB 52H , 70H , 0 , 0 MAIN PROC FAR DB OB1H , 70H , 0 , 1 MOV AX , D-SEG DB 0DBH , 7 , 0, 1 MOV DS , AX DB 0DBH , 7 , 0, 1 CALL CLEAR-S DB 4FH , 7 , 1, 0 LEA DI , CAR DB 4FH , 7 , 0, -3 MOV DH , 10H DB 2 , 7 , -2 , 1 MOV DL , 10H D-SEG ENDS CALL DISP-C MOV CX , 4C00H INT 21H MAIN ENDP

字符图形表屏幕初始化

R ( 52H ) 70 反相显示½阴影符( B1H )反相实方快( DBH )正常

O ( 4FH )正常、笑脸符( 02H )正常显示。

图形表首址送DI 。

DH 、 DL为光标的初始位置。

Page 67: 微型计算机技术

Clear-s proc near PUSH AX PUSH BX PUSH DX PUSH CX MOV AH,6 ; 6 号功能 MOV AL,0 ;上卷行数 MOV CH,0 ;左上角行号 MOV CL,0 ;左上角列号 MOV DH,24 ;右下角行号 MOV DL,79 ;右下角列号 MOV BH,7 INT 10H POP CX POP DX POP BX POP AX RET Clear-s endp

寄存器压栈

寄存器出栈

屏幕初始化

Page 68: 微型计算机技术

DISP-C PROC NEAR PUSH AX PUSH BX MOV AH , 0FH INT 10H SUB CH , CH MOV AH , 9 MOV CL , [DI] INT 10H INC DI POP CX NECR : ADD DH , [DI+2] ADD DI , 4 ADD DL , [DI+3] LOOP NECR MOV AH , 2 POP BX INT 10H POP AX MOV AL , [DI] RET MOV BL , [DI+1] DISP-C ENDP PUSH CX C-SEG ENDS MOV CX , 1 END MAIN

设置当前页设置显示次数

定光标位置

取字符和显示属性重复 1 次

9号功能显示字符

循环显示

循环次数压栈

循环次数出栈修改字符地址

Page 69: 微型计算机技术

(6)彩色和字符串显示 属性字节的典型组合 7 6 5 4 3 2 1 0 显示颜色 BL R G B I R G B 十六进制 黑底白字 0 0 0 0 0 0 0 0 00H 黑底蓝字 0 0 0 0 0 0 0 1 01H 蓝底红字 0 0 0 1 0 1 0 0 14H 绿底青字 0 0 1 0 0 0 1 1 23H 灰白底浅品红字 0 1 1 1 1 1 0 1 7DH 绿底灰字闪烁 1 0 1 0 1 0 0 0 A8H 例:在品红背景下,显示 5个浅绿色闪烁的星号。 MOV AH, 9 ; 9 号功能 MOV AL,’ *’ ; *的 ASCII码送 AL MOV BH, 0 ;显示页 0 MOV BL, 0DAH ;字符属性 MOV CX , 05 ;重复次数 INT 10H

1 1 0 1 1 0 1 0

闪烁 品红 浅绿

Page 70: 微型计算机技术

13H功能显示字符串有 4 种方式,前两种方式 (AL=0、 1) 要指定整个串的属性,后两种方式 (AL = 2 , 3) 必须指定每个字符的属性。 例:在屏幕上以红底蓝字显示字符串:“WORLD SCENERY”。 STRG DB ‘WORLD SCENERY’ LNER EQU $ -STRG MOV AL, 3 MOV AH, 13H MOV AH, 0 INT 10H INT 10H MOV BP, SEG STRG MOV ES, BP MOV BP, OFFSET STRG MOV CX , LNER MOV DX , 0 MOV BL, 41H MOV AL, 0

0号功能设置显示方式 80×2516色文本方式。

ES: BP字符串逻辑地址。 CX 字符串长度DX=0: 0行、 0列AL=0,串字符属性BL=41H,红底蓝字

Page 71: 微型计算机技术

3 . DOS显示功能调用 DOS 功能调用 INT 21H的显示操作 :两个是显示单字符的功能 ;一个是显示字符串功能,这些功能都自动向前移动光标。 表 INT 21H显示操作 AH 功 能 调 用 参 数 2 显示一个字符(检验 Ctrl-Break) DL=字符 光标跟随字符移动 6 显示一个字符(不检验 Ctrl-Break) DL=字符 光标跟随字符移动 9 显示字符串 DS: DX=串地址 串尾为$ 光标跟随串移动 AH= 9是显示字符串,要求串尾字符必须为$字符 (24H)。 例: MESG DB ’HELLO CLASS’,0AH,0DH,‘$’ MOV AH ,9 ;功能号 9 MOV DX ,SEG MESG ;段基值送DS MOV DS ,DX MOV DX ,OFFSET MESG ;偏移地址送DX INT 21H

Page 72: 微型计算机技术

4.5.3 打印机 I / O 打印机通常是串行或并行接口。通过并行接口,打印机一次从处理器接收8位代码;通过串行接口,打印机每次从处理器接收一位代码。 PC机一般适用并行接口,所有打印机使 ASCII标准。 打印机 I / O 的中断操作 INT AH 功能 调用参数 返回参数 21H 5 打印一个字符 DL=字符 17H 0 打印一个字符 AL=字符 AH=状态字节 并送回状态字节 DX= 打印机号 17H 1 初始化打印机 DX= 打印机号 AH= 状态字节 送回状态字节 17H 2 送回状态字节 DX= 打印机号 AH= 状态字节

打 应 纸 选择 I/O 未 未 超 印 答 出 打印 错 用 用 时 机 位 界 机

状态字节

Page 73: 微型计算机技术

1 . DOS 打印功能 INT 21H的功能 5 把一个字符送到打印机,字符必须放在 DL寄在存器中。如果需要回车、换行等打印功能,必须由汇编语言程序送出回车、换行等字符码。例:调用 DOS 功能打印字符。 TEXT DB ‘Hello,everybody’ COUNT EQU $ -TEXT MOV CX,COUNT MOV BX,0 NEXT: MOV AH,5 MOV DL,TEXT[BX] INT 21H INC BX LOOP NEXT

字符个数5 号功能

显示一个字符修改地址循环显示

上述指令也适用于发送打印控制字符: TEXT DB 0CH,’ Hello,everybody’, 0DH, 0AH, 0AH其中: 0CH换页码, 0AH换行码。字串打印在新页,与下文有两个空行。

Page 74: 微型计算机技术

2 . BIOS 打印功能 BI()S17H中断指令提供了由 AH寄存器指定的三种不同的操作。 功能 0:打印一个字符。功能号 0在 AH中,字符放在 AL中,打印机号放在 DX 中, BI()S最多允许连接三台打印机,机号分别为 0, 1 和 2 。单打印机时为 0 号打印机。返回状态信息在 AH中。例: MOV AH, 0 ;功能号 0→AH MOV AL, CHAR ;字符→ AL MOV DX , 0 ;打印机号 0 →DX INT 17H 功能 l :初始化打印机,并回送打印机状态到 AH寄存器。 MOV AH, 01H ;功能号 1→AH MOV DX , 0 ;打印机号 0 →DX INT 17H 这个操作要发送一个换页符,能把打印机头设置在一页的顶部。 功能 2 :把状态字节读人 AH寄存器。 例:应用 BIOS和 DOS功能调用,编写一个简单的打字程序 (TYPER) 。要求把从键盘上接收的字符显示在屏幕上,并由打印机输出,在键盘上按下 Esc键,即退出程序。

Page 75: 微型计算机技术

SEG SEGMENT STACK DB 30H DUP(?) SEG ENDP DATA SEGMENT IN-MSG DB ‘ YOU ARE USING A TYPER SIMULATOR . ’ DB ‘ TO QUIT THIS PROGRAM , PRESS ESC ’ , 13 , 10,’ $’ PRO-MSG DB 9EH, 10H,’$’ KEY-ESC EQU 1BH ; KEY ESC KEY-CR EQU 0DH ; KEY CR KEY-IF EQU 0AH ; KEY LF CODE SEGMENT PRINT MACRO STR-ADDR ;定义宏, STR-ADDR是形式参数。 PUSH DX PUSH AX POP AX MOV DX , STR-ADDR POP DX MOV AH, 09H PRINT ENDM INT 21H

定义一个显示字符串的宏。形式参数为串地址

Page 76: 微型计算机技术

MAIN PROC FAR STI ; IF=0,开中断 CLD ; DF=0 MOV AH , 0 ;打印字符 MOV DX , 0 ; 0号打印机 INT 17H CALL CLER-SCRREN ;调用清屏子程序 MOV AX , DATA MOV DS , AX ;装填 DS MOV DX , 0 MOV AH , 2 INT 10H PRINT IN-MSG GE-CHAR:MOV AH , 1 INT 21H CMP AL , KEY-ESC JZ EXIT

设置光标 位置: 0列, 0行。

为 ESC,结束

显示字符串。

开中断指定 0号打印机清屏幕

设置光标位置显示提示语键入字符

键入字符

ESC ?结束CR ?

AL→DL LF→DL

显示打印

YY

Page 77: 微型计算机技术

MOV DL , AL MOV AH , 5 INT 21H CMP AL , KEY-CR JNZ INCDE MOV DL , KEY-CF MOV AH , 5 INT 21H INCDE : MOV AH , 2 INT 21H JMP GET-CHAR EXIT : MOV AH , 4CH INT 21H MAIN ENDP END MAIN

打印键盘输入的字符。非回车符,跳转

是回车符,打印显示换行符。

继续键入返回DOS结束

Page 78: 微型计算机技术

4 . 6 小 结 1 .编制汇编语言的基本步骤 (1) 分析所要解决的问题,确定适当的算法; (2) 设计整个程序的逻辑结构,画出程序框图; (3) 编写程序,正确使用指今、伪指令以及 DOS、 BIOS 功能调用,同时写出筒洁明了的说明和注释; (4)上机调试程序,学会使用 DEBUG等调试工具。 2 .中断程序的设计方法 对于要求以中断方式工作的 I / O 设备,它们的中断类型已由硬件连线确定。主程序为中断所做的准备工作如下: (1)保存原中断向量 (INT 21H的 35H功能 ) ,设置新的中断向量 (INT 21H的 25H功能 ) ; (2) 设置设备的中断屏蔽位; (3) 设置 CPU的中断允许位 ( 开中断 ) ; (4) 在主程序结束前,恢复原中断向量。

Page 79: 微型计算机技术

主程序完成了上述准备工作后, I / O 设备即以完全随机的方式产生中断。当 CPU响应了中断请求,中断系统将自动完成以下工作: (1)CPU接收外设的中断类型号; (2)当前的 FLAGS、 CS和 IP的内容入栈保存; ‘ (3)清除 IF和 TF; (4) 根据中断类型号取出中断向量送CS和 IP; (5) 转中断处理子程序。 中断处理子程序的编写方法: (1)保存工作寄存器内容; (2)如允许中断嵌套,则开中断 (STI) ; (3)处理中断任务; (4)关中断 (CLI) ; (5)送中断结束命令 (EOI)给中断命令 寄存器 (只限硬件中断 ) ; (6)恢复工作寄存器内容; (7)返回被中断的程序 (IRET) 。

DOS和 BIOS的调用方法:( 1 )设置参数 ( 2 )设置功能号 ( 3 )中断调用 如: MOV DL ,’ ﹡’ MOV AH, 2 INT 21H