E N D
第6章 数据传送程序 从本章起,开始介绍IBM-PC机汇编指令的具体格式、功能和用法,以及各种寻址方式在程序设计中的应用。为使读者便于掌握宏汇编语言程序设计的基本方法,以后各章都配有大量的实例程序。并且为使读者能更灵活地进行汇编语言程序设计,程序实例中尽量选用不同的程序设计方法。 数据传送指令是汇编语言程序设计中最常用的指令。本章将详细介绍汇编语言数据传送指令的格式、功能及用法;结合数据传送程序设计的实例介绍各种寻址方式的使用方法;介绍堆栈的基本用法;并将介绍数据的基本输入/输出方法。IBM-PC机有四类数据传送指令:通用传送,累加器专用传送,地址目标传送和标志传送。
通用传送指令:MOV 传送字节或字PUSH 字进栈POP 字退栈XCHG字节或字交换 • 累加器专用指令:IN 输入字节或字OUT 输出字节或字XLAT 字节换码 • 地址目标传送指令:LEA 取有效地址LDS 取指示器到DSLES 取指示器到ES • 标志传送指令:LAHF 取标志寄存器到AHSAHF存AH到标志寄存器PUSHF标志进栈POPF标志退栈 下面分类讨论它们的格式、功能及使用方法。数据块传送程序
6.1.1 数据传送指令 • MOV指令(传送字节或字)格式: MOV 目的操作数,源操作数其中,目的操作数和源操作数分别可以为:目的操作数 源操作数存储器 立即数 通用寄存器 存储器 段寄存器(不能为CS) 通用寄存器 段寄存器(可以为CS)以上目的操作数和源操作数除了不能从存储器到存储器以外,可以任意搭配。 • 功能:把一个字节或字从源操作数传送到目的操作数。MOV 指令不影响状态标志。MOV 指令是一条功能很强的也是最常用的指令,它能实现:
1.寄存器与寄存器之间的数据传送(除了代码段基址寄存器CS和指令指针IP以外)。1.寄存器与寄存器之间的数据传送(除了代码段基址寄存器CS和指令指针IP以外)。 • 例如:MOV AX,BX;(BX)->AXMOV DL,AH;(AH)->DLMOV DX,ES;(ES)->DXMOV DS,AX;(AX)->DS
2.立即数传送到通用寄存器,即给AX、BX、CX、DX、BP、SP、SI、DI以及AH、AL、BH、BL、CH、CL、DH、DL寄存器赋初值。2.立即数传送到通用寄存器,即给AX、BX、CX、DX、BP、SP、SI、DI以及AH、AL、BH、BL、CH、CL、DH、DL寄存器赋初值。 • 例如:MOV AX,100Q ;100Q->AXMOV BX,0FFFFH ;0FFFFH->BXMOV AL,4 ; 4->ALMOV CH,100 ; 100->CHMOV SI,OFFSET TABLE;OFFSET TABLE->SI
3.寄存器(除了CS和IP以外的所有寄存器)与存储器(所有寻址方式)之间的数据传送。例如:MOV AL,BUFFER ;(BUFFER)->ALMOV AX,[SI] ;([SI])->AXMOV [DI],DX ;(DX)->[DI]MOV [BX+DI],DL ;DL->+([BX+DI])MOV SI,ES:[BP] ;(ES:[BP])->SIMOV AX,A[BX+SI] ;(A[BX+SI])->AX
4.立即数传送到存储器(所有寻址方式),其立即数的类型与存储器变量的类型一致。4.立即数传送到存储器(所有寻址方式),其立即数的类型与存储器变量的类型一致。 • 例如:MOV A,3 ;3同A的类型一致MOV BYTE PTR [SI],3 ;3为8位数MOV WORD PTR [BX],3 ;3为16位数MOV B1[BX+DI+1],30H ;30H同B1变量的类型 但是,MOV指令不能实现存储单元之间的数据传送。若将存储单元A(A的类型为1即BYTE)的内容传送到B单元中,并且假设A和B是在同一个数据段里定义的变量。用一条MOV指令不能直接完成这样的传送,可以用如下两条MOV指令实现其传送:MOV AL,A MOV B,AL
假如需要这样传送的不是一个字节,而是一个数据块,例如30个字节,如果仍用上述直接寻址方式(直接地址)编程序,就需要写60条MOV指令。这些指令的操作符都一样,只是每条指令的地址(位移量)是变化的,而且地址的变化也是有规律的。为了简化程序的编制,学过一些高级语言的读者都会想到,这样的问题应该编制成循环程序。为了在每次循环执行时能够使源操作数和目的操作数修改地址,我们把地址(位移量)放在寄存器里,用寄存器间接寻址来寻找操作数。然后,每执行循环一次修改一次寄存器的内容使之指向下一个数据地址。用寄存器CX记循环次数,每循环一次减1,一直到CX为零循环结束。
用下列程序段实现之:MOV SI, OFFSET S1 ;S1的位移量->SI MOV DI, OFFSET S2 ;S2的位移量->DI MOV CX,30 ;30->CX NEXT:MOV AL,〔SI〕 ;(〔SI〕)-〉AL MOV〔DI〕,AL ;(AL)-〉〔DI〕 INC SI ;(SI)+1->SI INC DI ;(DI)+1->DI DEC CX ;(CX)-1->CX JNZ NEXT ;不等零时转NEXT其中,INC为增量(这里为+1),DEC为减量(这里为-1)操作符,JNZ为不等于零时转移指令,这些指令在后面均有介绍。IBM-PC机还有专门的控制循环迭代的指令(即LOOP指令)。上面程序段中的最后两条指令DEC CX JNZ NEXT 可以用一条循环迭代指令:LOOP NEXT代替。
6.1.2 数据块传送程序实例 • 以上的程序还仅仅是一个程序段,并不是一个完整的程序。为了使读者了解各种寻址方式的使用方法,下面用各种寻址方式和不同的数据定义来编制数据块传送的完整程序。 • 例6.1 将以S1为起始地址的30个字符依次传送到同数据段的以S2为起始地址的一片字节存储单元里。方法一:数据块是用DB定义的一个字符串S1。用变址寄存器间接寻址方式访问S1和S2,即用〔SI〕表示S1中各字节的位移量,用〔DI〕表示S2中各字节的位移量。
方法一,完整程序如下:NAME EX6-1-1DATA SEGMENTS1 DB ‘ABCDEFGHIJKLMNOPQRSTUVW′ DB ‘XYZ0123′S2 DB 30 DUP (?)DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA ;数据段寄存 MOV DS,AX ;器的装填 MOV SI,OFFSET S1 ;S1的位移量->SI MOV DI,OFFSET S2 ;S2的位移量->DI MOV CX,30 ;循环次数30->CX NEXT: MOV AL,〔SI〕 ;(〔SI〕)->AL MOV 〔DI〕,AL ;(AL)->〔DI〕 INC SI ;(SI)+1->SI INC DI ;(DI)+1->DI LOOP NEXT ;(CX)-1->CX,(CX)=0时转 MOV AH,4CH ;程序结束 INT 21H ;返回系统 CODE ENDS END START DEC CX JNZ NEXT
方法二,完整程序如下:NAME EX6-1-1DATA SEGMENTS1 DB ‘ABCDEFGHIJKLMNOPQRSTUVW′ DB ‘XYZ0123′S2 DB 30 DUP (?)DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA ;数据段寄存 MOV DS,AX ;器的装填 MOV BX,OFFSET S1 ;原 MOV SI,OFFSET S1 MOV SI,0 ;原 MOV DI,OFFSET S2 MOV CX,30 ;循环次数30->CX NEXT: MOV AL,[BX+SI] ;原mov al,[si] MOV [BX+SI+30] ,AL ;原MOV [DI],AL INC SI ;(SI)+1->SI ;原(DI)+1->DI LOOP NEXT ;(CX)-1->CX,(CX)=0时转 MOV AH,4CH ;程序结束 INT 21H ;返回系统 CODE ENDS END START DEC CX JNZ NEXT
方法三,完整程序如下:NAME EX6-1-2DATA SEGMENTS1 DB ‘ABCDEFGHIJKLMNOPQRSTUVW′ DB ‘XYZ0123′S2 DB 30 DUP (?)DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA ;数据段寄存 MOV DS,AX ;器的装填 MOV SI,0 ;mov si,offset s1 ;mov di,offset s2 MOV CX,30 ;循环次数30->CX NEXT: MOV AL,S1[SI];mov al,[si] MOV S2[SI],AL;mov [di],al INC SI ;(SI)+1->SI LOOP NEXT ;(CX)-1->CX,(CX)=0时转 MOV AH,4CH ;程序结束 INT 21H ;返回系统 CODE ENDS END START DEC CX JNZ NEXT
6.2 字符的输入/输出 • 在上节,我们用各种数据表格及不同的寻址方式实现了30个字节的数据块传送。它是用数据定义伪指令给一个数据项分配存储单元,用一个符号名(变量名)与这个存储单元相联系,以便以后访问这个数据项。汇编程序在汇编时给每个数据项分配好存储单元,并把数据存放在这些存储单元里。这种提供已知数据的方法比较适用于有较多的(一批)已知数据的情况。
6.2.1 字符的输入 • 如果程序要对任意数据进行处理,而且数据不是太多时,则可采用在程序运行时从键盘上键入已知数据的方法。在汇编语言中,键盘输入一个字符的方法是:发中断21H来请求DOS的功能调用,将AH中送上功能调用号,键盘输入一个字符的功能调用号是1(参见第14章)。在程序中需要输入一个字符的地方写上指令:MOV AH,01H INT 21H当CPU执行到这两条指令时,就等待你键入一个字符,当你键入一个字符后,这个字符的ASCII码就存放在AL寄存器中。请注意,键入的数据都是一个字符的ASCII码(因为多数外部设备都是以ASCII码的形式传送数据的)。当你用以上两条指令接受一个字符时,假如你按数字键4,则在AL里得到的不是数值4,而是字符′4′的ASCII码34H。
6.2.2 字符的输出 • 在微处理机上,要想知道程序运行的结果,常用的方法就是在屏幕上显示或在打印机上打印结果。在IBM-PC上的宏汇编语言里,要想输出一个字符需要请求DOS的功能调用,显示一个字符的功能调用号为02H,将02H送入AH,发21H类中断,就会在屏幕上的当前位置显示寄存器DL中的一字符。因此,事先必须将要显示的字符的ASCII码送入DL。要想将DL中的字符在打印机上输出,就将功能调用号05H送入AH,然后发中断21H。此时打印机必须已经准备好(即打印机已加电,并已按Ctrl+P键连上了打印机)。例如:要想显示输出5,需要写指令:MOV DL,′5′ MOV AH,02H INT 21H 要想打印输出字符F,需要写指令:MOV DL,′F′ MOV AH,05H INT 21H
需要说明的是,用功能调用号05H打印一个字符时,若打印机已准备好,则在打印机上打印字符的同时,也在屏幕上显示这个字符。若打印机没有准备好,则CPU执行到INT 21H时就处于等待状态,使程序无法继续执行下去。当用功能调用号02H显示一个字符时,若打印机已经准备好,则在显示字符的同时,在打印机上也打印这个字符,若在显示一个字符时,打印机没有准备好(比如:打印机没有加电,或者没有按Ctrl+P键连上打印机),则只显示而不打印,程序继续执行。因此,当你需要显示输出一个字符时,只需用功能调用号02H。当你需要显示并打印一个字符时,也不要将功能调用号02H和功能调用号05H都写上,因为这样会显示两个同样的字符,二者只需写一个即可。一般亦只需用功能调用号02H。
6.2.3 字符输入/输出程序实例 • 例6.2 • 从键盘上键入20个字符,然后以与键入字符的先后相同的顺序显示出来。 为了存放从键盘上键入的字符,我们分配一个20个字节的存储器缓冲区,假设这个缓冲区的起始地址名为DATA。我们将从键盘上接受来的字符依次存放在这片内存里,然后再从第一个字符开始,依次把它们显示出来。 其完整程序如下:
NAME EX6-2DSEG SEGMENT DATA DB 20 DUP(?) ;分配20个字节的输入缓冲区DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEGGO:MOV AX,DSEG MOV DS,AX MOV CX,20 ;20->CX MOV SI,OFFSET DATA ;DATA位移量->SIL01:MOV AH,01H ;键入一个字符->AL INT 21H MOV [SI],AL ;(AL)->[SI] INC SI ;(SI)+1->SI LOOP L01 ;循环20次MOV CX,20 ;20->CX MOV SI,OFFSET DATA ;DATA位移量->SIL02:MOV DL,[SI] ;([SI])->DL MOV AH,02H ;显示(DL) INT 21H INC SI ;(SI)+1->SI LOOP L02 ;循环20次MOV AH,4CH ;程序运行结束,返回DOS INT 21HCSEG ENDS END GO
6.3 堆栈操作程序 • 6.3.1 堆栈操作指令1. PUSH指令(把字推入堆栈)格式:PUSH 源操作数(字)功能:首先将栈顶指针减2,即(SP)-2->SP; 然后将源操作数(字)->(SP)+1,(SP)。 例如: PUSH AX ;(SP)-2->SP且(AX)->(SP)+1:(SP)PUSH BX ;将(BX)推入堆栈PUSH SS ;将(SS)推入堆栈PUSH CS ;将(CS)推入堆栈(这是合法的)PUSH BETA ;将BETA存储字的内容推入堆栈PUSH BETA〔BX〕;PUSH BETA〔BX〕+〔SI〕;
2. POP指令(从堆栈顶弹出一个字)格式:POP 目的操作数功能:首先把堆栈顶的字((SP)+1,(SP))->目的操作数; 然后将堆栈指针SP加2,即(SP)+2->SP。例如:恢复上面程序段保存的寄存器、存储器的内容的程序段为: POP BETA〔BX〕+〔SI〕POP BETA〔BX〕POP BETAPOP A ;注意:POP CS是非法的POP SSPOP BXPOP AX 堆栈操作指令PUSH和POP的操作示意图如图6-1所示。
压栈前 PUSH AX后 POP BX 后 BX AX AX 3412 3412 1234H 1234H 1234H SP SP SP SS SS SS
需要注意的是: • (1) 因为堆栈指针SP总是指向已经存入数据的栈顶(不是空单元),所以PUSH指令是先将(SP)减2,后将内容压栈(即先修改SP使之指向空单元,后压入数),而POP是先从栈顶弹出一个字,后将堆栈指针SP加2。 • (2) PUSH CS是合法的,但POP CS 是不合法的。 • (3) 因为SP总是指向栈顶,而用PUSH和POP指令存取数时都是在栈顶进行的,所以堆栈是“先进后出”或叫“后进先出”的。栈底在高地址,堆栈是从高地址向低地址延伸的,所以栈底就是最初的栈顶。 • (4) 用PUSH指令和POP指令时只能按字访问堆栈,不能按字节访问堆栈。 • (5) PUSH和POP指令都不影响标志。
6.3.2 堆栈操作程序实例 • 例6.3 在键盘上输入50个字符,然后用与输入字符的先后相反的顺序在屏幕上显示出来。因为堆栈是“后进先出”的,因此,利用堆栈作为输入缓冲区极易实现按逆序输出。 其完整程序如下:NAME EX6-3
STACK SEGMENT PARA STACK DW 50 DUP (?)STACKTOP LABEL WORDSTACK ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACKSTART: MOV AX,STACK MOV SS,AX MOV SP,OFFSET STACKTOP MOV CX,50 ;输入50个字符堆栈L1: MOV AH,01H INT 21H PUSH AX LOOP L1 MOV DL,0AH ;显示“回车”MOV AH,02H INT 21H MOV DL,0DH ;显示“换行”INT 21H MOV CX,50 ;从栈顶依次弹出50个字符输出L2: POP DX MOV AH,02H INT 21H LOOP L2 MOV AH,4CH INT 21H CODE ENDS END START
其中,最初的栈顶也可以不用指令送堆栈指针SP,即将上面程序中的STACKTOP LABEL WORD 伪指令和MOV SP,OFFSET STACKTOP 指令去掉,程序照样正确运行。因为只要在堆栈段的SEGMENT伪指令中带有组合类型参数和组名参数:STACK′STACK′,汇编程序会就自动把栈底(也是最初的栈顶)的位移量赋给堆栈指针SP。如果键入的字符为′A′,′B′,…,′8′,′9′等50个字符,栈中的内容如图6-2所示(见书P121)。在图6-2中,SP0指向的是栈底,也是最初的栈顶。SPi为第i个字符键入后PUSH指令执行完后栈顶的位置(即堆栈指针SP指向的位置)。当执行POP指令时,是按SP50,SP49,…,SP2,SP1所指向的字顺序弹出的。
6.4 数据交换程序 • 6.4.1 数据交换指令XCHG指令(字节或字交换)格式:XCHG 目的操作数,源操作数功能:将源操作数和目的操作数相互交换(字节或字)。此指令可以实现通用寄存器、累加器或存储器之间的相互交换。但是两个操作数中要求至少有一个通用寄存器。因此,XCHG指令不能直接实现两个存储器单元的内容交换。XCHG指令举例: XCHG AX,BX ;AX与BX寄存器内容交换XCHG SI,AX ;SI与AX内容交换XCHG AL,BL ;AL与BL内容交换 XCHG WORD-VAR,CX;变量WORD-VAR与CX寄存器内容交换XCHG DH,BYTE-VAR ;DH与变量BYTE-VAR内容交换
请注意:(1) XCHG指令不影响状态标志。(2) 段寄存器不能作为XCHG指令的操作数。若要进行存储器(字)变量A和存储器(字)变量B的内容交换,可以用以下几条指令实现:MOV AX,BXCHG AX,AMOV B,AX 如果只用MOV指令则需要用四条指令占用两个通用寄存器才能实现:MOV AX,AMOV BX,BMOV A,BXMOV B,AX 另外利用堆栈交换存储器变量A和B的内容也是很方便的。利用下列四条指令即可实现 PUSH APUSH BPOP APOP B 以上四条指令之所以能实现A与B内容交换,是由于用PUSH和POP指令访问堆栈总是在栈顶进行的,也就是说,堆栈是“先进后出”的。
6.4.2数据交换程序实例 • 例6.4 将S1串与S2串交换,其实现程序如下:
DATA SEGMENT S1 DB ′ABCDEFG′ S2 DB ′0123456′ N DW $-OFFSET S2 ;N为字符串长度DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA ;DATA段基址DS MOV DS,AX MOV SI,0 ;0SI MOV CX,N ;字符个数CXL1: MOV AL,S1〔SI〕 ;(S1〔SI〕)与(S2〔SI〕)交换XCHG AL,S2〔SI〕 MOV S1〔SI〕,AL INC SI ;(SI)+1SI LOOP L1 ;循环N次否?MOV CX,N ;显示S1串MOV SI,0 MOV AH,02H L2: MOV DL,S1〔SI〕 INT 21H INC SI LOOP L2 MOV DL,′ ′ ;显示空格INT 21H MOV CX,N ;显示S2串MOV SI,0 L3: MOV DL,S2〔SI〕 INT 21H INC SI LOOP L3 MOV AH,4CH INT 21H CODE ENDS END START
6.5 端口输入/输出程序 • 6.5.1 端口输入/输出指令IN/OUT 指令(输入/输出指令)8086/8088的输入/输出是一种专用的端口寻址的输入/输出方式(非存储器对应方式),故有专门I/O指令。8086/8088的I/O指令有两种寻址方式:直接寻址方式和间接寻址方式。直接寻址的I/O指令格式为:IN AL,nIN AX,nOUT n,ALOUT n,AX 其中,n为8位端口地址,故可寻址256个I/O端口。间接寻址的I/O指令格式为:IN AL,DXIN AX, DXOUT DX,ALOUT DX,AX
这类I/O指令的I/O端口地址包含在DX中,即为16位地址。因此,可访问的I/O端口地址空间最大可达64K个。IN指令功能: 把一个字节或一个字由一个输入端口(即指令中的n或DX),传送到AL或AX。OUT指令功能: 把在AL中的一个字节或在AX中的一个字传送至一个输出端口(指令中的n或DX)。 例如: IN AL,2FH ;从端口2FH输入一个字节,ALOUT 5,AL ;将(AL)输出到端口5MOV DX,3FCH ;将端口地址3FCHDXIN AX,DX ;从端口3FCH输入一个字AX
6.5.2 端口输入/输出程序实例 由于端口输入/输出程序涉及很多硬件知识,因此这里只给出程序实例而不做解释。有关I/O指令的应用,本书将在后面再详细介绍。 例6.5 对8235定时器和8255可编程控制器接口芯片进行编程,让扬声器发出600周的声音。其实现程序如下:
·MODEL SMALL·DATA FRED DW 1988·CODE START: MOV AX,@DATA MOV DS,AX IN AL, 61H OR AL,3H OUT 61H,AL MOV AL,0B6H OUT 43H,AL MOV BX,FRED MOV AL,BL OUT 42H,AL MOV AL,BH OUT 42H,AL MOV AH,0 INT 16H IN AL,61H AND AL,0FCH OUT 61H,AL MOV AH,4CH INT 21H END START
6.5.3 对I/O接口芯片编程 见p365 16.4 对I/O接口芯片的编程 由第15章大家知道,用户汇编程序截至目前为止,已有两种手段,或两个层次,或是两个界面来实现I/O。其中一种是DOS功能调用,另一种是BIOS功能调用,二者相比,DOS功能调用处于外层,而BIOS功能调用处于内层。作为一般用户仅需DOS功能调用就可以了,进一步是BIOS功能调用。
然而对于系统软件工作者则仅有这些还是不够的,因为他们要剖析ROM—BIOS的程序,要剖析DOS系统程序,甚至进一步要改进DOS之结构,或是BIOS之功能,例如在PC—DOS上进行二次开发使其具有汉字功能,编制实时控制程序等等。要做到这一切就必须深入了解最内层的I/O控制或编程,但这要涉及到具体微机的硬件接口,因此我们不可能以一节的篇幅将其彻底阐述清楚。但是我们可以从一孔而观全局,对其全貌有一概括的了解,为以后深入学习打下一个基础,并在必要时能够知道从何处入手再行深造。然而对于系统软件工作者则仅有这些还是不够的,因为他们要剖析ROM—BIOS的程序,要剖析DOS系统程序,甚至进一步要改进DOS之结构,或是BIOS之功能,例如在PC—DOS上进行二次开发使其具有汉字功能,编制实时控制程序等等。要做到这一切就必须深入了解最内层的I/O控制或编程,但这要涉及到具体微机的硬件接口,因此我们不可能以一节的篇幅将其彻底阐述清楚。但是我们可以从一孔而观全局,对其全貌有一概括的了解,为以后深入学习打下一个基础,并在必要时能够知道从何处入手再行深造。
16.4.1 与8088配套的主要芯片简介 • 8088是IBMPC微机的心脏或大脑,然而仅有一个8088微处理器是不能构成硬件系统的,还必须有其它接口芯片的支持,这些芯片有些也是微处理器,8088可以通过端口对其编程,以及通过端口读取必须的信息,实现对它们的控制和协调各部分的工作。在DOS下这些工作是由初始化程序或DOS内部程序,进而通过BIOS程序去进行的,用户是通过DOS或BIOS的功能调用间接进行干预的。这里则不然,我们将通过对主要配套的芯片的简介,通过使用OUT和IN指令对典型芯片的编程来进一步了解最内层的I/O控制。
• 1主机与外设交换信息的方式 • (1) DMA方式(直接存储器访问) • 系统板以8237DMA控制器芯片提供DMA机构,其主要用于存储器刷新等。该片有四个DMA通道,可编程四个独立的DMA操作,由于其繁杂性,详细情况请查阅8237DMA之Intel产品说明书。 • 在该方式下数据不必经累加器和端口与外设传递,而是通过快速直接传递的方式进行的。但是对其控制方式也是由端口对其编程实现的。
(2) 其它方式(查询和中断方式) • 查询方式,接口电路中有I/O设备的工作状态′忙′,′闲′,及缓冲器的′满′、′空′状态,CPU通过AL(或AX),进而通过端口对其不断地查询指挥其工作。 • 中断方式,CPU不必定时查询I/O设备的状态,而是通过AL(或AX)进而通过端口直接下达命令和工作方式(编程),一旦I/O片接收了此信息,则由I/O接口芯片来控制相应I/O设备的I/O,只是在工作完成或是遇到紧急情况(特殊条件产生)才通过发中断信号的方式,请求CPU干预。 • 综上所述,CPU是通过端口与接口芯片通讯以达到下达任务、查询和传递信息的目的。
总线 存储器 微处理器 输入/输出系统 8086 8088 80286 80386 80486 Pentium 动态RAM(DRAM) 静态RAM(SRAM) 高速缓冲 只读存储器 闪速存储器 打印机 串行通信设备 软盘驱动器 硬盘驱动器 鼠标 CD-ROM驱动器 绘图仪 键盘 视频监视器 磁带机 基于微处理器的个人计算机
在80286或80386SX中为15M字节 在80386SL中为31M字节 在80386DX、80486、Pentium中为4096M字节 扩展存储区 系统区 384K字节 8086~80486或Pentium中1M字节存储器(可包括扩充存储器) TPA 640K字节 个人计算机存储器映像
9FFFF 9FFF0 9FFEF MSDOS程序 空隙TPA 08E30 08E2F 08490 0848F 02530 0252F 01160 0115F 00700 006FF 00500 004FF 00400 003FF 00000 COMMAND.COM 驱动程序(MOUSE.SYS) (ANSI.SYS) MSDOS程序 IO.SYS DOS通信区 BIOS通信区 中断向量区 DOS TPA 的存储器映像,这个映像图根据DOS版本的不同而不同也随着驱动程序和配置情况的差异而改变
0378 0377 0330 032F 0320 031F 0300 02FF 02F8 02F7 0064 0063 0060 005F 0044 0043 0040 003F 0024 0023 0020 001F 0010 000F 0000 硬盘 COM2 8255(PPI) 定时器 中断控制器 DMA控制器 FFFF I/O扩充区 COM1 软盘 CGA适配器 LPT1 个人计算机的I/O映像 0500 04FF 0400 03FF 03F8 03F7 03F0 03EF 03E0 03DF 03D0 03CF 0380 037F 0378 0377
2几种典型的接口芯片 • (1) 8259中断控制器 它提供两个端口,20H和21H,其中20H对应中断命令寄存器,由其对8259编程。21H对应中断屏蔽寄存器。8259能接受8个独立的硬件中断信号,编号0~7,号数小的级别最高,DIOS在系统初始化时已对其编程使其对应中断类型08H~0FH,其含义见第14章。用户通过端口21H可以设置对应编号的中断信号的屏蔽位。(屏蔽寄存器0~7位置时屏蔽相应编号的中断信号)中断信号的发送关系如图16-3所示。例如当定时器发出中断信号时,如果IMR位的值为0的话,而且是在开中断的情况下(1F=1),CPU才接受中断信号,并转入中断处理。
口地址 20-23H 20H 命令口 21H 中断屏蔽寄存器 8259A标准中断 IRQ7 IRQ6 IRQ5 IRQ4 IRQ3 IRQ2 IRQ1 IRQ0 0FH类中断 0EH类中断 0DH类中断 0CH类中断 0BH类中断 0AH类中断 09H类中断 08H类中断 打印机中断 软盘 中断 未用 串行口中断 未用 彩色图像中断 键盘中断 定时器中断
CPU中断型号 开/关中断信号 76543210 屏蔽寄存器 定时器 CPU 0位 7位
中断处理应遵循如下原则 ·保护现场(关中断状态) ·屏蔽低级中断(关中断状态) ·中断处理(开中断状态) ·恢复现场(关中断状态) ·向中断命令寄存器发中断结束命令。 例如发EQI(中断结束)命令 … MOV AL,20H OUT 20H,AL … 例如禁止除键盘外一切中断 … MOV AL,0FDH OUT 21H,AL … 中断处理应遵循如下原则
• (2) 8255可编程通用I/O芯片 • 它用于系统板配置主持各种设备和信号,如键盘、扬声器、配置开关和若干其它信号。该片对应4个I/O口。其中61H为输出端口PB,60H和62H是两个输入端口,分别称PA和PC口,63H对应单字节的命令寄存器。其端口分配见图16-4。 • PC加电后,BIOS发送99H给63H端口将该芯片初始化。可利用PB口给定位置1的方法选择PA和PC的交替输入。利用PB口可读到曾写入PB口的当前值。 • 当PB口位7=0时,从PA口输入的是键盘扫描码。当PB口位7=1时,从PA口输入的是由系统开关1,2反映的系统配置状态。其中位7~6表示开关1的8~7位,它指明了驱动器个数。其中位6~5,表示开关1的6~5位,指明了显示器的类型。其中位4~3对应开关1的4~3,表示系统板上的RAM数。第2位未用。第1位对应开关1的位1表示非磁盘系统。
输入口PA(60H) 若PB位7=0 7 6 5 4 3 2 1 0 键盘扫描码 7 6 5 4 3 2 1 0 配置开关1 输入口PA(60H) 若PB位7=1 SW1-1 非磁盘系统 SW1-2 未用 SW1-3 系统板上RAM SW1-8 SW1-7驱动器数 SW1-4 SW1-6 SW1-5 显示类型 8255的端口分配 PA口(60H)输入口