ac61d9b8d596f1d87b0420bb4b734915.ppt
- Количество слайдов: 79
微型计算机技术 学习辅导(4) 太原广播电视大学 郭建勇
§ 第四章 汇编语言程序设计基础 § § 4.1循环程序设计 在程序设计中,常常需要一段程序反复执行若干次,这通常用循环的方 法来实现,借助几种循环控制指令和前缀可以方便地实现循环。 § 4.1.1基本结构的循环程序 § § (1)初始化部分:循环前的准备 作,包括建立指针、设置变量及循环初值等。 (2)循环体:这是循环程序的 作部分,完成循环的基本操作。 (3)修改部分:修改参数,包括操作数地址、循环计数值或其他控制变量。 (4)控制部分:根据对循环条件的判断结果,控制循环的执行或结束。 初始化 循环体 修改部分 Y 循环控制 N 先 作 后 判 断 循环控制 N Y 循环体 修改部分 先 判 断 后 作
§ 例:编制一个程序,将BX寄存器中的二进制数用十六进制数的形式显示出来。 § (1) BX寄存器中的二进制数可用 § 4位十六进制数显示,故循环次数为 § CX←循环记数值 4,放入CH中。 § (2) BX循环左移 4次,最高位数字 § § § 开始 移到最低位置; (3)0~ 9的数字与ASCII码差为 30 H; A~F(41 H ~ 46 H)与ASCII码差为 37 H;故0~ 9的数字+30 H,而A~F 应+37 H。 BX循环左移 4次 转换为ASCII码 > 9? +7 显示 次数=0? 结束
§ PROGNAM SEGMENT § MAIN PROC FAR § ASSUME CS:PROGNAM § START: MOV CH ,4 ROTATE: MOV CL ,4 § ROL BX ,CL § MOV AL , BL § AND AL ,0 FH § ADD AL ,30 H § CMP AL ,3 AH § JL PIRNTIT § ADD AL ,07 H PIRNTIT:MOV DL ,AL MOV AH ,4 CH INT 21 H DEC CH JNZ ROTATE MOV AH,4 CH INT 21 H MAIN ENDP PROGNAM ENDS
§ § § § § 例:统计某字单元中二进制数位值为 1的个数,统计结果存放在变量ONE中。 DATA SEGMENT NUM DW 1669 H FINI: MOV AH,4 CH ONE DB ? INT 21 H DATA ENDS CODE SEGMENT END START ASSNUM CS:CODE 开始 DS:DATA START:MOV AX ,DATA AX←NUM MOV DS,AX AX=0? MOV AX,NUM Y COMP:CMP AX,0 AX左移一位 结束 JZ FINI SHL AX,1 CF=1? JNC COMP Y INC ONE+1 JMP COMP
§ 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遍。 §
§ § § § 序号 数 比较遍数 1 1 2 3 4 5 第一遍 第二遍 第三遍 第四遍 1 2 3 4 32 32 85 85 16 16 16 85 15 15 15 85 8 85 比较5 -1=4次 比较5 -2=3次 比较5 -3=2次 比较5 -4=1次 2 比较次数 1 2 3 32 16 16 32 15 15 15 32 8 8 8 32 85 3 4 1 2 1 16 15 15 8 15 16 8 8 15 8 8 16 16 32 32 85 85 挑出最大数 挑出第二大数 挑出第三大数 挑出第四大数 85 32 16 15 完成整序 8 15 16 32 85
开始 § § § 置外循环次数 N-1 置内循环次数 N-1 I=0 KI≤KI+1? KI←→KI+1 I=I+1 CNUNT 2 -1 N =0? CNUNT 1 -1 N =0? 结束 N
§ § § § § § DSEG N A DSEG CSEG MAIN SEGMENT EQU 5 DW 5 DUP(?) ENDS SEGMENT PROC FAR ASSUME CS:CSEG, DS:DSEG START:MOV AX ,DSEG MOV DS ,AX MOX CX, N DEC CX LOOP 1:MOV DX ,CX MOV SI ,0 LOOP 2:MOV AX ,A[SI] CMP AX ,A[SI+2] JLE NUM XCHG AX,A[SI+2] MOV A[SI],AX NUM :ADD SI ,2 LOOP 2 MOV CX ,DX LOOP 1 MOV AH ,4 CH INT 21 H MAIN ENDP CSEG ENDS END START
§ 4.2 分支程序设计 § 4. 2. 1 分支程序结构 N 判定条件 Y A § § B 两路(单重)分支结构 A B X 多路(多重)分支结构 这两种结构都要求先对条件进行判定,然后根据判定结果确定执行哪路 分支,判定一次只能有一路分支被选择。一般来讲一个条件两路分支;N个条 件,2 N路分支。
§ § § § 4. 2. 2 分支程序的设计方法 分支程序的实现方法有多种,最常用的方法有:利用比较和条件转移指令 实现分支, 利用逻辑尺控制分支,以及利用地址跳转表实现分支等方法。 例: X/2 X< 0 Y= 2 X=0 2 X X> 0 这个问题可以通过X与0的比较,利用条 件转移指令来确定三个计算分支中的某一支。 MOV AL ,X AL←X CMP AL ,0 Y N JL M 1 X< 0? JZ M 2 Y N SAL AL ,1 AL÷ 2 X=0? JMP NEXT AL← 2 AL× 2 M 1: SAR AL ,1 JMP NEXT M 2: MOV AL ,2 X←AL NEXT: MOV X ,AL
§ 利用逻辑尺控制分支也是常见的一种分支程序设计方法。例:编写一个显示 程序,要求显示A和B共 8次,显示次序为A 3次,B 2次,A 1次,B 2次。因此,可 设计一个逻辑尺: 00011011,0表示显示A,1表示显尔B。编程时,逐值测试 逻辑尺,是 0则执行显示A的分支,是l则执行显示B的分支。部分程序如下: §. . . § MOV CX,8 CX←次数 § MOV BL,00011011 B § LOP: SHL BL,1 BL←逻辑尺 § JC M 1 § CALL AA 1 逻辑尺左移一位 § JMP NEXT N =1? § M 1: CALL BB 1 Y § NEXT: LOOP LOP 执行B 执行A § HLT 分支程序设计时要注意各个 分支一定要转入到公共操作 上。本例和上例中的橙色框。 N CX-1=0?
§ 利用地址跳转表的方法主要用于多路分支(三路分支以上)的情况,下面 通过一个实例来说明这种程序设计方法。 § 在调用DOS文件管理功能时,如出现了错误(如使用了非法功能号),DOS § 则根据AX中的错误码,将相应的错误信息显示出来。(AX)= 1~ 5各表示一种 错误,其错误信息分别为ERl ~ ER 5。AX除l ~ 5之外的数码是无效的。 ER 1 § § § (1)错误信息提示的地址 分别为ERl ~ ER 5。 (2)ERl ~ ER 5构成跳 转表,表首地址为ERTAB。 (3)表中各项的地址为 表首址+(功能号-1)× 2 ERTAB+2 ERTAB+4 ERTAB+6 1号错误 提示 ER 1 ER 2 ER 3 ER 4 2号错误 提示 3号错误 提示 4号错误 提示 ER 5 ERTAB+8 ER 5 5号错误 提示
§ DATA SEGMENT § OUTR DB “非 1~ 5$” OUTR § ER 1 DB “错误 1提示$” § ER 2 DB “错误 2提示$” TADR § ER 3 DB “错误 3提示$” § ER 4 DB “错误 1提示$” § ER 5 DB “错误 1提示$” § EVEN § ERTAB DW ER 1,ER 2,ER 3 § DW ER 4,ER 5 § DATA ENDS § CODE SEGMENT § SHOWERR PROC FAR § ASSUME CS:CODE,DS:DATA § MOV SI ,DATA § MOV DS ,SI § PHSU AX ;保护现场 § PUSH DX CMP JGE OUTR: AX ,5 OUTR ;≥ 5转至 AX ,1 TADR ; 1~ 5转 LEA DX ,OUTR JMP DISPM ;转至DISPM TADR: MOV BX ,AX DEC BX SHL BX ,1 MOV DX ,ERTAB[BX] DISPM: MOV AH ,9 INT 21 H POP BX ;恢复现场 POP DX POP AX REG SHOWERR ENDP CODE ENDS
§ § § 4. 3 子程序设计 子程序又称为过程,在程序实现中,如果要多次用到一些功能相同的程 序段,那么就可以用伪操作PROC和ENDP把这些程序段定义成子程序。需要时 用CALL指令来调用它,调用程序也称为主程序。 子程序有两种属性:NEAR(缺省的属性)和FAR。和调用程序在同一代码 段中的子程序使用NEAR属性,和调用程序不在同一代码段中的子程序使用FAR 属性。 4. 3. 1 主程序与子程序之间的参数传送 主程序在调用子程序时,需要传送一些参数(入口参数)给子程序,子 程序运行完后也要将运行结果(出口参数)回送给主程序。 利用寄存器传送参数的方式: 利用存储区传送参数 利用堆栈传送参数 1.利用寄存器传送参数 这种参数传送的方式方便、快速,但只适合传送参数较少的情况。 例:编写程序,将一个 16位二进制数转换成用ASCII表示的十进制数。 这是一个常用的转换子程序,应提供给所有的用户调用。因此,要将该 子程序的人口参数和出口参数注释清楚,方便调用。
§ § § § 本例是通过DX和DI寄存器传递参数的。 DATA SEGMENT OUTB DB 5 DUP (30 H) N EQU 12345 H 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,4 C 00 H INT 21 H
入口参数: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,30 H ;转换ASCII码 本例中,N为二进制数,先除 10,余数为个位,或 30 H变为 MOV [DI],AL ;存结果 ASCII码;再对商除 10,余数 DEC DI ;修改指针 为十位,或 30 H变为ASCII码; CMP DX ,0 直至商为 0。 JNZ BINA 0 ;≠ 0,转BINA 0
§ § § § § 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 L 1 ASSUME CS;CODE,DS:DATA MOV AL ,[SI] START: MOV AX ,DATA L 1 : 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 ,4 CH INT 21 H
§ § § § 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 ,4 C 00 H DS:DSEG INT 21 H
§ ECRY PROC POP § PUSH BP ;用BP取 POP § MOV BP ,SP ;入口参数 POP § PUSH AX ;保护现场 RET § PUSH BX ECRY ENDP § PUSH CX CSEG ENDS § PUSH SI END § MOV SI ,0 § MOV CX ,[BP+4];取入口参数 SI § MOV BX ,[BP+6] CX BX § DONE:MOV AX ,[BX+SI] AX § SHL AX ,1 BP BP § XOR AX ,0 FFFFH 返回地址 § ADD SI ,2 个数N MOV BP,SP § LOOP DONE 首地址 栈底 § POP SI ;恢复现场 § POP CX 保护现场后 BX AX BP 4 START SP 返回地址 个数N 首地址 栈底 恢复现场后
§ 4. 4 I/O程序设计 § 信息交换 地址端口 : 地址信息 § 主机 I/O接口 数据端口 : 状态信息 § 状态端口 : 数据信息 § 4. 4. 1 直接控制 I/O的程序设计 § 1.I/O端口 § 在 80 x 86微机中,I/O端口编址在一个独立的地址空间中,这个I/O空间 允许设置 64 K(65536)个 8位端口或 32 K(32768)个 16位端口。 § 2.I/O程序举例 § 对于I/O和存储器分离的地址空间系统,80 x 86有专门的I/O指令与端口进行 通信。下面通过几个I/O程序的例子,说明使用I/O指令直接在端口级上输 入输出的方法。 § 输入指令 输出指令 § IN AN, 30 H OUT 30 H ,AL § IN AX, 40 H OUT 40 H ,AX § IN AL, DX ;DX← 16位端口地址 OUT DX ,AX ;DX← 16位端口地址 § IN AX, DX ;DX← 16位端口地址 OUT DX ,AX ;DX← 16位端口地址
§ § 例: SOUND程序。 程序通过I/O指令使设备控制寄存器(1/O端口地址为 61 H)的第 1位交替为 0 和l,而61 H端口的第l位和扬声器的脉冲门相连,交替为 0和l的脉冲电流被放 大后送到扬声器使之发出了声音。 § 7 6 5 端口 61 H § SOUND PROC § PUSH AX § PUSH DX § MOV DX ,1000 § IN AL ,61 H § AND AL ,11111100 B TRIG:XOR AL ,00000010 B § OUT 61 H ,AL § MOV CX ,6000 § DELAY:LOOP DELAY 4 3 2 1 0 1/0 与 门 DEC JNZ POP RET SOUND ENDP DX TRIG DX AX 放大器 本例中CX=6000 它决定发声频率 值小声音尖锐, 值大声音低沉。 DX=1000决定 发声时间长短。
§ § § 例:PRT—CHAR程序。 这是一个采用查询方式的打印字符程序。程序通过反复渎取并测试打印机的状态 来控制输出。在打印机接口中,数据寄存器的端口地址为 378 H,状态寄存器的端口地 址为 379 H,控制寄存器的端口地址为 37 AH。 7 状态寄存器 端口 379 H 6 5 4 3 2 1 0 忙位(0=忙) 应答(0=可接受) 纸出界(1=出界) § 未用 打印出错(0=出错) 联机状态(1=联机) 7 6 5 4 3 2 1 0 控制寄存器 端口 37 AH § § 未用 作方式 (0=禁止中断方式) 选通(1=输出数据) 自动换行(1=换行) 初始化(1=正常) 选择位(1=接通)
§ DATA SEGMENT § MESS DB ‘PRINTER IS NORMAL’ 出 § COUNT EQU $-MESS § DATA ENDS § CSEG SEGMENT § ASSUME CS:CSEG,DS:DATA § START:MOV AX,DATA § MOV DX,AX § LEA SI,MESS ;建地址指针 § MOV CX,COUNT;CX←次数 § NEXT: MOV DX,379 H ;DX←状态地址 § WAIT: IN AL,DX ;AL←状态端口 § TEST AL,80 H ;测忙否 § JZ WAIT ;忙(=0)再测 § MOV AL,[SI] ;不忙,输出 § MOV DX,378 H ;DX←数据地址 § OUT DX,AL MOV DX,37 AH MOV AL,0 DH ;选通输 OUT MOV OUT INC LOOP MOV INT CSEG DX,AL AL,0 CH DX,AL SI NEXT AH,4 CH 21 H ENDS END START TEST指令测状态寄存器的第 7 位,为 0表示忙,循环再测, 直至为 1空闲时,再取字符输 出打印。称为查询方式。 0 DH为控制寄存器选通信号, 0 CH为结束选通。
§ § § § 又例:CPU要从3个设备轮流输人数据,PROCl,PROC 2,PROC 3分别是设备l, 设备2和设备3的数据输入程序,它们的状态寄存器的端口地址分别用STAT 1, STAT 2,STAT 3表示,这三个状态寄存器的5位是输入准备位。轮流查询三个数 据输入设备的程序段: INPUT: IN AL ,STAT 1 ;AL←状态寄存器 1 TEST AL ,20 H ;输入准备好? JZ DEV 2 ;否,转DEV 2 CALL FAR PTR PROC 1 ;准备好,调PROC 1 DEV 2: IN AL ,STAT 2 TEST AL ,20 H JZ DEV 3 查询方式的优点:可以安 CALL FAR PTR PROC 2 排优先次序,最先查询的设 备优先级最高。修改查询次 DEV 3: IN AL ,STAT 3 序就修改了设备的优先级。 TEST AL ,20 H 缺点:查询等待浪费CPU的 JZ NO-INPUT 时间,在设备多时由询问转 CALL FAR PTR PROC 1 向处理程序的时间较长。 NO-INPUT:……
§ 4. 4. 2 中断程序设计 中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作,引起 中断的事件称为中断源。 中断是CPU和外部设备进行输入/输出的有效方法。可以避免因反复查询 外部设备的状态而浪费时间,从而提高CPU的效率。 中断源分为软件中断(或称内中断)和硬件中断(或称外中断),系统通过 分配给这些中断的类型号来加以识别和处理。 非屏蔽中断请求 2 CPU n INTn 指令 NMI 中断逻辑 4 INT 0 指令 0 除法 错误 INTR 1 单步 TF=1 8259 A 可编程 中断 控制器 (PIC) 80 x 86中断源及其中断类型号 IR 0 IR 1 IR 2 IR 3 IR 4 IR 5 IR 6 IR 7 08系统定时器 09键盘 0 A彩色/图形 0 B串行COM 2 0 C串行COM 1 0 D LTP 2控制 0 E磁盘控制器 0 F LTP 1控制
§ § § § § 1. 软件中断的执行 (1)中断指令INT n的执行。 CPU执行一条INTn指令时,中断系统立即产生类型为n的中断,并且通过 中断向量调用相应的中断处理程序来完成其中断功能。 (2)处理CPU某些错误的中断。 除法错中断:在执行除法指令时,若发现除数为 0或商超过了寄存器所能 表达的范围,则立即产生一个类型为 0的中断。 溢出中断:有一条专门的指令INTO来中断发生溢出的算术操作。如果OF = 1,INTO指令引起中断,如OF:= 0,则不发生中断,CPU继续运行原程序。 溢出中断的类型号为 4。 (3)为调试程序没置的中断。 单步中断:单步是一种很有用的调试方法。当标志位TF设置为l时,每条 指令执行后,CPU自动产生类型号为 1的单步中断。 断点中断:断点可以设置在程序的任何地方,设置断点实际上是把一条 断点指令INT 3插入程序中,CPU每执行到断点处的INT 3指令便产生一个中断。 INT指令和INTO指令产生的中断。以及除法错中断都不能被禁止,并且比 任何外部中断的优先权都高。
§ 2.硬件中断的执行 § 硬件中断:非屏蔽中断(NMI) § 外部设备的请求引起的可屏蔽中断。 § CPU响应中断的条件:该外设的中断请求是否屏蔽:中断屏蔽寄存器(IMR) § CPU是否允许响应中断:标志寄存器中断允许位IF § 中断屏蔽寄存器(IMR)的I/O端口地址是 21 H。通过设置这个寄存器的某位为 0 允许中断;为 1禁止(屏蔽)中断。 § 中断屏蔽寄存器 7 6 5 4 3 2 1 0 § (I/O端口 20 H) § § 打 印 机 软 硬 盘 盘 串 行 通 信 保 键 留 盘 § 例:只允许键盘中断,可设置如下中断屏蔽字: § MOV AL ,11111101 B ;AL←中断屏蔽字 § OUT 21 H ,AL ;送入中断屏蔽寄存器IMR 定 时 器
§ § § § § 如果系统增设键蛊中断,则可用下列指令实现: IN AL ,21 H ;取中断屏蔽字 AND AL ,11111101 B ;将第 1为置 0,保留其余位不变 OUT 21 H ,AL ;回送21 H端口 中断标志位IF的设置: STI ;设置中断允许位(IF= 1),允许中断(开中断) CLI ;清除中断允许位(1 F= 0),禁止中断(关中断) 中断命令寄存器 (I/O端口 20 H) 7 R 6 5 SL EOI 4 0 3 0 2 1 0 L 2 L 1 L 0 中断命令寄存器:EOI是中断结束位,当EOI为 1时,当前正在处理的硬件 中断请求就被清除,所以在中断处理完成后,必须把中断结束位置为 1。 § 结束硬件中断用下面的指令: § MOV AL ,20 H ; 20 H = 00100000 B,置EOI为 1 § OUT 20 H ,AL ; §
§ 3. 中断操作步骤 § 8086/ 8088中断系统能处理256种类型的中断,类型号为 0~ 0 FFH。中断 向量表是各类型中断处理程序的人口地址表。中断向量的地址可由中断类型 号乘以 4计算出来。 INT 4 AH 0: 124 § 以BIOS中断INT 4 AH为例, MOV CX,30 H 类型49 H ① 中断向量 § 表示出中断操作的以下 IP ③ 向量地址 § 5个步骤: 0: 128 05 1805 =4 AH× 4=128 0: 129 18 § ①取中断类型号; ② CS 00 0: 12 A F 000 § ⑦计算中断向量地址; 0: 12 B 类型4 BH § ③取中断向量,偏移地址 中断向量 § 送IP,段地址送CS; ④ ⑤ § ④转人中断处理程序; 中断处理程序 § ⑤中断返问到INT指令的 F 000: 1805 STI § 下一条指令。 PUSH DS 采用向量中断可加快 CPU中断处理速度。 IRET
§ § § § § 利用保留的中断类型号扩充中断功能,需要在中断向量表中建立相应的 中断向量。为中断类型N设置中断向量的方法: 0: 0000 MOV AX ,0 中断向量表 MOV ES ,AX MOV BX ,N﹡ 4 (BX)= N﹡ 4 IP MOV AX ,OFFSET INHAND ① (BX)+2 CS MOV ES :WORD PTR [BX] ,AX MOV AX ,SEG INHAND MOV ES :WORD PTR[BX+2] ,AX ② ① § INHAND: ② OFFSET INHAND SEG INHAND 子程序 § IRET
§ § § § 用自己编写的中断处理程序代替系统中的某个中断处理功能时: (1)利用DOS功能调用(21 H)保存原中断向量 (2)设置新的中断向量; (3)在程序结束之前恢复原中断向量 设置中断向量的DOS功能调用 把由AL指定的中断类型的中断向量DS:DX放在中断向量表中. 预置: AH= 25 H AL=中断类型号 DS:DX=中断向量 执行:INT 21 H 取中断向量的DOS功能调用 把由AL指定的中断类型的中断向量从中断向量表中取到ES:BX中 预置:AH = 35 H AL=中断类型号 执行:INT 21 H 例:使用DOS功能调用存取中断向量。
§ § § § MOV AL ,N ; MOV AH ,35 H ; INT 21 H ; PUSH ES PUSH BX PUSH DS MOV AX ,SEG INTNAND MOV DS ,AX MOV DX ,OFFSET INTHAND MOV AL ,N MOV AH ,25 H POP DS 利用功能号 35 H的DOS功能 调用把N类型的中断向量 取到ES:BX中,进行压栈 保存。 新的中断向量DS:DX利用 功能号 25 H的DOS功能调用 存入到中断向量表中。中 断类型为N。
§ § § § POP MOV INT RET DX DS AL ,N AH ,25 H 21 H ; ; 将原来压栈保护的中断向量 弹出到DS:DX中,利用功能 号 25 H的DOS功能调用再存入 到中断向量表中。 § INTHAND: INTHAND是新的中断服务 子程序的入口符号地址。 § IRET
§ § § § § 4.中断过程: 1. 保存返回地址CS:IP、 保存标志寄存器FLAGS。 2. CPU还自动清除IF位和 TF位,目的是使CPU转人中断 处理程序后, 不允许再产生 新的中断。 3. 转入中断服务程序。 1. FKAGS、CS、IP入栈 产生中断 2. 清除IF、TF 3. 转中断处理程序 INTHAND 中 断 服 务 1. IP、CS和FLAGS出栈 IRET 中断 返回 2. 返回断点,继续执 行下一条指令。
§ 5.中断优先级 § 中断优先级: CPU根据中断源的轻重缓急为中断源事先安排的中断优先级 次序。 § 当多个中断源同时向CPU请求中断时,CPU先比较它们的优先级,然后从优 先级高到优先级低的次序来依次处理各个中断源的中断请求。 § 8086规定中断的优先级次序为: § § 优先级高 软件中断(除法错,INTO,INT) § 非屏蔽中断(NMI) § 可屏蔽中断(INTR) § 低 单步中断 § § 可屏蔽中断的优先权又分为八级,在正常的优先级方式下,优先级次序是: 优先级高 低 IR 0,IR 1,IR 2,IR 3,IR 4,IR 5,IR 6,IR 7
§ § § § § 4. 4. 3 中断程序设计举例 中断处理程序的编写应注意: (1)中断处理程序若不允许被打断,则清除IF和TF,若允许其他设备中断, 则需用STI指令把IF位置 1。 (2)CPU产生一次中断,I/O设备只完成一个字节(或字)的输入/输出, 所以中断处理程序所用的指针变量或数据变量一般应设置存储单元来保存。 (3)硬件设备的中断处理结束后,一般要发出中断结束命令(E 0 I)。否则 将屏蔽同级或低级的中断。 例:编写一个中断处理程序,要求在主程序运行过程中,每隔 10 s响铃一次, 同时在屏幕上显示出信息“The bell is ring!”。 本例中用新设计的处理程序来代替原有的1 CH中断程序,为此: 在主程序的初始化部分,先保存当前1 CH的中断向量,再设置新的中断向量。 在主程序的结束部分恢复保存的1 CH中断向量。
§ § § § § SCATK 1 SEGMENT PARA STACK DW 100 DUP(?) STACK 1 ENDS DATA SEGMENT COUNT DW 1 MSG DB ‘The bell is ring’, 0 dh, 0 ah, ’$’ DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK 1 START: MOV AX ,DATA MOV DS ,AX MOV AL ,1 CH ;取功能号 1 CH的中断向量压栈保存 MOV AH ,35 H INT 21 H PUSH ES PUSH BX PUSH DS
§ MOV § MOV § INT § POP § 设置 IN § 时钟 AND § 中断 OUT § STI § MOV DELAY:MOV DELAY 1:DEC JNZ DX ,OFFSET RING AX ,SEG RING DS ,AX AL ,1 CH AH ,25 H 21 H DS 21 H AL ,11111110 B 21 H ,AL DI ,20000 SI ,30000 SI DELAY 1 DI DELAY 延时 ;子程序入口地址的偏移量送DX ;子程序入口地址的段基值送DS ;中断向量送 DS:DX POP MOV INT MAIN ENDP DX DS AL ,1 CH AH ,25 21 H AH ,4 CH 21 H
§ § § § § RING 显示 提示 语 PROC NEAR PUSH DS 保护 PUSH AX 寄存 PUSH CX 器 PUSH DX MOV AX ,DATA MOV DS ,AX STI ;开中断 DEC COUNT JNZ EXIT MOV DX ,OFFSET MSG MOV AH ,09 H INT 21 H MOV DX ,100 IN AL ,61 H AND AL ,0 FCH SOUNT: XOR AL ,02 H OUT 61 H ,AL 响 铃 MOV CX ,1400 H 程 WAIT 1: LOOP WAIT 1 序 DEC DX JNZ SOUNT MOV COUNT ,182 EXIT: CLI ;关中断 MOV AL ,20 H EOI=1清除 OUT 20 H ,AL 中断请求 POP DX POP CX 恢复 寄存 POP AX 器 POP DS IRET RING ENDP END START
§ § § § 4. 5 BIOS和DOS基本调用 在存储器系统中从地址0 FE 000 H开始的8 K ROM(只读存储器)中装有BIOS例 行程序:系统加电自检、引导装入、主要I/O设备的管理程序以及接口控制 等功能模块来处理所有的系统中断。 使用BIOS功能调用,给程序员编程带来很大方便。 DOS提供了一组系统功能调用子程序:包括I/O设备处理程序、文件管理 程序和一些其他的处理程序。 DOS操作比相应功能的BIOS操作更简易,而且对硬件的依赖性更少些。 BIOS中断类型 CPU中断类型 0 除法错 1 单步 2 非屏蔽中断 3 断点 4 溢出 5 打印屏幕 6 保留 7 保留 8259中断类型 8 系统定时器(IRQ 0) C COM 1控制器(IRQ 4) 9 键盘(IRQ 1) D I‘PT 2控制器(IRQ 5) A 彩色/图形接口(IRQ 2) E 磁盘控制器(IRQ 6) B COM 2控制器(IRQ 3) F LPT 1控制器(1 RQ 7)
§ BIOS中断类型 10 显示器I/O 12 取内存容量 14 RS— 232串行口 I/O 16 键盘I/O 18 ROM BASIC 1 A 时钟 § 用户应用程序 § 1 B 键盘终止地址(Ctrl-Break) § 4 A 报警(用户闹钟) § 数据表指针 § 1 D 显示器参数表 § 1 E 软盘参数表 § 1 F 图形字符扩展码 11 13 15 17 19 40 1 C 取设备信息 磁盘I/O 磁带I/O 打印机I/O 引导装入程序 软盘 BIOS 定时器 41 0﹟硬盘参数表 46 1﹟硬盘参数表 49 指向键盘增强服务变换表
§ DOS中断类型 § 20 程序终止 § 21 功能调用 § 22 终止地址 § 23 Ctrl-C 中断向量 § 24 严重错误向量 § 25 绝对磁盘读 § 26 绝对磁盘写 § § § § 27 28 29 2 A 2 E 2 F 30~ 3 F DOS功能与BIOS功能都通过软件中断调用。 基本步骤: (1)将调用参数装入指定的寄存器中; (2)如需功能号,把它装入AH; (3)如需子功能号,把它装入AL; (4)按中断号调用DOS或BIOS中断; (5)检查返回参数是否正确。 结束并驻留内存 键盘忙循环 快速写字符 网络接口 执行命令 多路转接接口 保留给DOS
§ 4. 5. 1 键盘I/O § 键盘由三种基本类型的键组成: § (1)字符数字键,如字母A(a)一Z(z),数字 0— 9以及%、$,#等常用字符。 § (2)扩展功能键,如Home,End,Backspace,Arrows,Return,Delete, Insert,Pg. Up,Pg. D,以及程序功能键F 1一F 10等。 § (3)和其他键组合使用的控制键,如A 1 t,Ctrl和Shift等。 § 字符数字键—ASCII码字符; § 扩展功能键产生一个动作: 如按下Home键能把光标移到屏幕的左上角,End 键使光标移到屏幕上文本的末尾; § 组合控制键改变其他键所产生的字符码。 § 1.字符码与扫描码 § 键盘上的每个键都对应一个扫描码,根据扫描码就能唯一地确定哪一个键 改变了状态。 § 字符码是每个键代表的字符和符号的ASCII码(祥见教材P 150页表 4. 6)
§ 2.BIOS键盘中断 § BIOS键盘中断(INT 16 H)的中断处理程序包括 3个不同的功能: § AH 功 能 返 回 参 数 § 0 从键盘读一字符 AL=字符码, AH=扫描码 § 1 读键盘缓冲区的字符 如ZF=0,AL=字符码, AH=扫描码 § ZF=1,缓冲区空 § 2 取键盘状态字节 AL=键盘状态字节 § 调用方法: § (1)功能号送入AH § (2)执行 INT 16 H 的BIOS中断 § 例如,要查看按键的扫描码和ASCII码,可以调用中断类型16 H的0功能。 § MOV AH , 0 ; AH←功能号 0, § INT 16 H § MOV BX , AX ;(X) BX) 扫描码和 ASCII码 A =( = § CALL BINHEX ;调用二进制转换十六进制的子程序
§ § § 键盘上不具有ASCII码的键,如Shift、Ctrl、Alt、Num Lock、Scro 11、 Ins和Caps lock等,按动了它们能改变其他键所产生的代码。是通过键盘状 态字节进行判断按动与否。 键盘状态字节 KB-FLAG 1=按下右移键R SHIFT 1=按下左移键L SHIFT 1=按下控制键CTRL 1=按下交替键ALT 1=SCOLL LOCK状态已变 1=NUM LOCK状态已变 1=CAPS LOCK状态已变 1=INSERT状态已变
§ § § § § 例:读取键盘状态字节,并以十六进制打印出来。 MOV AH, 02 H INT 16 H ; BIOS 16 H 中断 MOV BX , AX ;(X) BX) 键盘状态字节 A =( = CALL BINIHEX ; 转换十六进制打印 MOV DL , 0 DH ; 显示 CR字符( 02号 DOS功能调用) MOV AH , 02 H AGAIN: MOV AH , 02 H ; 功能号 02 H→AH INT 21 H JMP AGAIN
§ 3.DOS键盘功能调用 § DOS 键盘操作(INT 21 H 功能调用) AH 功 能 调用参数 返回参数 1 输入一个字符并显示 AL=字符 (检测Ctrl-C或Ctrl-break, 并调用INT 23 H结束程序) 6 读键盘字符,不回显 DL=0 FFH 有字符,AL=字符,ZF=0 无字符,AL=0 ,ZF=1 7 输入一个字符不显示 AL=字符 (不支持检测Ctrl-C或Ctrl-break) 8 输入一个字符不显示 AL=字符 (检测Ctrl-C或Ctrl-break, 并调用INT 23 H结束程序) A 输入字符到缓冲区 DS:DX;缓冲区首址 B 读键盘状态 AL=0 FFH 有键入 AL=00 H 无键入 C 清除键盘缓冲区 AL=键盘功能号 调用一种键盘功能 (1、6、7、8、A) § § § §
§ (1)单字符输入 § 交互程序中常常需要用户对一个提示做出应答,例如,程序显示出一串信息, 要求你回答Y或N,回答Y,程序将转入标号为YES的程序段,而回答N使程序转 入标号为NO的程序段,按下其他键程序就等待。 § GET-KEY: MOV AH , ; 1 AH←功能号 1 § INT 21 H § CMP AL , ’Y’ ; Y吗? 是 § JE YES ; Y, 是 转程序 YES § CMP AL , ’N’ ; N吗? 是 § JE NO ; N, 是 转程序 NO § JNE GET-KEY ;等待输入Y或N § 如果想检测Enter(Return)键,就要在指令中写出它的ASCII码0 DH,例如: § WAIT-HERE: MOV AH , ; 7 检测键,但不显示或不执行 § INT 21 H § CMP AL , 0 DH ; Enter吗?( 是 0 DH回车键的 ASCII码) § JNE WAIT-HERE
§ § § § 要求程序能接收功能键或数字组合键必须进行两次DOS调用,第一次回送 00,第二次回送扫描码。例如,程序显示出一个菜单,要求用户通过键入F 1, F 2或F 3来选择 1,2或 3项,按其他键则产生错误信息。 例:检测键盘输入的功能键 MOV AH , 7 INT 21 H ; 第一次回送 00 CMP AL , 0 JE GET-EC ; 0,功能键 为 JMP ERROR ; 0,转错误信息 非 GET-EC: MOV AH, 7 INT 21 H CMP AL , 3 BH ; F 1? JE OPTION 1 CMP AL , 3 CH ; F 2? JE OPTION 2 CMP AL , 3 DH ; F 3? JE OPTION 3 JMP ERROR ; 都不是,转错误信息
§ (2)输入字符串 § 中断 21 H的A功能从键盘读入一串字符并把它存人用户定义的缓冲区中。缓冲 区的第一个字节为预输入数,第二个字节为实际输入数,第三个字节起是输 入的字符串,最后一个为回车(0 DH)。例如: § LAMLEN DB 32 § ACTLEN DB ? CX←实际字符数 DS:DX指向第一个字 § STRING DB 32 DUP(?) ;建立缓冲区 符可用如下指令: § 执行输入字符串的指令: SUB AH,AH § LEA DX MAXLEN MOV AL,LAMLEN+1 ADD DX,2 § MOV AH ,0 AH § INT 21 H § 假定输入字符串为:ABCDEFGH ……XYZ↙的缓冲区: 20 H 1 AH § § A B C D E F G 实际输入字符数 预定输入字符数 X Y Z ↙ 26(1 AH)
§ § § § (3)清除键盘缓冲区 0 CH功能:清除键盘缓冲区,再执行AL指定的(1、6、7、8、AH)功能。 例如: MOV AH , 0 CH ; 清除以前键入的字符 MOV AL , 08 H ; 再执行 08号功能 INT 21 H 可以避免由于偶然超前打入的字符而出现的错误 (4)检验键盘状态 0 BH功能:如按键,则AL=0 FFH,如没按键,则AL=00,无论哪种都将继续执 行程序中的下一条指令。 例:未按键,程序不断循环,只要按下任意键,程序就退出循环并返回。 SOUNDER: ……. . MOV AH , 0 BH INT 21 H 按键AL=0 FFH,+1为 0 不按键AL=0,+1不为 0 INC AL 故非 0循环。 JNZ SOUNDER RET
§ § § § 4. 5. 2 显示器I/O 1.字符属性 屏幕上的字符,在存储器中由连续的两个字节表示,一个字节保存ASCII 码,另一个字节保存字符的属性。 在屏幕上处理字母、数字以及一些字符图形称为文本方式。 (1) 单色字符显示 单色显示属性字节: 7 6 5 4 3 2 1 0 背景 000=黑 111=白 § § § 闪烁 0=正常显示 1=闪烁显示 前景 000=黑 111=白 亮度 0=正常亮度 1=加强亮度
§ § § § § 单色显示的属性表 属性值(二进制) 00000001 000001111 01110000111 11110000 属性值(十六进制) 00 01 07 0 F 70 87 F 0 显示效果 无显示 黑底白字,下划线 黑底白字,正常显示 黑底白字,高亮度 白底黑字,反相显示 黑底白字,闪烁 白底黑字,反相闪烁 § (2)彩色字符显示 § 彩色文本显示时,属性字节选择前景(显示的字符)和背景的颜色。字符可 以选择 16种颜色中的一种,背景有8种颜色可以选择。 § 16色方式下的属性字节 BL R G 背景 闪烁 B I R G 前景 B
§ 16色字符方式颜色的组合 § § § 颜色 黑 蓝 绿 青 I 0 0 R 0 0 G 0 0 1 1 B 0 1 颜色 灰 浅蓝 浅绿 浅青 I 1 1 R 0 0 G 0 0 1 1 B 0 1 颜色 红 品红 棕 灰白 I 0 0 R 1 1 G 0 0 1 1 B 0 1 颜色 浅红 浅品红 黄 白 I 1 1 R 1 1 G 0 0 1 1 B 0 1 § 背景颜色只能是表中I为 0的8种颜色。如果前景和背景是同一种颜色,显 示出的字符是看不见的,但属性字节中的位7可以使字符闪烁(BL= 1)。 § 2.BIOS显示中断 § 中断类型10 H的部分显示操作及所用的寄存器表 § § § § AH 1 功能 置光标类型 2 置光标位置 3 读光标位置 调用参数 (CH)0~ 3=光标开始行 (CL)0~ 3=光标结束行 BH = 页号 DH = 行 DL = 列 BH = 页号 返回参数 CH/CL = 光标开始/结束行 DH/DL = 行/列
§ § § § § AH 5 6 功能 置当前显示页 屏幕初始化或上卷 7 屏幕初始化或下卷 8 读光标位置的 属性和字符 AL AL AL BH CH CL DH DL BH 调用参数 = 页号 = 上卷行数 = 0全屏幕为空白 = 卷入行属性 = 左上角行号 = 左上角列号 = 右下角行号 = 右下角列号 = 下卷行数 = 0全屏幕为空白 = 卷入行属性 = 左上角行号 = 左上角列号 = 右下角行号 = 右下角列号 = 显示页 返回参数 AH = 属性 AL = 字符
§ § § § § AH 9 A E 13 H 功能 在光标位置显示 字符及其属性 在光标位置 只显示字符 (光标前移) 显示字符串 调用参数 BH = 显示页 AL = 字符,BL = 属性 CX = 字符重复次数 BH = 显示页,AL = 字符 CX = 字符重复次数 AL = 字符 BL = 前景色 ES:BP = 串地址 CX = 串长度,BH = 页号 DH、DL = 其始行列 AL = 0,BL = 属性 串:CHAR,……,CHAR AL = 1, BL = 属性 串:CHAR,……,CHAR AL = 2 串:CHAR,ATTR,……,CHAR,ATTR AL = 3 串:CHAR,ATTR,……,CHAR,ATTR 返回参数/注释 光标跟随字符移动 光标返回起始位置 光标跟随串移动
§ § § § (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 0列 79列 MOV AH , 1 ; 功能号 1 0行 INT 10 H MOV DH , 4 ; 置光标位置 屏幕 文本方式 MOV DL , 5 ; 到第 5行第 6列 MOV BH , 0 24行 MOV AH , 2 ; 功能号 2 INT 10 H
§ (2)读光标位置 § INTl 0 H功能 3是读光标位置,BH指定页号。此功能把光标位置的行号回送 给DH,列号回送给DL。光标大小的参数填入CH和CL。 § 例:读 0页的当前光标位置。 § MOV AH, 3 § MOV BH, 0 § INT 10 H § (3)选择显示页 § INTl 0 H的功能 5可确定显存中的显示区域。ROM BIOS将CGA的显存分为 4页, 每页 25× 80个字符,或分为 8页,每页 25× 40个字符。每一页的起始地址在 1 KB 的边界。这 4页的起始地址分别为B 800: 0000,B 800: 1000,B 800: 2000, B 800: 3000。 § 例:选择显示页。 § MOV AL, vpage § MOV AH, 5 § INT 10 H
§ (4)清屏和卷屏 § INTl 0 H功能 6能使屏幕内容上卷指定的行,这个功能需要设置 7个参数。 § 例:编写清除全屏幕的子程序。 § CLEAR-SCREEN PROC NEAR § PUSH AX MOV DX , 0 功能号为 2: § PUSH BX MOV AH , 2 BH=0,BL=0 保护寄存器 置光标左上角 § PUSH CX INT 10 H § 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 10 H
§ § § § § 10 H的功能 7和功能 6类似,也能使屏幕(或窗口)初始化或使屏幕(或窗口) 的内容下卷指定的行。 例:清除左上角为(0,0),右下角为(24,39)的窗口,初始化为反相显 示,该窗口相当于全屏幕的左半部分。 MOV AH , 7 ; 功能号 7 MOV AL , 0 ; 全屏幕为空白 MOV BH , 0 ; 卷入行属性 MOV CH , 0 ; 左上角行号 0 MOV CL , 0 ; 左上角列号 0 MOV DH , 24 ; 右下角行号 MOV DL , 39 ; 右下角列号 INT 21 H 24 39
§ § § § 编写程序在屏幕的中间建立一个 20列宽和9行高的窗口,然后把键盘输入 的内容在这个窗口显示出来。键人的字符将被显示在窗口的最下面一行,每 当输入 20个字符,该行就向上卷动,9行字符输入完后,顶端行的内容消失。. CODE ESC-KEY EQU 1 BH ; 1 BH为 ESC的 ASCII码 30 50 WIN-ULC EQU 30 ; WIN-ULR EQU 8 8 WIN-LIC EQU 50 WIN-LRR EQU 16 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 10 H 置光标位置: 第 16行,第 30列
§ MOV CX , WIN-WIDTH § GET-CHAR: MOV AH, 1 ; 键盘输入字符,若是 § INT 21 H ; DOS调用 ESC则转到EXIT结束, § CMP AL, ESC-KEY ; ESC吗? 是 否连续输入 20个字符。 § JZ EXIT ; 是转 EXIT § LOOP GET-CHAR § MOV AH, 6 ; 6号功能 § MOX AL, 1 ; 上卷 1行 输入 20个 § MOV CH, WIN-ULR ; 上卷行的起始行列号 字符后, § MOV CL, WIN-ULC 进行上卷。 § MOV DH, WIN-LRR ; 上卷行的结束行列号 § MOV DL, WIN-LRC § MOV BH, 7 ; 字符属性 7,正常显示 § INT 10 H § JMP LOCATE § EXIT: MOV AH, 4 CH ; 返回 DOS § INT 21 H § MAIN ENDP § END MAIN
§ (5)字符显示 § 功能 9:字符及其属性输出到当前光标位置上 § 功能 0 A:字符输出到当前光标位置上 § 然后光标返回到它的初始位置,所以在当前光标位置上写一个字符之后,必 须用INT l 0 H的功能 02移动光标到下一个字符位置上。 § 例:置光标到 0显示页的(20,25) 例:在 0页(11,0)读字符及 § 位置,并以正常属性显示一个星号‘*’ 属性 MOV AH, 2 ; 2号功能 MOV AH, 2 § MOV BH, 0 设置光标: MOV DH, 设置光标: § MOV DH, 20 11 0页 20行25列 MOV DL, 0页 11行0列 § MOV DL, 25 0 § INT 10 H § MOV AH, 9 ; 9号功能 MOV AH, 8 读字符及 MOV AL, ’*’ ; 字符的 ASCII码 MOV BH, 0 属性: § MOV BH, 0 ; 显示页号 0 INT 10 H (AL)=字符 § MOV BL, 7 ; 正常显示 (AH)=属性 MOV CX, 1 ; 重复次数为 1 § INT 10 H
§ 例:在屏幕上显示一个用字符构成的“汽车”图形 § “汽车”由 7个字符组成,从左到右,车体是由字母R(ASCII码52 H)、1/ 2 阴影符(ASCII码B 1 H)以及两个实心方块(ASCII码DBH)组成。头两个字符用反 相属性显示,后两个用正常属性显示。两个车轮是字母O(ASCII码4 FH),它和 笑脸符(ASCII码02)都是以正常属性显示。 § 显示的位置可以用相对位移量来表示。R是显示的第一个字符,相对位移 量定为(0,0),阴影符在R的右边一列,相对R的位移量为(0,1),两个实心 方块都是在前一个字符的同一行的右边一列,位移量都为(0,1)。后轮相对 最后一个方块符行数加 1,列数不变,所以位移量为(1,0),前轮相对于后轮 的位移量为(0,一3),笑脸符相对于前轮的位移量为(一2,1)。 (-2,1) (0,0) (0,1) R (0,1) (0,-3) (1,0)
§ 每个字符由 4个参数表示:ASCII码,显示属性,相对的行和列位移量。可以 把它们定义在一个字符图形表里。 § D-SEG SEGMENT C-SEG SEGMENT § CAR DB 7 ASSUME CS:C-SEG,DS:D-SEG § DB 52 H,70 H,0,0 MAIN PROC FAR § DB OB 1 H,70 H,0,1 MOV AX,D-SEG 字 § DB 0 DBH,7,0,1 MOV DS,AX 符 屏幕 § DB 0 DBH,7,0,1 CALL CLEAR-S 图 初始化 形 § DB 4 FH, 7,1,0 LEA DI,CAR 表 § DB 4 FH,7,0,-3 MOV DH,10 H 图形表 § DB 2,7,-2,1 MOV DL,10 H 首址送 DI。 § D-SEG ENDS CALL DISP-C § MOV CX,4 C 00 H DH、DL R(52 H)70反相显示 为光标 § INT 21 H ½阴影符(B 1 H)反相 的初始 § MAIN ENDP 实方快(DBH)正常 位置。 O(4 FH)正常、笑脸符 (02 H)正常显示。
§ Clear-s proc near § PUSH AX § PUSH BX § PUSH DX § PUSH CX § MOV AH, 6 § MOV AL, 0 § MOV CH, 0 § MOV CL, 0 § MOV DH, 24 § MOV DL, 79 § MOV BH, 7 § INT 10 H § POP CX § POP DX § POP BX § POP AX § RET § Clear-s endp 寄存器压栈 ; 6号功能 ;上卷行数 ;左上角行号 ;左上角列号 ;右下角行号 ;右下角列号 屏幕 初始化 寄存器出栈
§ DISP-C PROC NEAR § PUSH AX § PUSH BX 设置当前页 § MOV AH,0 FH § INT 10 H § SUB CH,CH 设置显 MOV AH,9 示次数 INT 10 H § MOV CL,[DI] § INC DI POP CX § NECR:ADD DH,[DI+2] ADD DI,4 § ADD DL,[DI+3] LOOP NECR 定光标位置 § MOV AH,2 POP BX § INT 10 H 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号功能 显示字符 循环次数出栈 修改字符地址 循环显示
§ § § § § (6)彩色和字符串显示 属性字节的典型组合 7 6 5 4 3 2 显示颜色 BL R G B I R 黑底白字 0 0 0 黑底蓝字 0 0 0 蓝底红字 0 0 0 1 绿底青字 0 0 1 0 0 0 灰白底浅品红字 0 1 1 1 绿底灰字闪烁 1 0 1 0 例:在品红背景下,显示 5个浅绿色闪烁的星号。 MOV AH,9 ; 9号功能 MOV AL,’*’ ;*的ASCII码送AL MOV BH,0 ;显示页 0 1 MOV BL,0 DAH ;字符属性 MOV CX,05 INT 10 H ;重复次数 闪烁 1 G 0 0 0 1 0 0 0 B 0 1 1 0 十六进制 00 H 01 H 14 H 23 H 7 DH A 8 H 1 品红 1 0 1 浅绿 0
13 H功能显示字符串有4种方式,前两种方式(AL=0、1)要指定整个串的属 性,后两种方式(AL= 2,3)必须指定每个字符的属性。 例:在屏幕上以红底蓝字显示字符串:“WORLD SCENERY”。 STRG DB ‘WORLD SCENERY’ LNER EQU $ -STRG 0号功能设置显 MOV AL,3 MOV AH,13 H 示方式 80× 25 MOV AH,0 INT 16色文本方式。 10 H INT 10 H MOV BP,SEG STRG ES: BP字符串 MOV ES,BP 逻辑地址。 MOV BP,OFFSET STRG MOV CX,LNER CX字符串长度 MOV DX,0 DX=0: 0行、0列 MOV BL,41 H AL=0,串字符属性 MOV AL,0 BL=41 H,红底蓝字
§ 3.DOS显示功能调用 § DOS功能调用INT 21 H的显示操作: 两个是显示单字符的功能; 一个是显示 字符串功能,这些功能都自动向前移动光标。 § 表 INT 21 H显示操作 § AH 功 能 调 用 参 数 § 2 显示一个字符(检验Ctrl-Break) DL=字符 光标跟随字符移动 § 6 显示一个字符(不检验Ctrl-Break) DL=字符 光标跟随字符移动 § 9 显示字符串 DS:DX=串地址 串尾为$ § 光标跟随串移动 AH= 9是显示字符串,要求串尾字符必须为$字符(24 H)。 例: MESG DB ’HELLO CLASS’, 0 AH, 0 DH, ‘$ ’ MOV AH , 9 ;功能号 9 MOV DX , SEG MESG ;段基值送DS MOV DS , DX MOV DX , OFFSET MESG ;偏移地址送DX INT 21 H
§ 4. 5. 3 打印机I/O § 打印机通常是串行或并行接口。通过并行接口,打印机一次从处理器接 收 8位代码;通过串行接口,打印机每次从处理器接收一位代码。PC机一般适 用并行接口,所有打印机使ASCII标准。 § 打印机I/O的中断操作 § INT AH 功能 调用参数 返回参数 § 21 H 5 打印一个字符 DL=字符 § 17 H 0 打印一个字符 AL=字符 AH=状态字节 § 并送回状态字节 DX=打印机号 § 17 H 1 初始化打印机 DX=打印机号 AH=状态字节 § 送回状态字节 § 17 H 2 送回状态字节 DX=打印机号 AH=状态字节 § § § 状 态 字 节 打 印 机 应 答 位 纸 出 界 选择 打印 机 I/O 错 未 用 超 时
§ § 1.DOS打印功能 INT 21 H的功能 5把一个字符送到打印机,字符必须放在DL寄在存器中。 如果需要回车、换行等打印功能,必须由汇编语言程序送出回车、换行等字 符码。例:调用DOS功能打印字符。 § TEXT DB ‘Hello, everybody’ § COUNT EQU $-TEXT § 字符个数 § MOV CX, COUNT § MOV BX, 0 § NEXT: MOV AH, 5 5号功能 § MOV DL, TEXT[BX] 显示一个字符 § INT 21 H 修改地址 § INC BX § LOOP NEXT 循环显示 上述指令也适用于发送打印控制字符: TEXT DB 0 CH,’ Hello, everybody’,0 DH,0 AH 其中: 0 CH换页码,0 AH换行码。字串打印在新页,与下文有两个空行。
§ § § § 2.BIOS打印功能 BI()S 17 H中断指令提供了由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 17 H 功能l:初始化打印机,并回送打印机状态到AH寄存器。 MOV AH, 01 H ;功能号 1→AH MOV DX, 0 ;打印机号 0 →DX INT 17 H 这个操作要发送一个换页符,能把打印机头设置在一页的顶部。 功能 2:把状态字节读人AH寄存器。 例:应用BIOS和DOS功能调用,编写一个简单的打字程序(TYPER)。要求把从 键盘上接收的字符显示在屏幕上,并由打印机输出,在键盘上按下Esc键,即 退出程序。
§ § § § § SEGMENT STACK DB 30 H 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 9 EH,10 H,’$’ KEY-ESC EQU 1 BH ;KEY ESC KEY-CR EQU 0 DH ;KEY CR KEY-IF EQU 0 AH ;KEY LF CODE SEGMENT PRINT MACRO STR-ADDR ;定义宏,STR-ADDR是形式参数。 PUSH DX PUSH AX POP AX 定义一个显 示字符串的 MOV DX,STR-ADDR POP DX 宏。形式参 MOV AH,09 H PRINT ENDM 数为串地址 INT 21 H
§ MAIN PROC FAR § STI ;IF=0,开中断 § CLD ;DF=0 § MOV AH ,0 ;打印字符 § MOV DX ,0 ; 0号打印机 § INT 17 H § CALL CLER-SCRREN ;调用清屏子程序 § MOV AX ,DATA § MOV DS ,AX ;装填DS § MOV DX ,0 设置光标 位置: § MOV AH ,2 0列,0行。 § INT 10 H 显示字符串。 § PRINT IN-MSG § GE-CHAR:MOV AH ,1 键入字符 § INT 21 H § CMP AL ,KEY-ESC § JZ EXIT 为ESC,结束 开中断 指定 0号打印机 清屏幕 设置光标位置 显示提示语 键入字符 ESC? CR? AL→DL Y LF→DL 显示打印 Y 结束
§ § § § MOV INT CMP JNZ MOV INT INCDE: MOV INT JMP EXIT: MOV INT MAIN ENDP END DL ,AL AH ,5 21 H AL ,KEY-CR INCDE DL ,KEY-CF AH , 5 21 H AH ,2 21 H GET-CHAR AH ,4 CH 21 H MAIN 打印键盘输 入的字符。 非回车符,跳转 是回车符,打印 显示换行符。 继续键入 返回DOS 结束
§ § § 4.6 小 结 1.编制汇编语言的基本步骤 (1)分析所要解决的问题,确定适当的算法; (2)设计整个程序的逻辑结构,画出程序框图; (3)编写程序,正确使用指今、伪指令以及DOS、BIOS功能调 用,同时写出筒洁明了的说明和注释; (4)上机调试程序,学会使用DEBUG等调试 具。 2.中断程序的设计方法 对于要求以中断方式 作的I/O设备,它们的中断类型已由 硬件连线确定。主程序为中断所做的准备 作如下: (1)保存原中断向量(INT 21 H的35 H功能),设置新的中断向 量(INT 21 H的25 H功能); (2)设置设备的中断屏蔽位; (3)设置CPU的中断允许位(开中断); (4)在主程序结束前,恢复原中断向量。
§ § § § 主程序完成了上述准备 作后,I/O设备即以完全随机的方式产生中断。 当CPU响应了中断请求,中断系统将自动完成以下 作: (1)CPU接收外设的中断类型号; (2)当前的FLAGS、CS和IP的内容入栈保存; ‘ (3)清除IF和TF; (4)根据中断类型号取出中断向量送CS和IP; (5)转中断处理子程序。 中断处理子程序的编写方法: (1)保存 作寄存器内容; DOS和BIOS的调用方法: (2)如允许中断嵌套,则开中断(STI); (1)设置参数 (2)设置功能号 (3)处理中断任务; (3)中断调用 (4)关中断(CLI); 如:MOV DL ,’ ﹡ ’ (5)送中断结束命令(EOI)给中断命令 MOV AH,2 寄存器(只限硬件中断); INT 21 H (6)恢复 作寄存器内容; (7)返回被中断的程序(IRET)。
ac61d9b8d596f1d87b0420bb4b734915.ppt