最新微型计算机技术58612PPT课件

上传人:cl****1 文档编号:568511999 上传时间:2024-07-25 格式:PPT 页数:80 大小:1.11MB
返回 下载 相关 举报
最新微型计算机技术58612PPT课件_第1页
第1页 / 共80页
最新微型计算机技术58612PPT课件_第2页
第2页 / 共80页
最新微型计算机技术58612PPT课件_第3页
第3页 / 共80页
最新微型计算机技术58612PPT课件_第4页
第4页 / 共80页
最新微型计算机技术58612PPT课件_第5页
第5页 / 共80页
点击查看更多>>
资源描述

《最新微型计算机技术58612PPT课件》由会员分享,可在线阅读,更多相关《最新微型计算机技术58612PPT课件(80页珍藏版)》请在金锄头文库上搜索。

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

2、EGMENTN EQU 5A DW 5 DUP(?)DSEG ENDSCSEG SEGMENTMAIN PROC FAR ASSUME CS:CSEG, DS:DSEGSTART:MOV AX ,DSEG MOV DS ,AX NUM :ADD SI ,2 MOX CX, N LOOP LOOP2 DEC CX MOV CX ,DXLOOP1:MOV DX ,CX LOOP LOOP1 MOV SI ,0 MOV AH ,4CHLOOP2:MOV AX ,ASI INT 21H CMP AX ,ASI+2 MAIN ENDP JLE NUM XCHG AX,ASI+2 CSEG ENDS MO

3、V ASI,AX END START 42 分支程序设计4.2.1 分支程序结构 两路(单重)分支结构 多路(多重)分支结构 这两种结构都要求先对条件进行判定,然后根据判定结果确定执行哪路分支,判定一次只能有一路分支被选择。一般来讲一个条件两路分支;N个条件,2N路分支。判定条件判定条件ABABXYN 4.2.2 分支程序的设计方法 分支程序的实现方法有多种,最常用的方法有:利用比较和条件转移指令实现分支, 利用逻辑尺控制分支,以及利用地址跳转表实现分支等方法。例: X/2 X0 Y= 2 X=0 2X X0 这个问题可以通过X与0的比较,利用条件转移指令来确定三个计算分支中的某一支。 MOV

4、 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 ALXX0?AL2X=0?AL2AL2XALYNYN利用逻辑尺控制分支也是常见的一种分支程序设计方法。例:编写一个显示程序,要求显示A和B共8次,显示次序为A3次,B2次,A1次,B2次。因此,可设计一个逻辑尺:00011011,0表示显示A,1表示显尔B。编程时,逐值测试逻辑尺,是0则执行显示A的分支,是l则执行显示B的分支。部分程序如下: . . . MOV CX,8 MOV BL,0001

5、1011BLOP: SHL BL,1 JC M1 CALL AA1 JMP NEXT M1: CALL BB1NEXT: LOOP LOP HLTCX次数BL逻辑尺逻辑尺左移一位=1?执行A执行BYNCX-1=0?N分支程序设计时要注意各个分支一定要转入到公共操作上。本例和上例中的橙色框。 利用地址跳转表的方法主要用于多路分支(三路分支以上)的情况,下面通过一个实例来说明这种程序设计方法。 在调用DOS文件管理功能时,如出现了错误(如使用了非法功能号),DOS则根据AX中的错误码,将相应的错误信息显示出来。(AX)15各表示一种错误,其错误信息分别为ERl ER5。AX除l 5之外的数码是无效

6、的。(1)错误信息提示的地址分别为ERl ER5。(2)ERl ER5构成跳转表,表首地址为ERTAB。(3)表中各项的地址为表首址+(功能号-1)21号错误提示2号错误提示3号错误提示4号错误提示5号错误提示ER1ER2ER3ER4ER5ER1ER2ER3ER5ER4ERTABERTAB+2ERTAB+4ERTAB+6ERTAB+8DATA SEGMENT CMP AX ,5 OUTR DB “非15” JG OUTR ;5转至OUTRER1 DB “错误1提示” CMP AX ,1 ER2 DB “错误2提示” JGE TADR ;15转TADRER3 DB “错误3提示” OUTR: L

7、EA DX ,OUTRER4 DB “错误1提示” JMP DISPM ;转至DISPMER5 DB “错误1提示” TADR: MOV BX ,AXEVEN DEC BXERTAB DW ER1,ER2,ER3 SHL BX ,1 DW ER4,ER5 MOV DX ,ERTABBXDATA ENDS DISPM: MOV AH ,9CODE SEGMENT INT 21HSHOWERR PROC FAR POP BX ;恢复现场 ASSUME CS:CODE,DS:DATA POP DX MOV SI ,DATA POP AX MOV DS ,SI REG PHSU AX ;保护现场 SH

8、OWERR ENDP PUSH DX CODE ENDS PUSH BX END 4.3 子程序设计 子程序又称为过程,在程序实现中,如果要多次用到一些功能相同的程序段,那么就可以用伪操作PROC和ENDP把这些程序段定义成子程序。需要时用CALL指令来调用它,调用程序也称为主程序。 子程序有两种属性:NEAR(缺省的属性)和FAR。和调用程序在同一代码段中的子程序使用NEAR属性,和调用程序不在同一代码段中的子程序使用FAR属性。4.3.1 主程序与子程序之间的参数传送 主程序在调用子程序时,需要传送一些参数(入口参数)给子程序,子程序运行完后也要将运行结果(出口参数)回送给主程序。 利用寄

9、存器传送参数传送参数的方式: 利用存储区传送参数 利用堆栈传送参数 1利用寄存器传送参数 这种参数传送的方式方便、快速,但只适合传送参数较少的情况。 例:编写程序,将一个16位二进制数转换成用ASCII表示的十进制数。 这是一个常用的转换子程序,应提供给所有的用户调用。因此,要将该子程序的人口参数和出口参数注释清楚,方便调用。本例是通过DX和DI寄存器传递参数的。DATA SEGMENTOUTB DB 5 DUP (30H) N EQU 12345HDATA ENDSCOND SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX ,DATA MOV DS ,AX

10、 MOV DX ,N ;入口参数 LEA SI ,OUTB ;入口参数 CALL BIN-TO-ASC ;调子程序 MOV AX,4C00H INT 21H 入口参数: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

11、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。 2利用存储区传送参数参数存放在存储区中,入口参数为存储区首地址。适合参数较多的情况。 例:TABLE数组中存有15个十进制数,挑出最大数存放在MAX单元中。 DATA SEGMENT FOUNT PROCTABLE DB 4,6,8,4,9 MOV A

12、L ,SIN EQU 15 DEC CX MAX DB ? INC SIDATA ENDS LOP : CMP AL ,SICODE SEGMENT JG L1 ASSUME CS;CODE,DS:DATA MOV AL ,SISTART: 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 3. 利用堆栈传送函数 利用堆栈适合于传送参数多,而且子程序有

13、嵌套、递归调用的情况。主程序将参数或参数地址推入堆栈,子程序从堆栈中取出参数或参数地址。利用堆栈传送涵数一定要注意堆栈的变化,如果参数和返回地址混淆,会造成子程序不能正确返回的错误。例:调加密子程序将数组中的数据Aj加密。秘约规则为Aj2,再各位求反。DSEG SEGMENT START: MOV AX ,DSEG N EQU 20 MOV DS ,AXARAY DW N DUP(?) MOV AX ,SSEGDSEG ENDS MOV SS ,AXSSEG SEGMENT LEA SP ,TOP ;指定栈底 DW 64 DUP(?) LEA BX ,ARAYTOP LABEL WORD PU

14、SH BX ;首地址入栈SSEG ENDS MOV BX ,N ;个数入栈CSEG SEGMENT PUSH BX ASSUME CS:CSEG, CALL ECRY SS:SSEG, MOV AX ,4C00H DS:DSEG INT 21HECRY 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+6D

15、ONE: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 4.4 IO程序设计 信息交换 地址端口 : 地址信息 主机 I/O接口 数据端口 : 状态信息 状态端口 : 数据信息4.4.1 直接控制 IO的程序设计 1IO端口 在80x86微机中,IO端口编址在一个独立的地址空间中,这个IO空间允许设置64K(65536)个8位端口或32K(32768)个16位端口。 2

16、IO程序举例对于IO和存储器分离的地址空间系统,80x86有专门的IO指令与端口进行通信。下面通过几个IO程序的例子,说明使用IO指令直接在端口级上输入输出的方法。 输入指令 输出指令IN AN, 30H OUT 30H ,ALIN AX, 40H OUT 40H ,AXIN AL, DX ;DX16位端口地址 OUT DX ,AX ;DX16位端口地址 IN AX, DX ;DX16位端口地址 OUT DX ,AX ;DX16位端口地址 例: SOUND程序。 程序通过IO指令使设备控制寄存器(1O端口地址为61H)的第1位交替为0和l,而61H端口的第l位和扬声器的脉冲门相连,交替为0和l

17、的脉冲电流被放大后送到扬声器使之发出了声音。 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 RETDELAY:LOOP DELAY SOUND ENDP1/0与门放大器端口 61H本例中CX=6000它决定发声频率值小声音尖锐,值大声音低沉。DX=1000决定发声时间长短。 例:PRTCHAR程序。 这是一个采用查询方

18、式的打印字符程序。程序通过反复渎取并测试打印机的状态来控制输出。在打印机接口中,数据寄存器的端口地址为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控制寄存器 端口37AHDATA SEGMENT MOV DX,37AHMESS DB PRINTER IS NO

19、RMAL MOV AL,0DH ;选通输出COUNT EQU -MESS OUT DX,ALDATA ENDS MOV AL,0CH CSEG SEGMENT OUT DX,AL ASSUME CS:CSEG,DS:DATA INC SISTART:MOV AX,DATA LOOP NEXT MOV DX,AX MOV AH,4CH LEA SI,MESS ;建地址指针 INT 21H MOV CX,COUNT;CX次数 CSEG ENDSNEXT: MOV DX,379H ;DX状态地址 END START WAIT: IN AL,DX ;AL状态端口 TEST AL,80H ;测忙否 JZ

20、 WAIT ;忙(=0)再测 MOV AL,SI ;不忙,输出 MOV DX,378H ;DX数据地址 OUT DX,AL TEST指令测状态寄存器的第7位,为0表示忙,循环再测,直至为1空闲时,再取字符输 出打印。称为查询方式。 0DH为控制寄存器选通信号, 0CH为结束选通。 又例:CPU要从3个设备轮流输人数据,PROCl,PROC2,PROC3分别是设备l,设备2和设备3的数据输入程序,它们的状态寄存器的端口地址分别用STAT1,STAT2,STAT3表示,这三个状态寄存器的5位是输入准备位。轮流查询三个数据输入设备的程序段:INPUT: IN AL ,STAT1 ;AL状态寄存器1

21、TEST AL ,20H ;输入准备好? JZ DEV2 ;否,转DEV2 CALL FAR PTR PROC1 ;准备好,调PROC1DEV2: IN AL ,STAT2 TEST AL ,20H JZ DEV3 CALL FAR PTR PROC2DEV3: IN AL ,STAT3 TEST AL ,20H JZ NO-INPUT CALL FAR PTR PROC1NO-INPUT:查询方式的优点:可以安排优先次序,最先查询的设备优先级最高。修改查询次序就修改了设备的优先级。缺点:查询等待浪费CPU的时间,在设备多时由询问转向处理程序的时间较长。4.4.2 中断程序设计 中断是一种使C

22、PU中止正在执行的程序而转去处理特殊事件的操作,引起中断的事件称为中断源。 中断是CPU和外部设备进行输入输出的有效方法。可以避免因反复查询外部设备的状态而浪费时间,从而提高CPU的效率。 中断源分为软件中断(或称内中断)和硬件中断(或称外中断),系统通过分配给这些中断的类型号来加以识别和处理。 80x86中断源及其中断类型号 IR0 8259A IR1 可编程 IR2 中断 IR3 控制器 IR4 (PIC) IR5 IR6 IR708系统定时器09键盘0A彩色/图形0B串行COM20C串行COM10D LTP2控制0E磁盘控制器0F LTP1控制非屏蔽中断请求中断逻辑INTn指令单步TF=

23、1除法错误INT0指令INTRNMI2401nCPU 1.软件中断的执行 (1)中断指令INT n的执行。 CPU执行一条INTn指令时,中断系统立即产生类型为n的中断,并且通过中断向量调用相应的中断处理程序来完成其中断功能。 (2)处理CPU某些错误的中断。 除法错中断:在执行除法指令时,若发现除数为0或商超过了寄存器所能表达的范围,则立即产生一个类型为0的中断。 溢出中断:有一条专门的指令INTO来中断发生溢出的算术操作。如果OF1,INTO指令引起中断,如OF:0,则不发生中断,CPU继续运行原程序。溢出中断的类型号为4。 (3)为调试程序没置的中断。 单步中断:单步是一种很有用的调试方

24、法。当标志位TF设置为l时,每条指令执行后,CPU自动产生类型号为1的单步中断。 断点中断:断点可以设置在程序的任何地方,设置断点实际上是把一条断点指令INT3插入程序中,CPU每执行到断点处的INT3指令便产生一个中断。 INT指令和INTO指令产生的中断。以及除法错中断都不能被禁止,并且比任何外部中断的优先权都高。2硬件中断的执行 硬件中断:非屏蔽中断(NMI) 外部设备的请求引起的可屏蔽中断。 CPU响应中断的条件:该外设的中断请求是否屏蔽:中断屏蔽寄存器(IMR) CPU是否允许响应中断:标志寄存器中断允许位IF 中断屏蔽寄存器(IMR)的IO端口地址是21H。通过设置这个寄存器的某位

25、为0允许中断;为1禁止(屏蔽)中断。 中断屏蔽寄存器 7 6 5 4 3 2 1 0 (I/O端口20H) 打 软 硬 串 串 保 键 定 印 行 行 时 机 盘 盘 通 通 留 盘 器 信 信例:只允许键盘中断,可设置如下中断屏蔽字: MOV AL ,11111101B ;AL中断屏蔽字 OUT 21H ,AL ;送入中断屏蔽寄存器IMR 如果系统增设键蛊中断,则可用下列指令实现: IN AL ,21H ;取中断屏蔽字 AND AL ,11111101B ;将第1为置0,保留其余位不变 OUT 21H ,AL ;回送21H端口 中断标志位IF的设置: STI ;设置中断允许位(IF1),允许

26、中断(开中断) CLI ;清除中断允许位(1F0),禁止中断(关中断) 中断命令寄存器 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 ; RSL EOI00L2L1L03. 中断操作步骤 80868088中断系统能处理256种类型的中断,类型号为00FFH。中断向量表是各类型中断处理程序的人口地址表。中断向量的地址可由中断类型号乘

27、以4计算出来。以BIOS中断INT 4AH为例,表示出中断操作的以下5个步骤:取中断类型号;计算中断向量地址;取中断向量,偏移地址送IP,段地址送CS;转人中断处理程序;中断返问到INT指令的下一条指令。 类型49H中断向量0518F000类型4BH中断向量0:1280:1290:12A0:12B0:124INT 4AHMOV CX,30H向量地址=4AH4=128STI PUSH DSIRET 1805F000IPCS中断处理程序F000:1805采用向量中断可加快CPU中断处理速度。 利用保留的中断类型号扩充中断功能,需要在中断向量表中建立相应的中断向量。为中断类型N设置中断向量的方法:

28、MOV AX ,0 MOV ES ,AX MOV BX ,N4 MOV AX ,OFFSET INHAND MOV ES :WORD PTR BX ,AX MOV AX ,SEG INHAND MOV ES :WORD PTRBX+2 ,AX INHAND: IRET中断向量表子程序IRET INHAND(BX)= N4(BX)+2OFFSET INHANDSEG INHAND0:0000IPCS 用自己编写的中断处理程序代替系统中的某个中断处理功能时:(1)利用DOS功能调用(21H)保存原中断向量(2)设置新的中断向量;(3)在程序结束之前恢复原中断向量设置中断向量的DOS功能调用 把由A

29、L指定的中断类型的中断向量DS:DX放在中断向量表中 预置: AH25H AL中断类型号 DS:DX中断向量 执行:INT 21H 取中断向量的DOS功能调用 把由AL指定的中断类型的中断向量从中断向量表中取到ES:BX中 预置:AH 35H AL中断类型号 执行:INT 21H例:使用DOS功能调用存取中断向量。 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 D

30、S 利用功能号35H的DOS功能调用把N类型的中断向量取到ES:BX中,进行压栈保存。 新的中断向量DS:DX利用功能号25H的DOS功能调用存入到中断向量表中。中断类型为N。 POP DX ; POP DS ; MOV AL ,N MOV AH ,25H INT 21H RETINTHAND: IRET将原来压栈保护的中断向量弹出到DS:DX中,利用功能号25H的DOS功能调用再存入到中断向量表中。 INTHAND是新的中断服务子程序的入口符号地址。 4中断过程中断过程: 1.保存返回地址CS:IP、保存标志寄存器FLAGS。 2.CPU还自动清除IF位和TF位,目的是使CPU转人中断处理程

31、序后, 不允许再产生新的中断。 3.转入中断服务程序。 IRET中断服务1.FKAGS、CS、IP入栈2.清除IF、TF3.转中断处理程序 INTHAND产生中断1.IP、CS和FLAGS出栈2.返回断点,继续执行下一条指令。中断返回5中断优先级 中断优先级: CPU根据中断源的轻重缓急为中断源事先安排的中断优先级次序。 当多个中断源同时向CPU请求中断时,CPU先比较它们的优先级,然后从优先级高到优先级低的次序来依次处理各个中断源的中断请求。 8086规定中断的优先级次序为: 优先级高 软件中断(除法错,INTO,INT) 非屏蔽中断(NMI) 可屏蔽中断(INTR) 低 单步中断 可屏蔽中

32、断的优先权又分为八级,在正常的优先级方式下,优先级次序是: 优先级高 低 IR0,IR1,IR2,IR3,IR4,IR5,IR6,IR7 4.4.3 中断程序设计举例 中断处理程序的编写应注意: (1)中断处理程序若不允许被打断,则清除IF和TF,若允许其他设备中断,则需用STI指令把IF位置1。 (2)CPU产生一次中断,IO设备只完成一个字节(或字)的输入输出,所以中断处理程序所用的指针变量或数据变量一般应设置存储单元来保存。 (3)硬件设备的中断处理结束后,一般要发出中断结束命令(E0I)。否则将屏蔽同级或低级的中断。 例:编写一个中断处理程序,要求在主程序运行过程中,每隔10s响铃一次

33、,同时在屏幕上显示出信息“The bell is ring!”。 本例中用新设计的处理程序来代替原有的1CH中断程序,为此: 在主程序的初始化部分,先保存当前1CH的中断向量,再设置新的中断向量。 在主程序的结束部分恢复保存的1CH中断向量。SCATK1 SEGMENT PARA STACK DW 100 DUP(?)STACK1 ENDSDATA SEGMENTCOUNT DW 1MSG DB The bell is ring,0dh,0ah,$DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK1START:

34、MOV AX ,DATA MOV DS ,AX MOV AL ,1CH ;取功能号1CH的中断向量压栈保存 MOV AH ,35H INT 21H PUSH ES PUSH BX PUSH DS 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 ,3

35、0000 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 设置时钟中断延时 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

36、;开中断 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清除中断请求保护寄存器恢复寄存器 4.5 BIOS和DOS基本调用 在存储器系统中从地址0FE000H开始的8K ROM(只读存储器)中装有BIOS例行程序:系统加电自检、引导装入、主要IO

37、设备的管理程序以及接口控制等功能模块来处理所有的系统中断。 使用BIOS功能调用,给程序员编程带来很大方便。 DOS提供了一组系统功能调用子程序:包括IO设备处理程序、文件管理程序和一些其他的处理程序。 DOS操作比相应功能的BIOS操作更简易,而且对硬件的依赖性更少些。 BIOS中断类型 CPU中断类型 0 除法错 1 单步 2 非屏蔽中断 3 断点 4 溢出 5 打印屏幕 6 保留 7 保留 8259中断类型 8 系统定时器(IRQ0) C COM1控制器(IRQ4) 9 键盘(IRQ1) D IPT2控制器(IRQ5) A 彩色图形接口(IRQ2) E 磁盘控制器(IRQ6) B COM

38、2控制器(IRQ3) F LPT1控制器(1RQ7)BIOS中断类型 10 显示器IO 11 取设备信息 12 取内存容量 13 磁盘IO 14 RS232串行口 IO 15 磁带IO 16 键盘IO 17 打印机IO 18 ROM BASIC 19 引导装入程序 1A 时钟 40 软盘 BIOS用户应用程序 1B 键盘终止地址(Ctrl-Break) 1C 定时器 4A 报警(用户闹钟)数据表指针 1D 显示器参数表 41 0硬盘参数表 1E 软盘参数表 46 1硬盘参数表 1F 图形字符扩展码 49 指向键盘增强服务变换表DOS中断类型 20 程序终止 27 结束并驻留内存 21 功能调用

39、 28 键盘忙循环 22 终止地址 29 快速写字符 23 Ctrl-C 中断向量 2A 网络接口 24 严重错误向量 2E 执行命令 25 绝对磁盘读 2F 多路转接接口 26 绝对磁盘写 303F 保留给DOS DOS功能与BIOS功能都通过软件中断调用。 基本步骤: (1)将调用参数装入指定的寄存器中; (2)如需功能号,把它装入AH; (3)如需子功能号,把它装入AL; (4)按中断号调用DOS或BIOS中断; (5)检查返回参数是否正确。4.5.1 键盘IO 键盘由三种基本类型的键组成: (1)字符数字键,如字母A(a)一Z(z),数字09以及、,#等常用字符。 (2)扩展功能键,如

40、Home,End,Backspace,Arrows,Return,Delete,Insert,PgUp,PgD,以及程序功能键F1一F10等。 (3)和其他键组合使用的控制键,如A1t,Ctrl和Shift等。 字符数字键ASCII码字符; 扩展功能键产生一个动作:如按下Home键能把光标移到屏幕的左上角,End键使光标移到屏幕上文本的末尾; 组合控制键改变其他键所产生的字符码。 1字符码与扫描码 键盘上的每个键都对应一个扫描码,根据扫描码就能唯一地确定哪一个键改变了状态。 字符码是每个键代表的字符和符号的ASCII码(祥见教材P150页表4.6) 2BIOS键盘中断 BIOS键盘中断(INT

41、 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 ;调用二进制转换十六进制的子程序 键盘上不具有ASCI

42、I码的键,如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 例:读取键盘状态字节,并以十六进制打印出来。 MOV AH,02H INT 16H ;BIOS 16H 中断 MOV BX ,AX ;(AX)=(BX)= 键盘状态字

43、节 CALL BINIHEX ;转换十六进制打印 MOV DL ,0DH ;显示CR字符(02号DOS功能调用) MOV AH ,02HAGAIN:MOV AH ,02H ;功能号 02HAH INT 21H JMP AGAIN 3DOS键盘功能调用 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-

44、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)(1)单字符输入交互程序中常常需要用户对一个提示做出应答,例如,程序显示出一串信息,要求你回答Y或N,回答Y,程序将转入标号为YES的程序段,而回答N使程序转入标号为NO的程序段,按下其他键程序就等待。GET-KEY: MOV AH ,1 ;AH功能号1 INT 21H CM

45、P 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 要求程序能接收功能键或数字组合键必须进行两次DOS调用,第一次回送00,第二次回送扫描码。例如,程序显示出一个菜单,要求用户通过键入F1,F2或F3来选择1

46、,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 ;都不是,转错误信息 (2)输入字符串中断21H的A功能从键盘读入一串字符并把它存人用户定义的缓冲区中。缓冲区的第一个字节为预输入数,第二个字节为实

47、际输入数,第三个字节起是输入的字符串,最后一个为回车(0DH)。例如: LAMLEN DB 32 ACTLEN DB ? STRING DB 32 DUP(?) ;建立缓冲区执行输入字符串的指令: LEA DX MAXLEN MOV AH , 0AH INT 21H假定输入字符串为:ABCDEFGH XYZ的缓冲区: 实际输入字符数 26(1AH) 预定输入字符数20H 1AHABC DEFGXYZ CX实际字符数 DS:DX指向第一个字 符可用如下指令: SUB AH,AH MOV AL,LAMLEN+1 ADD DX,2 (3)清除键盘缓冲区 0CH功能:清除键盘缓冲区,再执行AL指定的(

48、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循环。 4.5.2 显示器IO 1字符属性 屏幕上的字

49、符,在存储器中由连续的两个字节表示,一个字节保存ASCII码,另一个字节保存字符的属性。 在屏幕上处理字母、数字以及一些字符图形称为文本方式。 (1) 单色字符显示 单色显示属性字节: 7 6 5 4 3 2 1 0 闪烁 亮度 0正常显示 0正常亮度 1闪烁显示 1加强亮度 背景前景 000=黑111=白000=黑111=白 单色显示的属性表属性值(二进制) 属性值(十六进制) 显示效果 00000000 00 无显示 00000001 01 黑底白字,下划线 00000111 07 黑底白字,正常显示 00001111 0F 黑底白字,高亮度 01110000 70 白底黑字,反相显示 1

50、0000111 87 黑底白字,闪烁 11110000 F0 白底黑字,反相闪烁(2)彩色字符显示 彩色文本显示时,属性字节选择前景(显示的字符)和背景的颜色。字符可以选择16种颜色中的一种,背景有8种颜色可以选择。 16色方式下的属性字节BLRGBIRGB闪烁背景前景 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 棕

51、 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可以使字符闪烁(BL1)。 2BIOS显示中断 中断类型10H的部分显示操作及所用的寄存器表AH 功能 调用参数 返回参数1 置光标类型 (CH)03=光标开始行 (CL)03=光标结束行 BH = 页号 2 置光标位置 DH = 行 DL = 列3 读光标位置 BH = 页号 CH/CL = 光标开始/结束行 DH/DL = 行/列AH 功能 调用参数 返回参数 5

52、置当前显示页 AL = 页号 6 屏幕初始化或上卷 AL = 上卷行数 AL = 0全屏幕为空白 BH = 卷入行属性 CH = 左上角行号 CL = 左上角列号 DH = 右下角行号 DL = 右下角列号7 屏幕初始化或下卷 AL = 下卷行数 AL = 0全屏幕为空白 BH = 卷入行属性 CH = 左上角行号 CL = 左上角列号 DH = 右下角行号 DL = 右下角列号8 读光标位置的 BH = 显示页 AH = 属性 属性和字符 AL = 字符AH 功能 调用参数 返回参数/注释9 在光标位置显示 BH = 显示页 字符及其属性 AL = 字符,BL = 属性 CX = 字符重复次

53、数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 光标跟随串移动 (1)控制光标 功能

54、1:光标显现或关闭。 CH和CL的低4位(03)存放光标行开始和结束的数据,当CH的第4位为1时,光标不显现出来(关闭);当第4位为0时,光标在屏幕上显现出来。单色显示器的光标大小的范围从013。 功能2:设置光标位置。光标位置的行号设在DH中,列号设在DL中。在2580的显示方式中,坐标(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 ,

55、4 ;置光标位置 MOV DL ,5 ;到第5行第6列 MOV BH ,0 MOV AH ,2 ;功能号2 INT 10H 屏幕文本方式0行24行0列79列(2)读光标位置 INTl0H功能3是读光标位置,BH指定页号。此功能把光标位置的行号回送给DH,列号回送给DL。光标大小的参数填入CH和CL。 例:读0页的当前光标位置。 MOV AH,3 MOV BH,0 INT 10H(3)选择显示页 INTl0H的功能5可确定显存中的显示区域。ROM BIOS将CGA的显存分为4页,每页2580个字符,或分为8页,每页2540个字符。每一页的起始地址在1KB的边界。这4页的起始地址分别为B 800:

56、0000,B 800:1000,B 800:2000,B 800:3000。 例:选择显示页。 MOV AL,vpage MOV AH,5 INT 10H (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 C

57、H ,0 ;左上行号 RET MOV CL ,0 ;左上列号 CLEAR-SCREEN ENDP MOV DH ,24 ;右下行号 MOV DL ,79 ;右下列号 INT 10H 功能号为2: BH=0,BL=0 置光标左上角保护寄存器恢复寄存器 10H的功能7和功能6类似,也能使屏幕(或窗口)初始化或使屏幕(或窗口)的内容下卷指定的行。 例:清除左上角为(0,0),右下角为(24,39)的窗口,初始化为反相显示,该窗口相当于全屏幕的左半部分。 MOV AH ,7 ;功能号7 MOV AL ,0 ;全屏幕为空白 MOV BH ,0 ;卷入行属性 MOV CH ,0 ;左上角行号 MOV CL

58、 ,0 ;左上角列号 MOV DH ,24 ;右下角行号 MOV DL ,39 ;右下角列号 INT 21H002439 编写程序在屏幕的中间建立一个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:

59、MOV AH ,2 MOV DH,WIN-LRR ;DH=16 MOV DL,WIN-ULC ;DL=30 MOV BH,0 ;无显示 INT 10H8163050置光标位置: 第16行,第30列 MOV CX ,WIN-WIDTHGET-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 ;上卷行的结

60、束行列号 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个字符后, 进行上卷。(5)字符显示 功能9:字符及其属性输出到当前光标位置上 功能0A:字符输出到当前光标位置上然后光标返回到它的初始位置,所以在当前光标位置上写一个字符之后,必须用INT l0H的功能02移动光标到下一个字符位置上。例:置光标到0显示页的(20,25) 例:在0页(11,0)读字符及

61、位置,并以正常属性显示一个星号* 属性 MOV AH,2 ;2号功能 MOV AH,2MOV BH,0 MOV BH,0 MOV DH,20 MOV DH,11 MOV DL,25 MOV DL,0INT 10H INT 10HMOV AH,9 ;9号功能 MOV AH,8 MOV AL,* ;字符的ASCII码 MOV BH,0MOV BH,0 ;显示页号0 INT 10HMOV BL,7 ;正常显示 MOV CX,1 ;重复次数为1INT 10H设置光标:0页20行25列设置光标:0页11行0列读字符及属性:(AL)=字符(AH)=属性例:在屏幕上显示一个用字符构成的“汽车”图形 “汽车”

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

63、轮的位移量为(一2,1)。R(-2,1)(0,0)(0,1)(0,1)(0,1)(1,0)(0,-3)每个字符由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

64、 4FH,7,0,-3 MOV DH,10H DB 2,7,-2,1 MOV DL,10HD-SEG ENDS CALL DISP-C MOV CX,4C00H INT 21H MAIN ENDP字符图形表屏幕初始化R(52H)70反相显示阴影符(B1H)反相实方快(DBH)正常O(4FH)正常、笑脸符(02H)正常显示。 图形表首址送DI。DH、DL为光标的初始位置。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 ;左上角列号 MO

65、V DH,24 ;右下角行号 MOV DL,79 ;右下角列号 MOV BH,7 INT 10H POP CX POP DX POP BX POP AX RETClear-s endp寄存器压栈寄存器出栈屏幕初始化 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 CXNECR: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 R

66、ET 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 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

67、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 10H1 1 0 1 1 0 1 0闪烁 品红 浅绿 13H功能显示字符串有4种方式,前两种方式(AL=0、1)要指定整个串的属性,后两种方式(AL2,3)必须指定每个字符的属性。 例:在屏幕上以红底蓝字显示字符串:“WORLD SCENERY”。 STRG DB WORLD SCENERY LNER

68、 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,00号功能设置显示方式802516色文本方式。ES:BP字符串逻辑地址。 CX字符串长度DX=0:0行、0列AL=0,串字符属性BL=41H,红底蓝字ah3DOS显示功能调用 DOS功能调用INT 21H的显示操作:两个是显示单字符的功能;一个是显示字符串功能,这些功能都自动向前移动光标。 表 INT 21H显示操作

69、AH 功 能 调 用 参 数 2 显示一个字符(检验Ctrl-Break) DL=字符 光标跟随字符移动 6 显示一个字符(不检验Ctrl-Break) DL=字符 光标跟随字符移动 9 显示字符串 DS:DX=串地址 串尾为 光标跟随串移动 AH9是显示字符串,要求串尾字符必须为字符(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 21H4.5.3 打印机IO 打印机通常是串行或并行接口。通过并行

70、接口,打印机一次从处理器接收8位代码;通过串行接口,打印机每次从处理器接收一位代码。PC机一般适用并行接口,所有打印机使ASCII标准。 打印机IO的中断操作INT AH 功能 调用参数 返回参数21H 5 打印一个字符 DL=字符17H 0 打印一个字符 AL=字符 AH=状态字节 并送回状态字节 DX=打印机号17H 1 初始化打印机 DX=打印机号 AH=状态字节 送回状态字节17H 2 送回状态字节 DX=打印机号 AH=状态字节 打 应 纸 选择 I/O 未 未 超 印 答 出 打印 错 用 用 时 机 位 界 机 状态字节 1DOS打印功能 INT 21H的功能5把一个字符送到打印

71、机,字符必须放在DL寄在存器中。如果需要回车、换行等打印功能,必须由汇编语言程序送出回车、换行等字符码。例:调用DOS功能打印字符。TEXT DB Hello,everybody COUNT EQU -TEXT MOV CX,COUNT MOV BX,0 NEXT: MOV AH,5 MOV DL,TEXTBX INT 21H INC BX LOOP NEXT字符个数5号功能显示一个字符修改地址循环显示上述指令也适用于发送打印控制字符: TEXT DB 0CH, Hello,everybody,0DH,0AH,0AH其中:0CH换页码,0AH换行码。字串打印在新页,与下文有两个空行。 2BIO

72、S打印功能 BI()S17H中断指令提供了由AH寄存器指定的三种不同的操作。 功能0:打印一个字符。功能号0在AH中,字符放在AL中,打印机号放在DX中,BI()S最多允许连接三台打印机,机号分别为0,1和2。单打印机时为0号打印机。返回状态信息在AH中。例: MOV AH,0 ;功能号0AH MOV AL,CHAR ;字符AL MOV DX,0 ;打印机号0 DX INT 17H 功能l:初始化打印机,并回送打印机状态到AH寄存器。 MOV AH,01H ;功能号1AH MOV DX,0 ;打印机号0 DX INT 17H 这个操作要发送一个换页符,能把打印机头设置在一页的顶部。 功能2:把

73、状态字节读人AH寄存器。 例:应用BIOS和DOS功能调用,编写一个简单的打字程序(TYPER)。要求把从键盘上接收的字符显示在屏幕上,并由打印机输出,在键盘上按下Esc键,即退出程序。 SEG SEGMENT STACK DB 30H DUP(?)SEG ENDPDATA SEGMENTIN-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 ESCKEY-CR EQU 0DH ;KEY CRKEY

74、-IF EQU 0AH ;KEY LFCODE SEGMENTPRINT MACRO STR-ADDR ;定义宏,STR-ADDR是形式参数。 PUSH DX PUSH AX POP AX MOV DX,STR-ADDR POP DX MOV AH,09H PRINT ENDM INT 21H定义一个显示字符串的宏。形式参数为串地址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 ;装填D

75、S 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?ALDLLFDL显示打印YY 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

76、-CHAREXIT: MOV AH ,4CH INT 21H MAIN ENDP END MAIN 打印键盘输入的字符。非回车符,跳转是回车符,打印显示换行符。继续键入返回DOS结束 46 小 结 1编制汇编语言的基本步骤 (1)分析所要解决的问题,确定适当的算法; (2)设计整个程序的逻辑结构,画出程序框图; (3)编写程序,正确使用指今、伪指令以及DOS、BIOS功能调用,同时写出筒洁明了的说明和注释; (4)上机调试程序,学会使用DEBUG等调试工具。 2中断程序的设计方法 对于要求以中断方式工作的IO设备,它们的中断类型已由硬件连线确定。主程序为中断所做的准备工作如下: (1)保存原中

77、断向量(INT 21H的35H功能),设置新的中断向量(INT 21H的25H功能); (2)设置设备的中断屏蔽位; (3)设置CPU的中断允许位(开中断); (4)在主程序结束前,恢复原中断向量。 主程序完成了上述准备工作后,IO设备即以完全随机的方式产生中断。当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 结束语结束语谢谢大家聆听!谢谢大家聆听!80

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号