第五章输入输出和中断调用•第一节输入和输出•第二节BIOS中断调用•第三节I/O举例第一节输入和输出I/O设备CPU外部设备I/O设备输入设备输出设备一、外设寻址方式(端口的编址方式)1.存贮器对应(映射编辑方式)I/O端口作为存储器的一个单元;和存储器单元统一编址I/O操作、I/O端口(外设中可以被主机直接访问的寄存器)数据端口命令端口状态端口优点:所有读存储器操作指令都适用于外设,I/O程序设计灵活方便(指令多),I/O端口有较大的编址空间。缺点:减少了存储器可用空间,要求外设速度较高。2.端口寻址方式I/O端口单独编址,构成独立的I/O空间,专门的I/O指令(IN,OUT)设计不灵活。3.IBMPC机中I/O端口采用了I/O端口映射编址方式与存储器分离的地址空间,允许设64K个8位端口(或32K16位端口)。I/O端口分配表:单显彩显软磁盘异步通讯3B0—3BF3D0—3DF3F0—3F73F8—3FE扩展板游戏接口硬磁盘控制器异步通讯并行打印机200—2DF2F8—2FE320—32F3F8—37FI/O通道DMA控制器中断控制器定时器/计数器并行外围接口00—0F20—2140—4360—63系统板I/O端口I/O端口编号分类二、I/O指令两条字/字节只能使用累加器传递/接收信息(AL/AX)1.输入指令InInAcc,PORTAcc←(PORT)注:Acc(AX/AL)PORTn直接外设寻址,一个字节(256)端口dx间接外设寻址,两个字节(65536)如:InAL,nInAX,nInAL,DXInAX,DX2.输出指令OUTOutPORT,AccPORT←Acc如:Outn,ALOutn,AXOutDX,ALOutDX,AX三、CPU与外设之间数据传递方式1.无条件传递方式(直接程序控制)不需要查询外设状态,直接使用I/O指令,采用这种方式接口电路简单,应用在CPU和低速I/O接口之间,如:LED显示器、开关、继电器等。2.查询程序控制查询外设“准备好”状态,只有在外设准备好的状态下,才能I/O操作,否则只有等待。取状态准备好I/O操作YN这种方式能使CPU和外设工作同步,查询花费大量时间,使CPU效率低。一般适合于和中、低速外设交换信息。如:键盘、打印机。例:P1883.中断传送方式外设已准备好→向CPU发出中断请求→进入中断服务中断服务主程序4.直接数据传送方式DMA方式在外设和存储器之间建立一条直接信息传输的通道,而不经CPU干预,与并不用I/O指令由专门的硬件电路控制(DMA控制器)。适合于与磁盘控制器等高速外部设备交换信息。第二节BIOS中断调用一、中断基本概念1.在CPU执行现行程序过程中,发生了随机事件和特殊请求,CPU中止现行程序,转去执行对随机事件或特殊请求的处理程序。待处理完毕,再返回现行程序继续执行。分时操作2.功能实时处理故障处理、、电源故障、内存、I/O奇偶错键盘、串行口、打印机等非屏蔽中断NMI硬中断(外,CPU外部中断请求)3.类型可屏蔽中断INTR来自外设软中断(内,由CPU指令引起)中断指令Intn错误程序(除数为0)0类型调试程序(为调试而改)3类型溢出中断4类型4.中断矢量表每个中断一个中断类型码号(0~FFH);每个中断都有相应的中断服务程序。中断矢量表在存储器前1K存储空间(00000H~0003FFH)中保存软中断都是非屏蔽中断了中断服务程序入口地址(CS:IP)共256个。每个中断矢量占有4个字节,低字节存放存放中断服务程序入口地址的偏移量,高字节存放入口地址的段基址。已知中断矢量n,4N4N+14N+24N+3000000000100002003FFCSIPCSIP…CSIPCSIP类型0类型1类型N2555.中断指令1)软中断指令INTINTn(n为立即数,表示中断类型0~255)功能:(1)Sp←Sp-2压入标志寄存器FIAG,清标志位TF、IF(2)Sp←Sp-2压入CSCS←(4N+2;4n+3)(3)Sp←Sp-2压入IPIP←(4N;-4n+1)系统子程序调用2)中断返回指令IRET功能:(1)Sp←Sp+2栈顶弹出至IP(2)Sp←Sp+2栈顶弹出至CS(3)Sp←Sp+2栈顶弹出至FLAG即恢复中断时保存的IP、CS、FLAGINTIRET3)溢出中断指令INTO功能:若溢出标志OF=1,则产生溢出中断,转入溢出中断处理程序,否则继续执行INTO下一条指令二、BIOS中断调用1.BIOS简介BIOS是基本输入/出系统,它驻留在系统板上只读存储器ROM中,又称ROMBIOS;地址在0FE000H~FFFFFH。提供了系统加电自检、引导装入以及对主要I/O接口的控制。它是、计算机运行时最基本的最低层的例行程序集合。例行程序以中断服务、程序形式编写。入口地址保存在中断矢量表。0~4H8086专用中断类型号(0~1FH)8~0FH8级硬中断05,10~1FHBIOS软中断32K8KF6000H0FE00HFFFFFHBASICBIOS2.调用方法→送入口参数到指定的寄存器→AH功能号查表得→IntnDOS(20~3FH)→处理出口参数3.键盘I/O中断调用1)扫描码即该键位置码每个键都有扫瞄码;但有的键可以显示(ASCⅡ),但有的键无ASCⅡ,不可显示。Shife+PrintScreenCtrl+NumLockCtrl+ScrollLockAlt+Del+Ctrl2)键盘状态标志字节BIOS处理右Shift左ShiftAltCtrlScrollLock打开NumLock打开CapsLock打开Insert打开703)常用AH=0检测是否有键入的字符AH=1AH=2Int16H例:P201开始CH4显示空格显示ALACBLBX循环左移4位CH=3CH-1=0退出4.显示中断Int10H1)AH=0设置显示方式AL=方式2)AH=2设置光标位置BH=页号DH=行号DL=列号3)AH=8读当前光标位置的字符与属性入口:BH:页数出口:AL=字符AH=属性4)AH=9在当前光标位置写指令的字符和它的属性入口:BH=页号CX=字符数AL=要写的字符的ASCⅡBL=字符属性/字符颜色出口:无AH=0AH在当前光标位置写字符属性,符性不变入口:无属性BH=页号CX=字符数AL=ASCⅡ5.时间中断1AH1)AH=0读取时间计数器当前值出口:CX=计数器高位DX=计数器低位AL=0计数未超过24小时AL≠0计数超过24小时2)AH=1设置当前计数值入口:CX同上DX时间计数器每55ms自动加1计数未超过24小时开始保存CX保存字符读键盘字符读当前计数值时间清0DL=100CX-1=0退出还原CX例:每隔5.5s从键盘上读一个字符,并将ASCⅡ码存入内存缓冲区(100个字符)第三节I/O举例例:设对有一个问题用不同方法编制的两个程序PROG1,PROG2。现要编制出比较它们之间哪一个程序执行时间长一些。CallCompute子程序返回参数AL0=AL1>-1<开始相等显示2时间长CallComputeAL=O退出AL=1显示1时间长主程序YEQUI2NYMORE1NDONE例:键盘I/O程序,按下某键,则屏幕上将显示该键所对应的扫描码、ASCⅡ码和该字符。主程序框图开始读键盘显示回车显示空格调用BINHEX显示扫描码和ASCⅡ显示字符显示执行①AH=0Int16出口参数AL为ASCⅡAH为扫描码②0~9,A~F转换为ASCⅡ时注意BX循环移位4位转换成ASCⅡ并显示开始CH←4显示空格AL←BLCH-1=0退出CH=3子程序第六章常用程序设计常用程序设计的技能和技巧第一节算术运算指令第二节数制和代码转换第三节字符串和表处理第一节算术运算指令复习BCD码P18页BCD码未组后(非压缩):用一个字节表示一位BCD码高4位为0压缩:用一个字节表示两位BCD码十进制数BCD00000100012001030011401005010160110701118100091001一、十进制调整指令:放在加减法指令之后1.未组合BCD码加法调整指令AAA指令格式AAA过9加6功能:对AL中由未组合的十进制数相加的结果校正,产生了一个未组合的十进制数,放在AX中影响:AF若低4位大于9,或AF=1,则AF=1;否则AF=0CF与AF相同调整过程:AF=1AL←AL+6(调整)过9AH←AH+1(产生进位)AF=CF=1AL←AL∧0FH注:该指令紧跟在加法指令之后2.十进制加法调整指令DAA过9加6功能:对AL中由两个组合的十进制数相加的结果校正,得到了一个正确的十进制数,放在AL中影响:结果>99H则CF=1结果>9则AF=1调整结果:AF=1加6CF=1加60过93.未组合BCD码减法调整指令AAS功能:把在AL中的;两个未组合的十进制数相减结果校正成一个正确的未组合的十进制差→AL中过9减6AF=CF=1调整过程:AL←AH-6AL低4位大于9AH←AH–1AF=1CF=AF=1AL=AL∧0FH4.十进制数减法指令DAS功能:对AL中两个组合的十进制数相减以后的结果调整→AL调整过程:若AL低4位大于9,或标志位AF=1;则AL←AL-6,AF←1若AL高4位大于9,或标志位CF=1;则AL←AL-60,AF←1补充举例:将4位二进制转换成十进制数的ASCⅡMOVAL,BINADDAL,90HDAAADCAL,40HDAAMOVHEXASC,AL例1.多精度十进制数BCD码加法原理:循环带进位相加注:①XOR作用②保存进位ADCAH,0MOVCX,8XORAX,AXREPEAT:MOVAL,[BX]ADCAL,[SI]AAAMOV[DI],ALINCBXINCSIINCDILOOPREPEATADCAH,0高位进位MOV[DI],AH例2.多精度十进制减法原理:循环带借位相减CLDCLCR1:LODSBSBBSL,[BX]DASSTOSBINCBXLOOPR1第二节数制和代码转换一、ASCⅡ转BCD码1.未组合取低4位ANDAL,0FH2.未组合→组合BCD码:先按方法1得到高位\低位未组和的BCD高位BCD码左移4位加上低4位BCD码例1.10位ASCⅡ转换组合BCD码CLDL1:LODSBANDAL,0FHMOVBL,ALLODSBPUSHCXMOVCL,4SALAL,CLPOPCXADDAL,BLSTOSBLOOPL1注:①对奇数、偶数个数考虑②串操作CLD③左移操作二、BCD→ASCⅡ1.未组合BCD→ASCⅡADDAL,30H加30H2.组合BCD→未组合BCD循环左移4位取低4位右移例:在CRT上显示00~59程序注:①延时②产生00~59BCD数ADDAL,1DAACMPAL,60HJCDONEMOVAL,0DONE:三、二进制→十六进制ASCⅡ1.循环左移4位2.取低4位MOVCH,4;CH,控制循环次数L1:MOVCL,4ROLBX,CLMOVAL,BLANDAL,0FH加37H(字母)加30H(数字)CMPAL,10JNCCHARADDAL,30HJMPDONECHAR:ADDAL,37HDONEMOV[S1],ALINCS1DECCHJNZL1四、二进制→ASCⅡ表示的十进制(运算结果为二进制,输出时要求为ASCII)方法一:记录减权值次数权值10000,1000,100,10,1DONEAX←AX-DXAXO退出CL←’0’DX←1000CL←CL+1AX←AX+DX[BX]←CLCL←01DX=1SUBAX,DXJCDONEYNYN注:①负数要求补NEGAX②结果26→00026[DI]方法二:除10取余法余数弹栈DXDX:AX÷BXCH-1=0退出余数DX压栈AX=0BX←10CX←0DX←0CX←CX+1显示DL←DL+30HAX为被转换数AH=0BX←10CX←0MOVBX,10MOVCX,0L1:MOVDX,0DIVBXPUSHDXINCCXANDAX,AXJNZL1L2:POPDXADDDL,30HMOVAH,2INT21HLOOP