还剩102页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
全国高等学校“十 一五”重点规划教材现代微型计算机原理与接口技术教程(习题解答)主编杨文显副主编杨晶鑫编著黄春华胡建人宓双清华大学出版社习题一
1.8086CPU由哪几个部件构成?它们的主要功能各是什么?8086CPU由指令执行部件EU和总线接口部件BIU两个部份组成指令执行部件主要功能是执行指令总线接口部件的主要功能是完成访问存储器或I/O端口的操作形成访问存储器的物理地址;访问存储器取得指令并暂存到指令队列中等待执行;访问存储器或I/O端口以读取操作数参与EU运算,或存放运算结果
2.什么是逻辑地址?什么是物理地址?它们各自如何表示?如何转换?程序中使用的存储器地址称为逻辑地址,由16位“段基址”和16位“偏移地址”(段内地址)组成段基址表示一个段的起始地址的高16位偏移地址表示段内的一个单元距离段开始位置的距离访问存储器的实际地址称为物理地址,用20位二进制表示将两个16位二进制表示的逻辑地址错位相加,可以得到20位的物理地址物理地址=段基址×16+偏移地址在32位CPU的保护模式下,“逻辑地址”的表示产生了一些变化,请参考第8章的相关内容
3.什么是“堆栈”?它有什么用处?在使用上有什么特点?堆栈是内存中的一块存储区,用来存放专用数据例如,调用子程序时的入口参数、返回地址等,这些数据都按照“先进后出”的规则进行存取SS存放堆栈段的段基址,SP存放当前堆栈栈顶的偏移地址数据进出堆栈要使用专门的堆栈操作指令,SP的值在执行堆栈操作指令时根据规则自动地进行修改
4.设X=36H,Y=78H,进行X+Y和X-Y运算后FLAGS寄存器各状态标志位各是什么?
5.按照传输方向和电气特性划分,CPU引脚信号有几种类型?各适用于什么场合?CPU引脚传输的信号按照传输方向划分,有以下几种类型输出信号从CPU向外部传送;输入信号从外部送入CPU;双向信号有时从外部送入CPU,有时从CPU向外部传送双向信号主要用于数据信号的传输;输出信号用于传输地址信号和一些控制信号;输入信号主要用于传输外部的状态信号(例如READY)和请求(中断、DMA)信号按照信号的电器特性划分,有以下几种类型一般信号用来传输数据/地址信号时,高电平表示“1”,低电平表示“0”;用来表示正逻辑的控制/状态信号时,“1”表示有效,“0”表示信号无效;用来表示负逻辑的控制/状态信号时,“0”表示有效,“1”表示信号无效三态信号除了高电平、低电平两种状态之外,CPU内部还可以通过一个大的电阻阻断内外信号的传送,CPU内部的状态与外部相互隔离,也称为“悬浮态”CPU放弃总线控制权,允许其他设备使用总线时,将相关信号置为“悬浮态”
6.8086CPU以最小模式工作,现需要读取内存中首地址为20031H的一个字,如何执行总线读周期?请具体分析为了读取内存中首地址为20031H的一个字,需要执行二个总线读周期第一个总线周期读取20031H字节内容,进行的操作如下T1状态=1,指出CPU是从内存读取数据随后CPU从地址/状态复用线(A19/S6~A16/S3)和地址/数据复用线(AD15~AD0)上发出读取存储器的20位地址20031H为了锁存地址,CPU在T1状态从ALE引脚输出一个正脉冲作为地址锁存信号由于需要读取高8位数据线上的数据(奇地址),=0为了控制总线收发器8286接受数据,=0T2状态地址信息撤消,地址/数据线AD15~AD0进入高阻态,读信号开始变为低电平(有效),=0,用来开放总线收发器8286T3状态:CPU检测READY引脚信号若READY为高电平(有效)时,表示存储器或I/O端口已经准备好数据,CPU在T3状态结束时读取该数据若READY为低电平,则表示系统中挂接的存储器或外设不能如期送出数据,要求CPU在T3和T4状态之间插入1个或几个等待状态TwTW状态进入TW状态后,CPU在每个TW状态的前沿(下降沿)采样READY信号,若为低电平,则继续插入等待状态TW若READY信号变为高电平,表示数据已出现在数据总线上,CPU从AD15~AD0读取数据T4状态在T3(TW)和T4状态交界的下降沿处,CPU对数据总线上的数据进行采样,完成读取数据的操作第二个总线周期读取地址为20032H字节的内容CPU发出的信号与第一个周期类似,区别在于T1状态CPU发出存储器地址为20032H,由于只需要读取低8位数据线上的数据(偶地址),=1在CPU内部,从20031H读入的低位字节和从20032H读入的高位字节被拼装成一个字
7.8086CPU有几种工作方式?各有什么特点?8086/8088CPU有两种工作模式最大工作模式和最小工作模式所谓最小工作模式,是指系统中只有一个8086/8088处理器,所有的总线控制信号都由8086/8088CPU直接产生,构成系统所需的总线控制逻辑部件最少,最小工作模式因此得名最小模式也称单处理器模式最大模式下,系统内可以有一个以上的处理器,除了8086/8088作为“中央处理器”之外,还可以配置用于数值计算的8087“数值协处理器”、用于I/O管理的“I/O协处理器”8089各个处理器发往总线的命令统一送往“总线控制器”,由它“仲裁”后发出CPU两种工作模式由引脚决定,接高电平,CPU工作在最小模式;将接地,CPU工作在最大模式
8.分析8086CPU两个中断输入引脚的区别,以及各自的使用场合INTR用于输入可屏蔽中断请求信号,电平触发,高电平有效中断允许标志IF=1时才能响应INTR上的中断请求NMI用于输入不可屏蔽中断请求信号,上升沿触发,不受中断允许标志的限制CPU一旦测试到NMI请求有效,当前指令执行完后自动转去执行类型2的中断服务程序NMI引脚用于连接CPU外部的紧急中断请求,例如内存校验错,电源掉电报警等INTR引脚用于连接一般外部设备的中断请求
9.什么是时钟周期、总线周期、指令周期?它们的时间长短取决于哪些因素?时钟周期CPU连接的系统主时钟CLK一个周期的时间CLK信号频率越高,时钟周期越短总线周期CPU通过外部总线对存储器或I/O端口进行一次读/写操作的过程称为总线周期8086CPU总线周期一般由四个时钟周期组成,存储器/IO设备(接口)速度不能满足CPU要求时,可以增加一个或多个时钟周期指令周期CPU执行一条指令的时间(包括取指令和执行该指令所需的全部时间)称为指令周期指令周期的时间主要取决于主时钟的频率和指令的复杂程度,它也受到存储器或IO设备接口工作速度的影响
10.在一次最小模式总线读周期中,8086CPU先后发出了哪些信号?各有什么用处?T1状态指出CPU是从内存
(1)还是从IO端口
(0)读取数据随后CPU从地址/状态复用线(A19/S6~A16/S3)和地址/数据复用线(AD15~AD0)上发出读取存储器的20位地址,对IO端口访问时从AD15~AD0上发出16位地址为了锁存地址,CPU在T1状态从ALE引脚输出一个正脉冲作为地址锁存信号如果需要读取高8位数据线上的数据(奇地址/读取一个字),=0为了控制总线收发器8286数据传输方向,=0T2状态读信号开始变为低电平(有效),=0,用来开放总线收发器8286T3状态:CPU检测READY引脚信号若READY为高电平(有效),表示存储器或I/O端口已经准备好数据,进入T4状态;若READY为低电平(无效),表示存储器或I/O端口尚未准备好数据,插入一个或多个TW状态,直到READY变为高电平T4状态在T3(TW)和T4状态交界的下降沿处,CPU对数据总线上的数据进行采样,完成读取数据的操作
11.结合指令“OUT21HAL”,具体叙述最大模式“总线写周期”总线上的相关信号T1状态地址/数据复用线(AD15~AD0)上出现访问IO端口的16位地址21H由于地址为奇数,需要通过高8位数据线访问端口,=0T2状态=0,表示本周期对IO端口进行写操作地址/数据复用线(AD15~AD0)上出现来自AL的8位数据T3状态若READY为高电平(有效),表示I/O端口已经准备好接收数据反之,表示I/O端口尚未准备好接收数据,需要CPU插入TW周期进行等待,直到READY出现高电平(有效)T4状态CPU结束本周期习题二
1.内存储器主要分为哪两类?它们的主要区别是什么?内存储器分为随机存取存储器RAM(RadomAccessMemory)和只读存储器ROM(ReadOnlyMemory)两类RAM中信息可以按地址读出,也可以按地址写入RAM具有易失性,掉电后原来存储的信息全部丢失,不能恢复ROM中的信息可以按地址读出,但是在普通状态下不能写入,它的内容一般不能被改变ROM具有“非易失性”,电源关闭后,其中的信息仍然保持
2.说明SRAM、DRAM、MROM、PROM和EPROM的特点和用途SRAM静态RAM,读写速度快,但是集成度低,容量小,主要用作Cache或小系统的内存储器DRAM动态RAM,读写速度慢于静态RAM,但是它的集成度高,单片容量大,现代微型计算机的“主存”均由DRAM构成MROM掩膜ROM,由芯片制作商在生产、制作时写入其中数据,成本低,适合于批量较大、程序和数据已经成熟、不需要修改的场合PROM可编程ROM,允许用户自行写入芯片内容芯片出厂时,所有位均处于全“0”或全“1”状态,数据写入后不能恢复因此,PROM只能写入一次EPROM可擦除可编程只读存储器,可根据用户的需求,多次写入和擦除,重复使用用于系统开发,需要反复修改的场合
3.已知一个SRAM芯片的容量为8K×8b,该芯片有一个片选信号引脚和一个读/写控制引脚,问该芯片至少有多少个引脚?地址线多少条?数据线多少条?根据存储芯片地址线数量计算公式,k=log2(1024*8)=log2
(213)=13,即总计有13根地址线另有8根数据线、2根电源线所以该芯片至少有25(=13+8+1+1+2)根引脚
4.巳知一个DRAM芯片外部引脚信号中有4根数据线,7根地址线,计算它的容量根据存储容量计算公式S=2k×I,可得该芯片的存储容量为214*4=16K×4bit(位),也可表示为64Kb=8KB(字节)
5.32M×8b的DRAM芯片,其外部数据线和地址线为多少条根据存储芯片地址线数量计算公式,k=log2(1024*1024*32)=log2
(225)=25,即需要25根地址线但是,由于DRAM芯片的地址采用分时输入的方法,所以实际需要的地址线只有理论值的一半,此处为13根数据线8根
6.DRAM为什么需要定时刷新DRAM靠MOS管极间电容存储电荷的有无决定所存信息是0还是1,由于漏电流的存在,它存储的信息不能长时间保存,需要定时重新写入,称为“刷新”
7.74LS138译码器的接线如图
2.28所示,写出、、、所决定的内存地址范围从图看出,该存储系统的片内地址线有13根(A12-A0),是一个由8KB存储芯片组成的存储系统,A17地址线不确定它的地址分布为000CBA其中,CBA作为译码输入,与输出选择有关;“”表示可以为“0”,也可以为“1”于是对应的内存地址范围是00000H—01FFFH;或20000H—21FFFH对应的内存地址范围是04000H—05FFFH;或24000H—25FFFH对应的内存地址范围是08000H—09FFFH;或28000H—29FFFH对应的内存地址范围是0C000H—0DFFFH;或2C000H—2DFFFH
8.叙述EPROM的编程过程,并说明EPROM和EEPROM的不同点EPROM的编程过程标准编程方式Vpp上加编程电压,地址线、数据线上给出要编程单元的地址及其数据,并使=
0、=1上述信号稳定后,在端加上宽度为50±5ms的负脉冲,就可将一个字节的数据写入相应的地址单元中不断重复这个过程,将数据逐一写入快速编程方式使用100µs的编程脉冲依次写完所有要编程的单元,然后从头开始校验每个写入的字节若写得不正确,则重写这个单元写完后再校验,不正确还可再写,直到全部正确EPROM和EEPROM的不同点EPROM芯片用紫外线光照射擦除芯片的内容,擦除时需要把芯片从电路板上拔下,擦除操作对整个芯片进行EPROM芯片编程需要外加“高电压”,所以需要专用的“编程器”才能实现EPROM的编程一般情况下对整个芯片进行EEPROM芯片的擦除用电信号实现,无需把芯片从电路板上拔下,可以进行“在系统编程”EEPROM以字节为单位重写,EEPROM没有单独的擦除操作,写入就意味着擦除了原来的内容,所以使用比EPROM快速方便相比较而言,EEPROM芯片的编程比较接近RAM的写入,它们之间的区别主要体现在速度上RAM写入与读出的速度相近,不需要其他的联络信号;EEPROM的写入比起读出明显要慢,为了掌握写入时间,EEPROM通常设置了一根“状态”引脚,供联络使用
9.下列容量的ROM芯片除电源和地线,还有多少个输入引脚和输出引脚?写出信号名称
(1)64×4
(2)512×8
(3)128K×8
(4)16K×8
(5)1M×16根据存储容量计算公式可得以上各芯片的地址、数据引脚分别为64×4地址线k=log2
(64)=log2
(26)=6根,数据线=4根;512×8地址线k=log2
(512)=log2
(29)=9根,数据线=8根;128k×8地址线k=log2(128*1024)=log2
(217)=17根,数据线=8根;16k×8地址线k=log2(16*1024)=log2
(214)=14根,数据线=8根;1M×16地址线k=log2(1024*1024)=log2
(220)=20根,数据线=16根此外,所有ROM芯片都需要一根片选信号引脚;对于PROM,EPROM通常还需要“输出允许”和“编程脉冲”输入引脚EEPROM芯片除了有“片选”、“输出允许”和“写允许”外,通常还有表示“写入完成”的状态信号引脚
10.已知RAM芯片的容量为
(1)16K×8
(2)32K×8
(3)64K×8
(4)2K×8如果RAM的起始地址为3400H、则各RAM对应的末地址为多少存储器的末地址=首地址+芯片内字节数(容量)-1上述各芯片对应RAM的末地址为16K×8末地址是3400H+4000H-1=73FFH32K×8末地址是3400H+8000H-1=B3FFH64K×8末地址是3400H+10000H-1=133FFH2K×8末地址是3400H+800H-1=3BFFH
11.如果存储器起始地址为1800H,末地址为1FFFH,求该存储器的容量该存储器的容量为(1FFFH-1800H+1)×8=800H×8,该存储器有2048×8个位,也可以写作2KB
12.有一个存储体,其地址线15条,数据线8条,则1)该存储体能够存储多少个汉字?2)如果该存储体由2K×4位的芯片组成,需要多少片?3)采用什么方法扩展?分析各位地址线的使用该存储体容量为215×8=32KB,存储一个汉字需要二个字节,因此,它能够存储16384(16K)个汉字需要2K×4位的芯片32片,[(32K×8)/(2K×4)=32]可采用字位全扩展方法,由2片4位的芯片组成1组8位的存储单元,16组扩展成32K的8位存储体芯片直接使用的地址线(片内地址)11根(A0-A10),另外需要4根高位地址,连接到4-16译码器输入端,产生16个译码信号用作16个芯片组的片选信号剩余的地址线用来确定该存储体的首地址
13.试说明FlashMemory芯片的特点及28F040的编程过程FlashMemory也称为“闪速存储器”,有时直接称之为“Flash”Flash既有ROM非易失性的特点,又能够在线擦除和重写,既可读又可写,同时有很高的存取速度,具有集成度高,价格低,耗电少等优点目前存取速度已突破了30ns,掉电后信息可以保持10年Flash的编程方法与E2PROM相同,28F040的编程写入过程采用字节编程方式首先,向28F040状态寄存器写入命令10H,再在指定的地址单元写入相应数据接着查询状态,判断这个字节是否写好,若写好则重复上面过程写入下一个字节,直到全部字节写入28F040的编程速度很快,一个字节的写入时间仅为
8.6µs
14.利用全地址译码将6264芯片接到8088系统总线上,地址范围为30000H~31FFFH,画出逻辑图全地址译码可以保证存储器芯片上的每一个单元在整个内存空间中具有唯一的、独占的一个地址参考教材相关内容,6264芯片有13根地址线,剩余的高位7根地址线通过译码组合确定该芯片的起始地址(30000H)由30000H地址得出对应的地址线状态为00110000000000000000可以看出A13~A19地址线为0011000,所以译码组合应逻辑为=···A16·A17··=(····)·(A16·A17)=A13+A14+A15+A18+A19+A16·A17具体逻辑如右图所示
15.若用2164芯片构成容量为128KB的存储器,需多少片2164?至少需多少根地址线?其中多少根用于片内寻址?多少根用于片选译码?2164A是容量为64K×1位的动态随机存储器芯片,构成128KB的存储器需要2164A芯片16片[128K×8/(64K×1)=16]由于地址空间为128K,需要的地址线总数为17根(217=128K)其中,片内地址线16根(216=64K),片选地址线1根(17-16=1,)每8个2164芯片构成一组,进行位扩展,得到64KB存储器两个这样的“组”进行地址扩展,构成128KB的存储器
16.某8088系统用2764ROM芯片和6264SRAM芯片构成16KB的内存其中,RAM的地址范围为FC000H-FDFFFH,ROM的地址范围为FE000H-FFFFFH试利用74LS138译码,画出存储器与CPU的连接图,并标出总线信号名称2764和6264均为8KB的存储芯片,需要13根地址线(A0~A12)用于片内寻址8088系统的其他地址线(A13~A19)用于产生片选信号FC000H的地址线状态为11111100000000000000FE000H的地址线状态为11111110000000000000将A13~A15用作译码输入,其他地址(A16~A19=1111)用作译码控制,可以得到如下译码控制电路,连接如下图所示
17.存储周期指的是(A)A.存储器进行连续读或写操作所允许的最短时间间隔B.存储器的读出周期C.存储器进行连续写操作所允许的最短时间间隔D.存储器的写入周期存储周期是指连续两次访问存储器之间所需的最小时间存取时间是CPU访问一次存储器(写入和读出)所需的时间存储周期等于存取时间加上存储器的恢复时间所以应选择A
18.某一EPROM芯片,其容量为32K×8,除电源和地线外,最小的输入引脚和输出引脚分别为(C)A.15和8;B.32和8;C.17和8;D.18和10;容量为32K×8的EPROM芯片,其数据线为8根,地址线为15根,片选线1根,读写控制线1根其中地址线、片选线、读写控制线均为EPROM的输入信号,共17根数据线在正常工作状态下用于EPROM输出,计8根所以应选择C
19.掩膜ROM在制造时通过光刻是否连接MOS管来确定0和1,如果对应的某存储单元位没有连接MOS管,则该位信息为(C)A.不确定;B.0;C.1;D.可能为0,也可能为1;掩膜ROM芯片内每一个二进制位对应于一个MOS管,该位上存储的信息取决于这个MOS管的栅极是否被连接到字线上栅极被连接,该单元被选中时,漏极与“地”相通,输出低电平,该位存储的信息就是0栅极未连接时,尽管字线被选中,输出端与“地”仍然不能导通,输出高电平,对应的信息为1所以应选择C
20.SRAM和DRAM存储原理不同,它们分别靠(A)来存储0和1的A.双稳态触发器的两个稳态和极间是否有足够的电荷B.内部熔丝是否断开和双稳态触发器C.极间电荷和浮置栅是否积累足够的电荷D.极间是否有足够的电荷和双稳态触发器的两个稳态静态随机存储器(SRAM)的每一个位存储单元有一个双稳态触发器,由4个晶体管组成,它们的状态确定了该存储单元存储的1位二进制信息而动态随机存储器(DRAM)一般采用单管电路组成,它由一个MOS管T1和一个电容C构成写入时其信息通过位线(数据线)存人电容C中(写入“1”对电容充电,写入“0”则对电容放电);读出时存储在电容C上的电荷通过T1输出到位线上所以应选择A习题三
1.如果用24b储存一个无符号数,这个数的范围是什么?如果储存的是一个补码表示的有符号数,那么这个数的范围又是什么?答如果用24b储存一个无符号数,这个数的范围应为0~224-1如果用24b储存一个补码表示的有符号数,这个数的范围应为-223~+223-
12.用符号“〉”把下面的数按从大到小的顺序“连接”起来[X1]补=10110111[X2]原=10110111[X3]反=10110111[X4]补=10110110[X5]无符号数=10110111解X1=-01001001BX2=-0110111BX3=-01001000BX4=-01001010BX5=+10110111B因此X5X2X3X1X
43.用8位补码完成下列运算,用二进制“真值”的格式给出运算结果,并指出运算后CF、OF、ZF、SF、PF标志位的状态
(1)127+126
(2)126-127
(3)-100-120
(4)-100--120解
(1)127+126
[127]补=01111111,
[126]补=01111110,[127+126]补=11111101,[127+126]=-00000011(溢出)COZSP=01010
(2)126-127
[126]补=01111110,[-127]补=10000001,[126-127]补=11111111,[126-127]=-0000001COZSP=10011
(3)-100-120[-100]补=10011100,[-120]补=10001000,[-100-120]补=00100100,[-100-120]=+00100100(溢出)COZSP=01001
(4)-100--120[-100]补=10011100,[-120]补=10001000,[[-120]补]求补=01111000,[-100-(-120)]补=00010100,[-100-(-120)]=+00010100COZSP=
000014.把二进制代码1001011101011000分别“看作”是
(1)二进制无符号数
(2)二进制补码
(3)压缩BCD码
(4)非压缩BCD码哪一种情况下它代表的“值”最大?答看作二进制无符号数时,它代表的“值”最大分析看作二进制补码时,它代表一个负数,而其它的情况下,它均为正数因此,看作二进制补码时,它代表的值最小把这组代码用十六进制数字形式写出9758对于无符号数,它的值等于十六进制的9758H;对于压缩BCD码,它的值等于十进制的9758,显然小于9758H;对于非压缩BCD码,它的值等于十进制的78,显然更小于9758H;因此,看作二进制无符号数时,它代表的“值”最大
5.某数据段内有如下数据定义Xdb3030H‘ABC’2-311001010Bdw0FFH,-2“CD”Ydd20dup(153dup()0)Zdb3dup()WdwZ-X假设变量X的偏移地址为20H
(1)写出变量X各数据在内存中的具体位置和相关内存单元的值
(2)写出变量Y,Z的偏移地址
(3)写出变量W的值答
(1)变量X各数据在内存中的具体位置和相关内存单元的值如右图变量Y的偏移地址为002EH;变量Z的偏移地址为002EH+4×5×20=01BEH变量W的值等于变量Z和X偏移地址之差01BEH-0020H=019EH它等于变量X、Y所占用内存单元的字节数
6.下列指令的源操作数段基址在哪个段寄存器中?
(1)MOVAX[BP][SI]
(2)MOVAXCS:8[DI]
(3)MOVAX2[EBP*1]
(4)MOVAXFS:4[ESP]
(5)MOVAX2[EBP][EAX]
(6)MOVAX[ECX][EBP*4]
(7)MOCAX[EDX][EBP]
(8)MOVAXES:10[EBP][EAX*2]答各指令源操作数段基址使用的段寄存器如下
(1)SS
(2)CS
(3)SS
(4)FS
(5)SS
(6)DS
(7)DS
(8)ES
7.判断下列指令是否正确若不正确,指出错误原因
(1)MOVAX[EBX]
(2)MOVSIDL
(3)MOVEBP[ESP][EAX*3]
(4)LEAAX3006H
(5)MOV[BP][DI]0
(6)MOV[SI][DI]
(7)MOVES1000H
(8)MOVAXX+2
(9)MOVAXCX+2
(10)MOV[EAX][EAX*2]AL答
(1)指令MOVAX[EBX]是正确的
(2)指令MOVSIDL是错误的,两个操作数类型不匹配
(3)指令MOVEBP[ESP][EAX*3]是错误的,比例因子不能为3
(4)指令LEAAX3006H是错误的,LEA指令的源操作数必须为内存操作数
(5)指令MOV[BP][DI]0是错误的,操作数类型无法确定
(6)指令MOV[SI][DI]是错误的,不能同时出现两个内存操作数
(7)指令MOVES1000H是错误的,装载段寄存器时,源操作数不能为立即数
(8)如果“X”是用常数表达式定义的符号(例如XEQU5+6),或者是用“DW”定义的内存变量,指令MOVAXX+2是正确的否则这条指令是错误的
(9)指令MOVAXCX+2是错误的,源操作数表达式CX+2不是一个可以直接计算的“常数表达式”
(10)指令MOV[EAX][EAX*2]AL是正确的
8.现有(DS)=2000H(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=0B7H,(21203H)=65H,说明下列指令执行后AX寄存器的内容
(1)MOVAX1200H
(2)MOVAXBX
(3)MOVAX[1200H]
(4)MOVAX[BX]
(5)MOVAX1100H[BX]
(6)MOVAX[BX][SI]
(7)MOVAX1100H[BX][SI]答
(1)指令MOVAX1200H执行后,AX=1200H立即数操作数
(2)指令MOVAXBX执行后,AX=0100H寄存器操作数
(3)指令MOVAX[1200H]执行后,AX=4C2AH(直接地址,EA=1200H)
(4)指令MOVAX[BX]执行后,AX=3412H(寄存器间接寻址,EA=0100H)
(5)指令MOVAX1100H[BX]执行后,AX=4C2AH(相对地址,EA=1200H)
(6)指令MOVAX[BX][SI]执行后,AX=7856H(基址变址寻址,EA=0102H)
(7)指令MOVAX1100H[BX][SI]执行后,AX=65B7H(相对基址变址寻址,EA=1202H)
9.下面两条指令的功能有什么区别?MOVAXBXMOVAX[BX]答指令“MOVAXBX”把BX寄存器的内容装入到AX中指令“MOVAX[BX]”把内存储器一个字的内容装入AX寄存器该字的段基址在DS中,偏移地址在BX中
10.写出执行以下计算的指令序列,其中各变量均为16位有符号数
(1)Z←W+Z-X
(2)Z←W-X+6-R+9
(3)Z←W*X/Y+6R←余数
(4)Z←W-X/5*Y*2解
(1)MOVAXWMOVBXZSUBBXXADDAXBXMOVZAX
(2)MOVAXWMOVBXXADDBX6SUBAXBXMOVBXRADDBX9SUBAXBXMOVZAX
(3)MOVAXWIMULXMOVBXYADDBX9IDIVBXMOVZAXMOVRDX
(4)MOVAXYMOVBX5IMULBXMOVBXAXMOVAXWSUBAXXMOVCX2IMULCXIDIVBXMOVZAX
11.一个双字长有符号数存放在DX(高位)AX(低位)中,写出求该数相反数的指令序列结果仍存入DX,AX寄存器解NOTDX;首先将(DXAX)取反NOTAXADDAX1;最低位加1,注意不能用INC指令ADCDX0;把进位(如果有)传递到高位
12.内存缓冲区BUFFER定义如下,按照要求,写出指令序列BUFFERDB20DUP
(1)将缓冲区全部置为0,并使执行时间最短
(2)将缓冲区全部置为空格字符(ASCII代码20H),使用的指令条数最少
(3)将缓冲区各字节依次设置为0,1,2,3,4,……,19
(4)将缓冲区各字节依次设置为0,-1,-2,-3,-4,……,-19
(5)将缓冲区各字节依次设置为30,29,28,27,……,11
(6)将缓冲区各字节依次设置为0,2,4,6,8,……,38
(7)将缓冲区各字节依次设置为0,1,2,3,0,1,2,3,……,3解
(1)XOREAXEAXMOVDWORDPTR[BUFFER]EAXMOVDWORDPTR[BUFFER+4]EAXMOVDWORDPTR[BUFFER+8]EAXMOVDWORDPTR[BUFFER+12]EAXMOVDWORDPTR[BUFFER+16]EAX
(2)MOVAL20HMOVCX20LEABXBUFFERONE:MOV[BX]ALINCBXLOOPONE
(3)XORBXBXMOVCX20ONE:MOVBUFFER[BX]BLINCBXLOOPONE
(4)XORBXBXXORALALMOVCX20ONE:MOVBUFFER[BX]ALINCBXDECALLOOPONE
(5)XORBXBXMOVAL30MOVCX20ONE:MOVBUFFER[BX]ALINCBXDECALLOOPONE
(6)XORBXBXXORALALMOVCX20ONE:MOVBUFFER[BX]ALINCBXADDAL2LOOPONE
(7)XORBXBXMOVCX5ONE:MOVBUFFER[BX]0MOVBUFFER[BX+1]1MOVBUFFER[BX+2]2MOVBUFFER[BX+3]3ADDBX4LOOPONE
13.编写循环结构程序,进行下列计算,结果存入RESULT内存单元
(1)1+2+3+4+5+6+……+100
(2)1+3+5+7+9+11+……+99
(3)2+4+6+8+10+……+100
(4)1+4+7+10+13+……+100
(5)11+22+33+44+……+99解
(1)CODESEGMENTASSUMECS:CODERESULTDWSTART:XORAXAXMOVCX100AGAIN:ADDAXCXLOOPAGAINMOVRESULTAXMOVAX4C00HINT21HCODEENDSENDSTART
(2)CODESEGMENTASSUMECS:CODERESULTDWSTART:XORAXAXMOVCX50MOVBX1AGAIN:ADDAXBXADDBX2LOOPAGAINMOVRESULTAXMOVAX4C00HINT21HCODEENDSENDSTART
(3)CODESEGMENTASSUMECS:CODERESULTDWSTART:XORAXAXMOVCX50MOVBX2AGAIN:ADDAXBXADDBX2LOOPAGAINMOVRESULTAXMOVAX4C00HINT21HCODEENDSENDSTART
(4)CODESEGMENTASSUMECS:CODERESULTDWSTART:XORAXAXMOVCX34MOVBX1AGAIN:ADDAXBXADDBX3LOOPAGAINMOVRESULTAXMOVAX4C00HINT21HCODEENDSENDSTART
(5)CODESEGMENTASSUMECS:CODERESULTDWSTART:XORAXAXMOVCX9MOVBX11AGAIN:ADDAXBXADDBX11LOOPAGAINMOVRESULTAXMOVAX4C00HINT21HCODEENDSENDSTART
14.已知ARRAY是5行5列的有符号字数组,编写程序,进行下列计算(假设和仍然为16b,不会产生溢出)
(1)求该数组第4列所有元素之和(列号从0开始)
(2)求该数组第3行所有元素之和(行号从0开始)
(3)求该数组正对角线上所有元素之和
(4)求该数组反对角线上所有元素之和解假设数据段已定义如下DATASEGMENTARRAYDW1692312;定义数组ARRAYDW542315-9237;每一行5个数据DW-99231768190;共5行DW336781-990;共计25个数据DW123-5277-18089SUMDW;SUM存放结果DATAENDS
(1)CODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVAX0;累加器在循环之前清零MOVCX5;计数器置初值MOVSI4*2;第1行第4列元素在数组内的位移NEXT:ADDAXARRAY[SI]ADDSI5*2;SI指向下一行第4列元素LOOPNEXTMOVSUMAXMOVAX4C00HINT21HCODEENDSENDSTART
(2)CODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVAX0;累加器在循环之前清零MOVCX5;计数器置初值MOVSI3*5*2;第3行第0列元素在数组内的位移NEXT:ADDAXARRAY[SI]ADDSI2;SI指向本行下一列元素LOOPNEXTMOVSUMAXMOVAX4C00HINT21HCODEENDSENDSTART
(3)CODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVAX0;累加器在循环之前清零MOVCX5;计数器置初值MOVSI0;第0行第0列元素在数组内的位移NEXT:ADDAXARRAY[SI]ADDSI5*2+2;SI指向正对角线上下一个元素LOOPNEXTMOVSUMAXMOVAX4C00HINT21HCODEENDSENDSTART
(4)CODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVAX0;累加器在循环之前清零MOVCX5;计数器置初值MOVSI4*2;第0行第4列元素在数组内的位移NEXT:ADDAXARRAY[SI]ADDSI5-1*2;SI指向反对角线上下一个元素LOOPNEXTMOVSUMAXMOVAX4C00HINT21HCODEENDSENDSTART
15.变量XYZ均为一字节压缩BCD码表示的十进制数,写出指令序列,求它们的和(用2字节压缩BCD码表示)解XORAXAX;清AX,用于存放2字节结果MOVALXADDALY;完成X+YDAA;压缩BCD码加法调整ADCAH0;把可能的进位收集到AH中;AH中最大的可能值为2,因此不需要BCD加法调整ADDALZ;完成X+Y+ZDAA;压缩BCD码加法调整ADCAH0;把可能的进位收集到AH中;计算完成,结果(2字节压缩BCD码)在AX中
16.设(BX)=0E3H,变量VALUE中存放内容为79H,指出下列指令单独执行后的结果
(1)XORBXVALUE
(2)ANDBXVALUE
(3)ORBXVALUE
(4)XORBX0FFH
(5)ANDBXBX
(6)ANDBX0答
(1)指令“XORBXVALUE”执行后,(BX)=009AH
(2)指令“ANDBXVALUE”执行后,(BX)=0061H
(3)指令“ORBXVALUE”执行后,(BX)=00FBH
(4)指令“XORBX0FFH”执行后,(BX)=001CH
(5)指令“ANDBXBX”执行后,(BX)=00E3H
(6)指令“ANDBX0”执行后,(BX)=0000H
17.编写程序,从键盘上输入20个十进制数字,求这些数字的和,向显示器输出INCLUDEYLIB.HDATASEGEMNTMESS1DB0DH0AH‘Input20decimaldigitsplease:$’MESS2DB0DH0AH‘Theirsumis:$’DATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXLEADXMESS1MOVAH09HINT21H;输出提示信息XORBXBX;BX用作累加器,清零MOVCX20;循环计数器置初值AGAIN:MOVAH01HINT21H;输入一个数字(在AL中)ANDAL0FH;转换成二进制数ADDBLAL;累加ADCBH0LOOPAGAINLEADXMESS2MOVAXBXCALLWRITEDEC;输出20个数字的和CALLCRLFMOVAX4C00HINT21HCODEENDSENDSTART
18.阅读以下程序,指出它的功能MOVCL04SHLDXCLMOVBLAHSHLAXCLSHRBLCLORDLBL答把32位二进制代码(DXAX)联合左移4位
19.已知(DX)=0B9H,(CL)=3,(CF)=1,确定下列指令单独执行以后DX寄存器的值
(1)SHRDX1
(2)SARDXCL
(3)RORDXCL
(4)ROLDXCL
(5)SALDH1
(6)RCLDXCL答
(1)指令“SHRDX1”执行之后,(DX)=005CH
(2)指令“SARDXCL”执行之后,(DX)=0017H
(3)指令“RORDXCL”执行之后,(DX)=2017H
(4)指令“ROLDXCL”执行之后,(DX)=05C8H
(5)指令“SALDH1”执行之后,(DX)=00B9H
(6)指令“RCLDXCL”执行之后,(DX)=05CCH
20.写程序,从键盘上输入一个0~65535之间的十进制无符号数,然后用二进制格式输出这个值例如,键盘输入“35”,显示器输出“0000000000100011”答INCLUDEYLIB.HDATASEGEMNTMESS1DB0DH0AH‘Inputaunsigneddecimalintegernumberplease:$’MESS2DB0DH0AH‘Thenumberinbinaryis:$’DATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXLEADXMESS1CALLREADDEC;输入一个无符号整数MOVBXAX;转存入BXLEADXMESS2MOVAH09HINT21H;输出提示信息MOVCX16;循环计数器置初值AGAIN:SHLBX1;向左外移一位,进入CFMOVDL30HADCDL0;形成一位二进制数字的ASCII代码MOVAH2INT21H;输出一个二进制数字LOOPAGAIN;循环16次CALLCRLFMOVAX4C00HINT21HCODEENDSENDSTART
21.无符号数变量X用DD定义,编写程序,用十六进制格式输出变量X的值答DATASEGEMNTXDD36895471;一个32B长整数MESSDB0DH0AH‘TheXinhexdecimalis:$’HEXTABDB‘0123456789ABCDEF’DATAENDSCODESEGMENTUSE16ASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXLEADXMESSMOVAH09HINT21H;输出前导信息MOVSIwordptrX+2;将X高16位存入SIMOVCX4;循环计数器置初值LEABXHEXTAB;换码表首地址装入BXAGAIN1:ROLSI4;把最高4位移到最低4位上MOVAXSI;低8位转入ALANDAX000FH;清除高4位XLAT;转换成十六进制数字的ASCII代码MOVDLALMOVAH2INT21H;输出一个十六进制数字LOOPAGAIN1;循环8次MOVSIwordptrX;将X低16位存入SIMOVCX4;循环计数器置初值AGAIN2:ROLSI4;把最高4位移到最低4位上MOVAXSI;低8位转入ALANDAX000FH;清除高4位XLAT;转换成十六进制数字的ASCII代码MOVDLALMOVAH2INT21H;输出一个十六进制数字LOOPAGAIN2;循环8次MOVAX4C00HINT21HCODEENDSENDSTART
22.编写指令序列,把AX中的16b二进制分为4组,每组4b,分别置入AL,BL,CL,DL中答MOVDXAX;最低4位直接进入DXMOVCX4ROLAXCL;最高4位移入最低4位PUSHAX;压入堆栈保存(准备送入AL)ROLAXCL;次高4位移入最低4位MOVBXAX;送入BLROLAXCL;第3组4位移入最低4位MOVCXAX;送入CLPOPAX;从堆栈中弹出原最高4位ANDAX000FH;清除高12位ANDBX000FH;清除高12位ANDCX000FH;清除高12位ANDDX000FH;清除高12位习题四
1.什么是“三种基本结构”?解释“基本”两个字在其中的含义答三种基本结构指顺序结构,选择结构、循环结构使用这3种结构,可以编制出任何所需要的程序,因此冠以“基本”结构
2.什么叫做“控制转移指令”?它和数据传送、运算指令有什么区别?它是怎样实现它的功能的?答控制转移指令是可以改变指令执行顺序的指令数据传送、运算指令总是顺序执行的,而控制转移指令通过改变IP和/或CS寄存器的值,改变了程序指令的执行顺序
3.指令“JMPDI”和“JMPWORDPTR[DI]”作用有什么不同?请说明答上述两条指令都是段内近转移指令,但是偏移地址的来源不同指令“JMPDI”执行时,新的偏移地址在DI寄存器内,“JMPWORDPTR[DI]”时,目的偏移地址在存储单元中,该存储单元的地址在DS:DI中
4.已知(AX)=836BH,X分别取下列值,执行“CMPAXX”后,标志位ZF、CF、OF、SF各是什么?
(1)X=3000H
(2)X=8000H
(3)X=7FFFFH
(4)X=0FFFFH
(5)X=0答上述指令执行后,标志位ZF、CF、OF、SF的状态分别是
(1)ZCOS=0010
(2)ZCOS=0000
(3)ZCOS=0010
(4)ZCOS=0101
(5)ZCOS=
00015.已知(AX)=836BH,X分别取下列值,执行“TESTAXX”后,标志位ZF、CF、OF、SF各是什么?
(1)X=0001H
(2)X=8000H
(3)X=0007H
(4)X=0FFFFH
(5)X=0答上述指令执行后,标志位ZF、CF、OF、SF的状态分别是
(1)ZCOS=0000
(2)ZCOS=0001
(3)ZCOS=0000
(4)ZCOS=0001
(5)ZCOS=
10006.测试名为X的一个字节,如果X的第1,3位均为1,转移到L1,如果只有一位为1,转移到L2,如果两位全为0,转移到L3写出对应的指令序列答MOVALXANDAL00001010BJZL3CMPAL00001010BJEL1JMPL
27.假设X和X+2字单元存放有双精度数P,Y和Y+2字单元存放有双精度数Q,下面程序完成了什么工作?MOVDXX+2MOVAXX;双精度数P送入DXAXADDAXXADCDXX+2;计算2*P送入DXAXCMPDXY+2;2P与Q的高位比较JLL2;2PQ,转L2(Z=2)JGL1;2PQ,转L1(Z=1)CMPAXY;如果高位相等,则比较低位JBEL2;2P的低位小于等于Q的低位,转L2(Z=2)L1:MOVZ1JMPSHORTEXITL2:MOVZ2EXIT:……答程序根据2P与Q的大小,确定Z的值如果2P≤Q,则Z=2如果2PQ,则Z=1请参阅程序注解
8.编写指令序列,将AX和BX中较大的绝对值存入AX,较小的绝对值存入BX答ANDAXAXJGESKIP1NEGAXSKIP1:ANDBXBXJGESKIP2NEGBXSKIP2:CMPAXBXJGESKIP3XCHGAXBXSKIP3:……
9.编写指令序列,比较AX、BX中的数的绝对值,绝对值较大的数存入AX,绝对值较小的数存入BX答PUSHAXPUSHBXANDAXAXJGESKIP1NEGAXSKIP1:ANDBXBXJGESKIP2NEGBXSKIP2:CMPAXBXPOPBXPOPAXJGESKIP3XCHGAXBXSKIP3:……
10.编写指令序列,如果AL寄存器存放的是小写字母,把它转换成大写字母,否则不改变AL内容答CMPAL‘a’JBDONECMPAL‘z’JADONESUBAL‘a’-‘A’DONE:……
11.计算分段函数X的值从键盘输入,Y的值送显示器输出答INCLUDEYLIB.HDATASEGEMNTMESS1DB0DH0AH‘InputvalueofXplease:$’MESS2DB0DH0AH‘Y=:$’DATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXLEADXMESS1CALLREADINT;输入X的值CMPAX-2JGEL2L1:SUBAX3;AX←X-3JMPDONEL2:CMPAX3JGL3MOVBXAXADDAXAX;AX←2XADDAXAX;AX←4XADDAXBX;AX←5XADDAX6;AX←5X+6JMPDONEL3:MOVAX2;AX←2DONE:LEADXMESS2CALLWRITEINT;输出Y的值CALLCRLFMOVAX4C00HINT21HCODEENDSENDSTART
12.计算分段函数AB的值从键盘输入,Y的值送显示器输出(∧表示“并且”,∨表示“或者”)答INCLUDEYLIB.HDATASEGEMNTMESS1DB0DH0AH‘InputthevalueofAplease:$’MESS2DB0DH0AH‘InputthevalueofBplease:$’MESS3DB0DH0AH‘Y=:$’ADWBDWDATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXLEADXMESS1CALLREADINT;输入AMOVAAXLEADXMESS2CALLREADINT;输入BMOVBAXANDAXAXJLL1;B0,转L1CMPA0JLL1;A0,转L1JNZSKIP1CMPB0JZL2;A=0B=0,转L2JMPEXIT;A=0B≠0,无定义,转EXITSKIP1:CMPB0JLEEXIT;A≠0B=0,无定义,转EXITL3:MOVAXASUBAXBJMPDISPL2:MOVAX2JMPDISPL1:MOVAXAADDAXBDISP:LEADXMESS2CALLWRITEINT;输出Y的值CALLCRLFEXIT:MOVAX4C00HINT21HCODEENDSENDSTART说明如果把A、B看作是平面直角坐标的两根轴,那么这个函数在A,B的正轴上无定义无法计算,也无法输出结果
13.编写程序,求10元素字数组LIST中绝对值最小的数,存入MIN单元答DATASEGEMNTLISTDW-56+1288-126-51632-9972-18MINDWMINABSDWDATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVAXLISTMOVMINAX;将数组第一个元素假设为绝对值最小的数MOVMINABS32767;最小的绝对值假设为32767LEASILISTMOVCX10AGAIN:MOVAX[SI]CMPAX0JGESKIP1NEGAX;求绝对值SKIP1:CMPAXMINABS;绝对值与假设的最小绝对值比较JGESKIP2;假设的绝对值较小,跳过MOVMINABSAX;保存新的最小绝对值MOVAX[SI];取出新的绝对值最小的数MOVMINAX;保留新的绝对值最小的数SKIP2:ADDSI2LOOPAGAINMOVAX4C00HINT21HCODEENDSENDSTART说明一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小的数必须来自LIST数组
14.编写程序,求20元素无符号字数组ARRAY中最小的奇数,存入ODD单元,如果不存在奇数,将ODD单元清零答DATASEGEMNTARRAYDW56128812651632997218DW116349232156428161615218ODDDWDATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVBX0MOVODD65535;将65535假设为最小的奇数LEASIARRAYMOVCX20AGAIN:MOVAX[SI]TESTAX1;测试是否为奇数JZSKIP;不是奇数跳过INCBX;记录奇数个数CMPAXODD;奇数与预设的最小奇数比较JGESKIP;大于预设奇数,跳过MOVODDAX;小于预设奇数,保留SKIP:ADDSI2LOOPAGAINCMPBX0;判有无出现过奇数JNZDONEMOVODD0;未出现过,把ODD单元清零DONE:MOVAX4C00HINT21HCODEENDSENDSTART
15.一个有符号字数组以0为结束标志,求这个数组的最大值、最小值、平均值答DATASEGEMNTLISTDW-56+1288-126-51632-9972-180MINDWMAXDWAVGDWDATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVMIN32767;将32767假设为最小的数MOVMAX-32768;将-32768假设为最大的数MOVAVG0;AVG用作累加器,清零LEASILISTMOVCX0AGAIN:MOVAX[SI]CMPAX0JZDONE;找到零元素,转DONE结束处理INCCX;记录非零元素个数ADDAVGAX;累加CMPAXMINJGESKIP1MOVMIN.AX;比预设最小值还小,保留SKIP1:CMPAXMAXJLESKIP2MOVMAXAX;比预设最大值还大,保留SKIP2:ADDSI2JMPAGAINDONE:JCXZNULL;元素个数为零,转NULL处理MOVAXAVGCWDIDIVCXMOVAVGAX;计算平均值JMPEXITNULL:MOVMIN0;元素个数为0,将“最大值”、“最小值”MOVMAX0;“平均值”清零MOVAVG0EXIT:MOVAX4C00HINT21HCODEENDSENDSTART
16.数组SCORE中存有一个班级40名学生的英语课程成绩按照0~59,60~74,75~84,85~100统计各分数段人数,存入N0,N1N2N3变量内答DATASEGEMNTSCOREDW40DUP;运行前置入具体数据N0DWN1DWN2DWN3DWDATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVN00;各计数器清零MOVN10MOVN20MOVN30LEASISCOREMOVCX40AGAIN:MOVAX[SI]CMPAX59;分段测试JAL1L0:INCN0JMPNEXTL1:CMPAX74JAL2INCN1JMPNEXTL2:CMPAX84JAL3INCN2JMPNEXTL3:CMPAX100JANEXTINCN3NEXT:ADDSI2LOOPAGAINEXIT:MOVAX4C00HINT21HCODEENDSENDSTART
17.STRING是一个16个字符组成的字符串,RULE是一个字整数编写程序,测试STRING中的每一个字符,如果该字符为数字字符,把RULE中对应位置1,否则置0答DATASEGEMNTSTRINGDB16DUP;运行前置入具体字符RULEDWDATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVRULE0;RULE置为初始状态LEASISTRINGMOVCX16AGAIN:SHLRULE1;右侧空出一位MOVAL[SI]CMPAL‘0’;测试是否数字JBNEXTCMPAL‘9’JANEXTORRULE1;将RULE对应位置1NEXT:INCSILOOPAGAINEXIT:MOVAX4C00HINT21HCODEENDSENDSTART
18.编写程序,从键盘上输入一个无符号字整数,用“四进制”格式输出它的值(也就是,每2位二进制看作一位四进制数,使用数字0~3)答INCLUDEYLIB.HDATASEGEMNTMESS1DB0DH0AH‘Inputanumberplease:$’MESS2DB0DH0AH‘Thenumberinquardri_systemis:$’DATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXLEADXMESS1CALLREADDEC;输入一个无符号整数MOVBXAX;转存到BXLEADXMESS2MOVAH9INT21H;输出前导信息MOVCX8ONE:ROLBX1ROLBX1;最高2位移到最低位MOVDLBL;转存到DLANDDL00000011B;保留最低2位ORDL30H;转换成ASCII代码MOVAH2INT21H;输出LOOPONECALLCRLFMOVAX4C00HINT21HCODEENDSENDSTART
19.编写程序,把一个30个元素的有符号字数组ARRAY按照各元素的正负分别送入数组P和M,正数和零元素送P数组,负数送M数组答DATASEGEMNTARRAYDW30DUP;汇编之前置入数据PDW30DUPMDW30DUPDATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXLEABXARRAY;ARRAY数组指针MOVSI0;P数组指针MOVDI0;M数组指针MOVCX30ONE:MOVAX[BX];从ARRAY数组取出一个数据ANDAXALJGEPLUS;正数、零转PLUSMINUS:MOVM[DI]AX;负数存入M数组ADDDI2JMPNEXTPLUS:MOVP[SI]AX;正数、零存入P数组ADDSI2NEXT:ADDBX2LOOPONEMOVAX4C00HINT21HCODEENDSENDSTART
20.缓冲区BUFFER中存放有字符串,以0为结束标志编写程序,把字符串中的大写字母转换成小写字母答DATASEGEMNTBUFFERDB‘AStringforTest.’0DATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXLEABXBUFFER;BUFFER缓冲区指针ONE:MOVAL[BX];从缓冲区取出一个字符ANDALALJZQUIT;为零,处理完成CMPAL‘A’JBNEXTCMPAL‘Z’JANEXTADDAL‘a’-‘A’MOV[BX]ALNEXT:INCBXJMPONEQUIT:MOVAX4C00HINT21HCODEENDSENDSTART
21.编写程序,从键盘上输入无符号字整数X,Y的值,进行X+Y的运算,然后按以下格式显示运算结果和运算后对应标志位的状态SUM=XXXXZF=Y,OF=Y,SF=Y,CF=Y(其中X为十进制数字,Y为0或1)答INCLUDEYLIB.HCODESEGMENTASSUMECS:CODEMESS1DB0DH0AH‘Inputaunsignedintegerplease:$’MESS2DB0DH0AH‘SUM=$’MESS3DB0DH0AH‘ZF=’ZFDBDB‘OF=’OFDBDB‘SF=’SFDBDB‘CF=’CFDBDB0DH0AH‘$’START:PUSHCSPOPDSLEADXMESS1CALLREADDECMOVCXAX;输入XLEADXMESS1CALLREADDEC;输入YADDAXCX;求和PUSHF;保留标志位状态LEADXMESS2CALLWRITEDEC;输出两个数的和POPBX;标志寄存器内容转存入BXMOVAL‘0’TESTBX1000000B;测试ZFJZSKP1INCALSKIP1:MOVZFALMOVAL‘0’TESTBX100000000000B;测试OFJZSKP2INCALSKIP2:MOVOFALMOVAL‘0’TESTBX10000000B;测试SFJZSKP3INCALSKIP3:MOVSFALMOVAL‘0’TESTBX1;测试CFJZSKP4INCALSKIP4:MOVCFALLEADXMESS3MOVAH9INT21H;输出标志位状态MOVAX4C00HINT21HCODEENDSENDSTART
22.编写程序,从键盘上输入一个字符串,统计其中数字字符,小写字母,大写字母,空格的个数并显示答INCLUDEYLIB.HCODESEGMENTASSUMECS:CODEMESS1DB0DH0AH‘Inputastringplease:$’BUFFERDB8181DUPMESS2DB0DH0AH‘Digits:$’MESS3DB0DH0AH‘Uppercasealphabet:$’MESS4DB0DH0AH‘Lowercasealphabet:$’MESS5DB0DH0AH‘Space:$’START:PUSHCSPOPDSLEADXMESS1MOVAH09HINT21H;输出提示信息LEADXBUFFERMOVAH0AHINT21H;输入字符串XORDXDX;各计数器清零XORBXBXMOVCLBUFFER+1MOVCH0;字符个数送CXLEASIBUFFER+2;设置字符指针ONE:MOVAL[SI];取出一个字符CMPAL‘‘JNEL2L1:INCDL;空格字符计数JMPNEXTL2:CMPAL‘0’JBNEXTCMPAL‘9’JAL4L3:INCDH;数字字符计数JMPNEXTL4:CMPAL‘A’JBNEXTCMPAL‘Z’JAL6L5:INCBH;大写字符计数JMPNEXTL6:CMPAL‘a’JBNEXTCMPAL‘z’JANEXTINCBL;小写字母计数NEXT:INCSILOOPONE;循环控制PUSHDXMOVALDHLEADXMESS2MOVAH0CALLWRITEDEC;输出数字字符个数LEADXMESS4MOVALBLMOVAH0CALLWRITEDEC;输出小写字母个数LEADXMESS3MOVALBHMOVAH0CALLWRITEDEC;输出大写字母个数POPDXMOVALDLMOVAH0LEADXMESS5CALLWRITEDEC;输出空格个数MOVAX4C00HINT21HCODEENDSENDSTART
23.编写程序,读入20个数据,统计每个相同数据出现的次数答INCLUDEYLIB.HDATASEGEMNTNUMBERDW20DUPTIMESDW20DUPMESSDB0DH0AH‘InputanumberofNO.$’DATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXLEASINUMBERMOVCX20MOVBX1INPUT:LEADXMESSMOVAXBXCALLWRITEDEC;输出提示信息和序号MOVDX-1CALLREADDEC;输入一项数据MOV[SI]AL;保存成绩INCBXADDSI2LOOPINPUTLEABXTIMESMOVCX20INIT:MOVBYTEPTR[BX]-1;将“出现次数”初始值设为-1ADDBX2LOOPINITMOVDI0;DI为被统计数据指针MOVCX20STAT0:PUSHCXMOVCX20MOVSI0;SI为其它数据的指针MOVALNUMBER[DI];取出被统计数据STAT1:CMPALNUMBER[SI];与其他数据相比较JNESKIPINCTIMES[DI];出现相同数据,次数加1SKIP:ADDSI2LOOPSTAT1;比较下一个数据POPCXADDDI2LOOPSTAT0MOVAX4C00HINT21HCODEENDSENDSTART
24.编写程序,打印九九乘法表答INCLUDEYLIB.HCODESEGMENTASSUMECS:CODESPACEDB‘$’;乘积不足两位时补一个空格START:CALLCRLFMOVSI1;SI为被乘数MOVCX9LOOP0:PUSHCXMOVCX9MOVDI1;DI为乘数LOOP1:MOVAXSIMULDIMOVDX-1CMPAX10JAESKIPLEADXSPACE;乘积不足两位时补一个空格SKIP:CALLWRITEDEC;输出乘积INCDILOOPLOOP1CALLCRLF;结束一行INCSIPOPCXLOOPLOOP0MOVAX4C00HINT21HCODEENDSENDSTART子程序WRITEDEC输出时,数据前后各留出一个空格程序中对一位数的乘积补上一个空格,这样每个数据共占用4个字符位置,使输出对齐
25.编写程序,显示1000以内的所有素数答INCLUDEYLIB.HCODESEGMENTASSUMECS:CODESTART:CALLCRLFMOVSI2;SI为被测试的1000以内的整数MOVCX0;CX记录一行上已输出数据个数;每行输出10个素数ONE:MOVDISISHRDI1;计算测试范围MOVBX2;第一个测试数据TST:CMPBXDI;测试完成?JAOK;测试完成,是素数,转OKMOVAXSICWDDIVBX;除法测试CMPDX0JZNEXT;整除,本数据非素数,转NEXTINCBX;形成下一个测试数据JMPTST;继续测试OK:INCCX;统计本行输出数据个数CMPCX10JLEOUTPUT;本行数据未满10个,直接输出XORCXCX;本行数据已满10个,清计数器CALLCRLF;输出回车换行OUTPUT:MOVDX-1MOVAXSICALLWRITEDEC;输出一个素数NEXT:INCSI;产生下一个被测试数据CMPSI1000JBONE;未完成,继续CALLCRLF;结束一行MOVAX4C00HINT21HCODEENDSENDSTART
26.编写程序,输入N,计算S=1*2+2*3+……+N-1*N答INCLUDEYLIB.HCODESEGMENTASSUMECS:CODEMESS1DB0DH0AH‘InputNplease:$’MESS2DB0DH0AH‘S=$’START:PUSHCSPOPDSLEADXMESS1CALLREADDEC;输入NMOVCXAXXORBXBX;BX用作累加器ONE:MOVAXCXMOVSIAXDECSIMULSI;计算J*J-1ADDBXAX;累加LOOPONELEADXMESS2MOVAXBXCALLWRITEDEC;输出结果CALLCRLFMOVAX4C00HINT21HCODEENDSENDSTART
27.编写程序,输入N,输出如下矩阵(设N=5)1111122221333214432154321答设I为行(1~5),J为列(1~5),则(IJ)位置上的数据为I(6-J)I:6-JINCLUDEYLIB.HCODESEGMENTASSUMECS:CODESTART:CALLCRLFMOVSI1;SI为行号ROW:MOVCX5;CX为6-列号COL:CMPSICX;判断当前位置JBUPDOWN:MOVAXCX;下半三角,取6-列号JMPOUTPUTUP:MOVAXSI;上半三角,取行号OUTPUT:MOVDX-1CALLWRITEDEC;输出一个数据LOOPCOLCALLCRLF;结束本行INCSI;修改行号CMPSI5JBEROW;未满5行,继续MOVAX4C00HINT21HCODEENDSENDSTART28据下面条件,画出每次调用子程序或返回时的堆栈状态
(1)主程序调用NEAR属性的SUB1子程序,返回的偏移地址为1200H.
(2)进入SUB1后调用NEAR属性的SUB2子程序,返回的偏移地址为2200H.
(3)进入SUB2后调用FAR属性的SUB3子程序,返回的段基址为4000H,偏移地址为0200H
(4)从SUB3返回SUB2后
(5)从SUB2返回SUB1后
(6)从SUB1返回主程序后解29编写几个简单的子程序
(1)显示一个字符的子程序入口参数DL=字符的ASCII码
(2)从键盘上读取一个字符的子程序出口参数读取字符的ASC码在CHAR中
(3)输出换行回车的子程序无入口、出口参数解
(1)SHOWPROCMOVAH02HINT21HRETSHOWENDP
(2)READKEYPROCMOVAH01HINT21HMOVCHARALRETREADKEYENDP
(3)CRLFPROCMOVAL0AHMOVAH02HINT21HMOVAL0DHINT21HRETCRLFENDP30阅读下面的子程序,叙述它完成的功能,它的入口参数和出口参数各是什么?CLSCREENPROCMOVAX0600HMOVCX0MOVDHXMOVDLYMOVBH07HINT10HRETCLSCREENENDP解屏幕窗口上卷,左上角为(0,0),右下角为(yx),卷入行属性为黑底白字31编写程序,键入一个以$为结束符的数字串,统计其中“0”~“9”各个数字出现的次数,分别存放到S0~S9这10个单元中去解.MODELSMALL.DATAS0DB0S1DBS2DB0S3DB0S4DB0S5DB0S6DB0S7DB0S8DB0S9DB0KEYINDB100DUP
0.CODESTART:MOVAX@DATAMOVDSAXMOVCX0LEABXKEYINNEXT:MOVAH01HINT21HCMPAL$JZCOUNTINCCXMOV[BX]ALINCBXJMPNEXTCOUNT:LEABXKEYINCOUNT1:LEADIS0MOVAL[BX]SUBAL30HMOVAH0ADDDIAXINCBYTEPTR[DI]INCBXLOOPCOUNT1MOVAX4C00HINT21HENDSTART32编写求绝对值的子程序,利用它计算3个变量的绝对值之和解.MODELSMALL.DATAVALUEDW-55-10SUMDW
0.CODESTART:MOVAX@DATAMOVDSAXLEABXVALUEMOVCX3MOVSUM0ONE:CALLABSADDSUMAXADDBX2LOOPONEMOVAX4C00HINT21H;子程序ABS;功能求一个字整数的绝对值;入口字整数的偏移地址在BX中;出口该字整数的绝对值在AX中ABSPROCMOVSUM0AGAIN:MOVAX[BX]ANDAXAXJGESKIPNEGAXSKIP:RETABSENDPENDSTART33子程序计算从2开始的NN50个偶数之和(2+4+6+…),主程序从键盘输入整数N,调用子程序求出N个偶数之和,并显示结果解INCLUDEYLIB.H.MODELSMALL.DATASUMDW0PROMPT1DB0DH0AHINPUTTHENUMBERN:$PROMPT2DB0DH0AHTHESUMIS:$.CODESTART:MOVAX@DATAMOVDSAXLEADXPROMPT1CALLREADDECCMPAX0JZEXITMOVCXAXCALLSUMMLEADXPROMPT2CALLWRITEDECCALLCRLFEXIT:MOVAX4C00HINT21HSUMMPROCMOVAX0NEXT:MOVBXCXADDBXBXADDAXBXLOOPNEXTRETSUMMENDPENDSTART34从键盘输入一串字符,以$为结束符,存储在BUF中子程序把字符串中的大写字母改成小写字母,最后由主程序把字符串送显示器输出解.MODELSMALL.DATABUFDB100DUP.CODESTART:MOVAX@DATAMOVDSAXLEABXBUFCALLKEYINCALLCONVERTLEADXBUFMOVAH09HINT21HMOVAX4C00HINT21HKEYINPROCPUSHBXMOVCX0NEXT:MOVAH01HINT21HMOV[BX]ALCMPAL$JZEXITINCCXINCBXJMPNEXTEXIT:POPBXRETKEYINENDPCONVERTPROCCONVERT1:MOVAL[BX]CMPALAJBNEXT1CMPALZJANEXT1ADDBYTEPTR[BX]20HNEXT1:INCBXLOOPCONVERT1RETCONVERTENDPENDSTART35从键盘输入一个字符串(长度80),若该字符串不包括非数字字符,则显示“YES”,否显示“NO”设计一个过程,判断字符串是否为数字串解DATASEGMENTSTRINGDB8081DUPYESDB0DH0AHYES.$NODB0DH0AHNO.$DATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVAH0AHLEADXSTRINGINT21HMOVCLSTRING+1MOVCH0MOVSI2CALLEXAMCMPAH0JENOMESSLEADXYESJMPDISPNOMESS:LEADXNODISP:MOVAH09HINT21HMOVAX4C00HINT21HEXAMPROCMOVAH1NEXT:MOVALSTRING[SI]CMPAL0JBEXITCMPAL9JAEXITINCSILOOPNEXTJMPEXIT1EXIT:MOVAH0EXIT1:RETEXAMENDPCODEENDSENDSTART36编写完整程序,调用READINT子程序,从键盘读入一个带符号整数,以二进制格式输出它的补码解INCLUDEYLIB.HDATASEGMENTNUMDWPROMPT1DB0DH0AHINPUTANUMBER:$PROMPT2DB0DH0AHTHECOMPLEMENTIS:$DATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXLEADXPROMPT1CALLREADINTPUSHAXLEADXPROMPT2MOVAH09HINT21HPOPAXCALLDISPCALLCRLFMOVAX4C00HINT21HDISPPROCMOVCX16MOVBXAXNEXT:ROLBX1RCLDL1ANDDL01HORDL30HMOVAH02HINT21HLOOPNEXTRETDISPENDPCODEENDSENDSTART37设计一个子程序,求带符号字数组中绝对值最大的数,返回其地址和最大值入口参数DS:SI=数组首地址,CX=元素个数(大于0);出口参数ES:DI=绝对值最大的数所在的地址,AX=绝对值最大的数;解MAXABSPROCPUSHCXPUSHSIPUSHDSPOPESXORAXAXNEXT:MOVBXWORDPTR[SI]ANDBXBXJZOKNEGBXOK:CMPBXAXJLESKIPMOVAXBXMOVDISISKIP:ADDSI2LOOPNEXTPOPSIPOPCXRETMAXABSENDP38编写一个子程序,以AX为入口参数,把AX中的各个二进制位颠倒次序后还放回AX中例如,入口参数AX=1011000111101001B,处理后AX应为1001011110001101B解INVERTPROCPUSHCXPUSHBXMOVCX16NEXT:ROLAX1RCRBX1LOOPNEXTMOVAXBXPOPBXPOPCXRETINVERTENDP39编写子程序,入口参数是一个字型数据,存放在AX中,统计该字的16个二进制位中含有多少个1和多少个0解DATASEGMENTNUMDW1234HZERODB0ONEDB0DATAENDSCODESEGMENTASSUMEDS:DATACS:CODESTART:MOVAXDATAMOVDSAXMOVAXNUMMOVCX16CALLCOUNTMOVONEALMOVZEROAHMOVAX4C00HINT21HCOUNTPROCPUSHBXMOVBX0NEXT:ROLAX1ADCBX0LOOPNEXTMOVBH16SUBBHBLMOVAXBXPOPBXRETCOUNTENDPCODEENDSENDSTART40使用串操作指令,在STRING字符串中查找有无字符‘A’,如有将标志flag置1,否则将flag清0答程序如下.MODELSMALL.DATASTRINGDBALLSTUDENTS$FLAGDB
0.CODESTART:MOVAX@DATAMOVESAXLEADISTRINGMOVCXFLAG-STRINGMOVAL‘A’CLDREPNZSCASBJZYESMOVFLAG0JMPEXITYES:MOVFLAG1EXIT:MOVAX4C00HINT21HENDSTART41在STRING中查找空格,记下最后一个空格的位置,存放在变量SPACE中如果没有空格,置SPACE为-1答程序如下.MODELSMALL.DATASTRINGDBTHISISANEXAMPLE$SPACEDW
0.CODESTART:MOVAX@DATAMOVDSAXMOVSPACE-1LEASISTRINGCLDAGA:LODSBCMPAL$JEOKENDCMPAL‘‘JNZNEXTMOVSPACESIDECSPACENEXT:JMPAGAOKEND:MOVAX4C00HINT21HENDSTART42两个字符串str1与str2以“$”字符结束,比较它们的字符是否相同,如果相同,在屏幕上显示“Yes.”,否则显示“No.”答程序如下.MODELSMALL.DATASTRING1DBALLSTUDENTS$STRING2DBALLSTODENTS$MESS1DBYES.$MESS2DBNO.$.CODESTART:MOVAX@DATAMOVDSAXMOVESAXLEASISTRING1LEADISTRING2CLDAGA:LODSBSCASBJNENOTSCMPAL‘$’JNEAGAYES:LEADXMESS1JMPEXITNOTS:LEADXMESS2EXIT:MOVAH09HINT21HMOVAX4C00HINT21HENDSTART习题五1.接口电路与外部设备之间传送的信号有哪几种?传输方向怎样?数据信号对于输入设备,数据信号从外设通过接口送往总线,对于输出设备,数据信号从总线通过接口发往外部设备状态信号状态信号表明外部设备当前的工作状态,用来协调CPU与外部设备之间的操作状态信号总是从外部设备通过接口发往总线控制信号控制信号是CPU向外设发出的命令,它指定设备的工作方式,启动或停止设备控制信号从CPU通过接口发往外部设备2.接口电路有哪些功能?哪些功能是必需的?接口电路可以具备设备选择功能、信息传输功能、数据格式转换功能、联络功能、中断管理功能、复位功能、可编程功能和错误检测等功能其中设备选择功能和信息传输功能是每一个接口电路所必备的其他的功能是否需要则由设备的特点和工作方式决定3.I/O端口的编址有哪几种方法?各有什么利弊?80X86系列CPU采用哪种方法?I/O端口的编址有两种不同的方式I/O端口与内存统一编址把内存的一部分地址分配给I/O端口,一个8位端口占用一个内存单元地址已经用于I/O端口的地址,存储器不能再使用I/O端口与内存统一编址后,访问内存储器单元和I/O端口使用相同的指令,这有助于降低CPU电路的复杂性,并给使用者提供方便但是,I/O端口占用内存地址,相对减少了内存可用范围而且,由于难以区分访问内存和I/O的指令,降低了程序的可读性和可维护性I/O端口与内存独立编址这种编址方法中,内存储器和I/O端口各自有自己独立的地址空间访问I/O端口需要专门的I/O指令80x86CPU采用I/O端口独立编址方式4.按照传输信号的种类,I/O端口有几种?它们信号的传输方向怎样?按照传输信号的种类,I/O端口有三种数据端口数据信息从端口输入CPU(输入设备接口),或者从CPU写入端口(输出设备接口);状态端口外设状态信息从端口输入CPU;控制端口命令信息从CPU写入端口5.I/O端口译码电路的作用是什么?在最小模式和最大模式下分别有哪些输入信号?I/O端口译码电路用于产生端口的读写选择信号在最小模式下,译码电路接受来自总线的地址信号(16位),(=0),或者信号最大模式下,译码电路接受地址信号(16位),或者信号6.外部设备数据传送有哪几种控制方式?从外部设备的角度,比较不同方式对外部设备的响应速度外部设备数据传送有以下四种控制方式直接传送方式(也称为无条件传送方式、同步传送方式)这种情况下,外部端口完全被动地等待CPU的访问,没有确定的响应速度,响应时间取决于CPU忙碌的程度以及程序对外部设备控制采取的策略查询方式如果CPU在某一时刻只对一个外设采用查询方式进行数据传输,CPU的响应延迟约为3~10个指令周期响应速度快于中断方式,慢于DMA方式中断方式CPU的响应延迟平均为几十个指令周期,慢于查询方式,但是这种方式可以同时管理多个外部设备DMA方式外部端口的传输请求由DMA控制器响应,由于DMAC是一个专用于传输控制的电路,任务单一,不发生DMA传输竞争时,响应延迟仅为1~2个DMAC使用的时钟周期,远快于中断方式和查询方式7.叙述一次查询式输出过程中,接口内各电路、信号的状态变化过程一个数据的查询式输出过程由二个阶段组成CPU从接口反复读取状态字由地址译码电路产生状态端口选择信号,该信号不影响接口内部的状态外部设备输出完成后,返回“确认”信号,该信号将状态寄存器相关位(READY)置位如状态字表明外设已处于“就绪”状态,则向数据端口传送数据由地址译码电路产生的数据端口选通信号一方面将数据总线上的数据写入数据寄存器,同时清除状态寄存器中的相关位(READY),向输出设备发出输出启动信号有的输出接口设有控制端口,输出启动信号通过写控制端口产生8.比较程序中断方式和查询方式的区别,根据比较,指出中断工作方式的优缺点中断方式外部设备工作完成后,通过“中断请求”信号“主动”向CPU“报告”查询方式外部设备工作完成后,状态信号储存在接口电路内,被动地等待CPU来读取根据上述比较,可以得到中断工作方式的如下特点优点1)CPU能够及时了解外部设备的状态,从而对外部设备IO请求进行及时处理2)由于CPU“被动”地等待外部设备的“中断请求”,外部设备进行输入/输出操作时,CPU可以同时执行其他的程序,CPU和外部设备“并行”工作3)由于同样的原因,在中断方式下,CPU可以同时管理多台外部设备,CPU的效率得到提高缺点1)用中断方式需要CPU增加相应的管理逻辑,增加了CPU电路的复杂性2)由于CPU“被动”地接收“中断请求”信号,CPU必须通过与外部的一个联络过程才能知道是那一个设备在申请中断,这增加了响应时间为了从当前任务转移到中断服务,CPU必须保护原有的运行环境,进行“任务”的“切换”,这也会增加响应时间3)有较多的设备使用中断方式时,会产生“中断申请”的“竞争”这一方面降低了响应速度,另一方面增加了管理的复杂性9.比较DMA方式和程序中断方式的区别,根据比较,指出DMA工作方式的优缺点中断方式外部设备每进行一个数据的输入/输出,都要通过“中断申请”要求CPU进行处理CPU通过执行一段“中断服务程序”完成数据的传输DMA方式CPU通过对DMAC的初始化,启动一个数据块的传输操作之后的数据传输通过信号的联络,在外设接口和存储器之间进行,CPU只需简单地让出总线,而无需其他操作根据上述比较,可以得到DMA工作方式的如下特点优点1)对于CPU而言,它的任务仅仅是在一个数据块传输之前对DMAC进行初始化,CPU用于传输控制的操作达到最小(不考虑与通道/IO处理器方式的比较),CPU的效率最高CPU与外设“并行”工作2)外部设备一个数据输入/输出完成后,向DMAC申请进行数据传输,响应时间仅为DMAC的1~3个时钟周期响应速度达到最快,可以满足高速传输的需要缺点1)实现DMA控制需要增加DMA控制器和总线控制逻辑,增加了系统的复杂性2)DMA传输需要占用总线,并且具有较高的“优先级”这使得系统对其他设备的响应速度不能得到明确的保证10.某输入设备接口数据端口、状态端口、控制端口地址分别为70H71H72H状态端口D5=1表示输入完成,控制端口D7=1表示启动设备输入(输入完成后由设备清除该位)从该设备输入100个字节数据,存入以BUFFER为首地址的缓冲区如果启动该设备1秒后仍未完成一次输入,则视为超时错,显示出错信息后返回分别用8086汇编语言和C语言编写完成上述功能的I/O程序汇编语言程序DATASEGMENTBUFFERDB100DUPERRORDB1310“OVERTIME!”1310“$”DATAENDS;CODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVCX100LEABXBUFFERONE:XORDXDX;DX用作响应计时器,初值0MOVAL80HOUT72HAL;启动输入W:INAL71HINCDX;记录延迟时间TESTAL00100000B;测试完成位JNZREAD;输入完成,转READ读取数据CMPDX50000;假设循环50000次时间为1秒JBW;未超时,继续测试JMPOVERTIME;超过1秒,报告出错READ:INAL70H;读入数据MOV[BX]AL;数据存入缓冲区INCBX;修改指针LOOPONE;100个数据尚未输入完成,转ONE继续JMPDONE;100个数据输入完成,转DONE结束程序OVERTIME:LEADXERRORMOVAH9INT21H;响应超时,显示出错信息DONE:MOVAX4C00HINT21H;返回OSCODEENDSENDSTARTC语言程序main{intistatustimebuffer
[100];fori=0;i100;i++{outportb0x720x80;/*启动输入*/fortime=0;time20000;time++{status=inportb0x71;/*读状态*/ifstatus0x20{buffer[i]=inportb0x70;exit;}/*读数据,保存*/}iftime=20000{printf“\nOverTime!\n”;exit;}/*超时报错*/}}11.某输出设备数据端口、状态端口地址分别为220H221H状态端口D0=1表示输出完成将数据段中以STRING为首地址的20个字符(用七位ASCII代码存储)添加水平和垂直校验发送到该外部设备用8086汇编语言编写完成上述功能的I/O程序汇编语言程序DATASEGMENTSTRINGDB20DUPSUMDB0DATAENDS;CODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVCX20LEABXSTRINGMOVSUM0;垂直校验码初值为0ONE:MOVDX221H;DX置为状态端口地址INALDXTESTAL00000001B;测试输出完成位JZONE;未完成,转ONE继续读取状态MOVAL[BX];从字符串取出一个字符的ASCII代码ANDAL07FH;清除最高位,准备置入校验位JPEOUTPUT;判代码奇偶属性,ORAL80H;奇数个“1”,最高位置1(偶校验)OUTPUT:MOVDX220HOUTDXAL;输出添加了校验位的代码XORSUMAL;生成垂直校验位INCBX;修改指针LOOPONE;20个数据尚未输出完成,转ONE继续MOVDX221H;输出垂直校验代码LAST:INALDXTESTAL00000001BJZLASTMOVALSUMMOVDX220HOUTDXALDONE:MOVAX4C00HINT21H;返回OSCODEENDSENDSTART12.试画出矩阵式键盘查询的程序流程图上述流程中假设键盘为8×8结构,如果有键按下,返回它的8位扫描码其中最低3位为该键所在列,次低3位为该键所在行,最高2位为0如果没有键按下,返回8位“1”13.试画出公用端口多位LED输出的程序流程图习题六1.什么叫中断?有哪几种不同类型的中断?由于某个事件的发生,CPU暂停当前正在执行的程序,转而执行处理该事件的一个程序该程序执行完成后,CPU接着执行被暂停的程序这个过程称为中断根据中断源的位置,有两种类型的中断有的中断源在CPU的内部,称为内部中断大多数的中断源在CPU的外部,称为外部中断根据中断引脚的不同,或者CPU响应中断的不同条件,也可以把中断划分为可屏蔽中断和不可屏蔽中断两种2.什么是中断类型?它有什么用处?用若干位二进制表示的中断源的编号,称为中断类型中断类型用来区分不同的中断,使CPU能够在中断响应时调出对应的中断服务程序进行中断处理3.有哪几种确定中断优先级的方法?说明每一种方法各自的优劣之处确定中断优先权有四种可选的方法1软件查询法采用程序查询的方法确定中断服务的顺序这种方法中断逻辑最简单(基本上不需要外部中断逻辑),优先级可以灵活设置,但中断响应所需时间最长2分类申请法CPU分设二个中断申请信号的输入引脚这种方法需要CPU提供条件3链式优先权排队菊花链法这种方法需要的外部中断逻辑比较简单,容易实现,但是设备较多时信号延迟大,对设备故障敏感4可编程中断控制器:“向量”优先权排队专用电路这种方法功能最全面,控制灵活,可以通过程序设定中断优先权为固定的或循环的,但需要增加专用的中断控制器4.什么是中断嵌套?使用中断嵌套有什么好处?对于可屏蔽中断,实现中断嵌套的条件是什么?CPU在处理级别较低的中断过程中,出现了级别较高的中断请求CPU停止执行低级别中断的处理程序而去优先处理高级别中断,等高级别中断处理完毕后,再接着执行低级别的未处理完的中断处理程序,这种中断处理方式称为多重(级)中断或中断嵌套使用中断嵌套可以使高优先级别的中断得到及时的响应和处理对于可屏蔽中断,由于CPU在响应中断时已将IF清零,所以一定要在中断处理程序中加入开中断指令,才有可能进行中断嵌套5.什么叫中断屏蔽?如何设置I/O接口的中断屏蔽?用程序的方法使某些中断源的中断请求不能够发送到CPU,或者虽然能够发送但是不能得到响应,这种方法称为中断屏蔽在外设的接口内增设一个中断屏蔽触发器(可以用D触发器实现),该触发器的端与中断请求信号相“与”后连接到INTR当=0时,中断请求不能发往INTR通过设定中断屏蔽触发器的状态,可以控制中断请求信号是否能够送到INTR端置IF=0可以使80x86CPU不响应来自INTR的可屏蔽中断请求6.什么是中断向量?中断类型为1FH的中断向量为2345H1234H,画图说明它在中断向量表中的安置位置中断服务程序的入口地址称为中断向量中断类型为1FH,它的中断向量放置在1FH×4=0000:7CH开始的位置上如右图7.叙述一次可屏蔽中断的全过程
(1)中断源请求中断外部中断源通过INTR引脚向CPU请求中断
(2)中断响应中断源提出中断请求后,如果CPU处于允许中断状态(IF=1);没有不可屏蔽中断请求和总线请求;当前指令执行结束则转入中断响应周期在中断响应周期CPU取得中断源的中断类型;将标志寄存器FLAGS和CS、IP(断点)先后压入堆栈保存;清除自陷标志位TF和中断允许标志位IF;读中断向量表,获得相应的中断服务程序入口地址,转入中断服务程序
(3)中断服务中断服务程序的主要内容包括保护现场开中断中断处理关中断恢复现场
(4)中断返回8.简要叙述8259A内部IRRIMRISR三个寄存器各自的作用三个寄存器长度均为8位IRR用来记录引脚IR7~IR0上由外部设备送来的中断请求信号当外部中断请求线IRi变为有效时,IRR中与之对应的第i位被置1IMR用于设置对中断请求的屏蔽信号此寄存器的第i位被置1时,与之对应的外部中断请求线IRi被屏蔽,不能向CPU发出INT信号可通过软件设置IMR内容,确定每一个中断请求的屏蔽状态ISR用于记录当前正在被服务的所有中断级,包括尚未服务完而中途被更高优先级打断的中断级若CPU响应了IRi中断请求,则ISR中与之对应的第i位置1ISR用于中断优先级管理9.8259A是怎样进行中断优先权管理的?8259A通过以下两种途径实现对中断优先权的管理
(1)通过设置中断屏蔽寄存器IMR,可以屏蔽某些中断请求,从而动态地改变各请求端的优先级别
(2)8259A响应某个中断请求之后,将ISR寄存器对应位置1如果后续的中断请求级别低于正在响应的中断请求,则该中断不能立即被响应反之,如果新的中断请求级别高于正在响应的中断请求,则允许进行中断嵌套中断服务结束时,应将ISR寄存器对应位清零10.特殊全嵌套方式有什么特点?它的使用场合是什么?特殊全嵌套方式一般用于级联方式下的8259A主片如果8259A主片在一次中断处理尚未结束时,收到了来自同一个引脚的第二次中断请求,并且该8259A采用普通全嵌套方式,则它不会响应来自同一个引脚的第二次中断请求如果该8259A采用特殊全嵌套方式,就会响应该请求(中断嵌套),从而可以及时响应连接在同一从片8259A上,并且相对有较高优先级别的中断请求11.向8259A发送“中断结束”命令有什么作用?8259A有哪几种中断结束方式?分析各自的利弊中断服务完成时,必须给8259A一个命令,使这个中断级别在ISR中的相应位清“0”,表示该中断处理已经结束,允许响应新的较低级别的中断这个命令称为“中断结束”命令8259A有两种不同的中断结束方式
(1)自动中断结束方式(AEOI)8259A在中断响应周期内自动清除ISR中对应位这种方式使用简单,但是不能充分实现中断的优先权管理这种方式只能用在系统中只有一个8259A,且多个中断不会嵌套的情况
(2)非自动中断结束方式(EOI)从中断服务程序返回前,在程序里向8259A输出一个中断结束命令(EOI),把ISR对应位清“0”这种方式可以有效地实现中断优先权的管理,从而保证高优先级的中断可以得到及时响应但是,如果在程序里忘了将ISR对应位清零,那么,8259A将不再响应这个中断以及比它级别低的中断请求12.某系统中有两片8259A,从片的请求信号连主片的IR2引脚,设备A中断请求信号连从片IR5引脚说明设备A在一次I/O操作完成后通过两片8259A向8086申请中断,8086CPU通过两片8259A响应中断,进入设备A中断服务程序,发送中断结束命令,返回断点的全过程设备A通过从片IR5引脚向从片发出中断请求;从片将IRR5置“1”,并通过INT(与主片IR2相连)向主片发出中断请求;主片将IRR2置“1”,通过INT(与CPU的INTR相连)向CPU发出中断请求;CPU通过第一个向主片和从片响应中断请求;主片8259A在CAS0~CAS2上发出代码“010”,表示连接在IR2上的从片中断被响应,同时主片还把本片ISR2置“1”,把本片IRR2清“0”;从片收到第一个和主片CAS0~CAS2上发来的010代码后,将本片ISR5置“1”,同时把本片IRR5清“0”收到第二个后,将本片IRR5对应的中断类型通过数据总线发往CPU;CPU进入设备A的中断服务程序,在程序中先后对主片和从片发出中断结束命令,两个芯片内的ISR2和ISR5先后被清零中断服务结束,返回断点继续执行13.某8086系统用3片8259A级联构成中断系统,主片中断类型号从10H开始从片的中断申请连主片的IR4和IR6引脚,它们的中断类型号分别从20H、30H开始主、从片采用电平触发,嵌套方式,普通中断结束方式请编写它们的初始化程序假设主片端口地址为10H,12H从片的端口地址分别为18H1AH和1CH1EH……MOVAL00011001B;主片ICW1OUT10HAL;电平触发,级连方式MOVAL10H;主片ICW2OUT12HAL;主片中断类型MOVAL01010000B;主片ICW3OUT12HAL;IR4,IR6连有从片MOVAL00010001B;主片ICW4OUT12HAL;特殊全嵌套,非自动中断结束MOVAL00011001B;从片ICW1OUT18HAL;电平触发,级连方式MOVAL20H;从片ICW2OUT1AHAL;从片中断类型MOVAL00000100B;从片ICW3OUT1AHAL;本片连接在主片IR4引脚上MOVAL00000001B;从片ICW4OUT1AHAL;非特殊全嵌套,非自动中断结束MOVAL00011001B;从片ICW1OUT1CHAL;电平触发,级连方式MOVAL30H;从片ICW2OUT1EHAL;从片中断类型MOVAL00000110B;从片ICW3OUT1EHAL;本片连接在主片IR6引脚上MOVAL00000001B;从片ICW4OUT1EHAL;非特殊全嵌套,非自动中断结束注意
(1)由于8086系统有16根数据线,各8259A的端口地址均为偶数(假设各8259A的数据线连接在8086系统的低8位数据线上)
(2)主片用特殊全嵌套,从片用一般全嵌套14.给下面的8259A初始化程序加上注释,说明各命令字的含义MOVAL13H;ICW1:边沿触发,单片8259AOUT50HAL;MOVAL08H;ICW2:中断类型高5位为00001OUT51HAL;MOVAL0BH;ICW4:非特殊全嵌套,缓冲方式,主片,非自动中断结束OUT51HAL;15.设8259A端口地址为20H和21H,怎样发送清除ISR3的命令?为了清除ISR3,需要通过OCW2发送特殊的中断结束命令,使SL=1EOI=1L2L1L0=011指令如下MOVAL01100011BOUT20HAL16.图4-17能否直接用于8086系统?为什么?图4-17不能直接用于8086系统,原因是
(1)多个设备的中断请求如果直接送往CPU,应采用“线或”的方法,每个接口的中断请求信号应由“OC门(集电极开路门)”以“负逻辑”的方式连接,如下图
(2)电路没有解决中断优先权的问题CPU用信号响应中断时,会将所有正在申请中断的接口的请求信号清除加接“菊花链”可以解决该问题
(3)电路没有解决中断类型的发送问题,需要增加相关电路例如,把设备接口的INTR连接到8259A习题七1.8255A的方式选择控制字和C口按位控制字的端口地址是否一样,8255A怎样区分这两种控制字?写出A端口作为基本输入,B端口作为基本输出的初始化程序解
(1)8255A的方式选择控制字和C口按位控制字的端口地址一样,它们之间的区别在控制字的D7位(特征位)的值不同,8255A的方式选择控制字D7=1,而C口按位置位/复位控制字D7=0
(2)初始化程序(设端口地址为,A口200H,B口201H,控制口203H)MOVAL,90HMOVDX,203HOUTDX,AL2.用8255A的A端口接8位二进制输入,B端口和C端口各接8只发光二极管显示二进制数编写一段程序,把A端口读入的数据送B端口显示,而C端口的各位则采用置0/置1的方式显示A端口的值解(设端口地址为,A口200H,B口201H,C口202H,控制口203H)MOVAL,90H;8255A初始化MOVDX,203H;8255A各组方式0,A口输入OUTDX,AL;B、C口输出MOVDX,200HINAL,DX;读A口输入值MOVDX,201HOUTDX,AL;送B口输出MOVAH,AL;A口输入值转存在AH中MOVDX,203HMOVCX,08;CX置循环次数初值MOVAL,00H;C端口置0/置1控制字初值LPA ANDAL,0FEH;清除最低位SHRAH1;A端口一位转入CFADCAL0;A端口一位从CF转入命令字OUTDX,AL;A端口一位从送往C端口对应位ADDAL,02H;形成下一个命令字LOOPLPA;处理C端口下一位3.将8255A用作两台计算机并行通信的接口电路,请画出采用查询式输入/输出方式工作的接口电路,并写出采用查询式输入/输出方式的程序解用两片8255作两台计算机8088_A与8088_B之间并行通信的接口电路,两片8255之间的连接如下图所示两片8255均在方式
1、查询方式下工作8088-A#0;8255A#0;#0;8088-B#0;D7��D0#0;A0A1#0;A0A1#0;D7��D0#0;#0;8255A#0;A��#0;B��#0;8255B#0;A��#0;A0A1#0;A0A1#0;#0;A0A1#0;��������#0;CS#0;��������#0;��������#0;#0;#0;PC4STB#0;A��#0;PC6ACK#0;CS#0;PC0#0;PC0#0;
(1)8088_A输出程序(8255_A的A口作为数据输出口,C口的PC0作为“数据输出选通”信号,负脉冲输出C口的PC6作为“应答”信号输入,负脉冲有效端口地址A口200H,C口202H,控制口203H)DATASEGMENTBufferDB“Thisisaexample.”0DH0AH-1DATAENDSCODESEGMENTSTART:MOVAXDATAMOVDSAXLEABXBuffer;输出缓冲区指针送BXMOVDX,203HMOVAL,0A0H;8255_A的方式选择字,A口工作在方式
1、输出,C口低四位输出OUTDX,ALMOVAL1OUTDXAL;将PC0置1CALLDELAY;延时等待对方完成初始化;A口查询方式输出NEXT:MOVDX202HINALDLTESTAL80H;判别是否有效JZNEXT;数据尚未取走,等待MOVDX,200HMOVAL[BX]OUTDXAL;输出一项数据INCBXMOVDX203HMOVAL0OUTDXALNOPNOPINCALOUTDXAL;通过PC0向对方发选通信号(负脉冲)CMPBYTEPTR[BX-1]-1;判断输出是否完成JNENEXT;未完成,继续MOVAX4C00HINT21HCODEENDSENDSTART
(2)8088_B输入程序(8255_B的A口作为输入,方式1,PC4作为“数据输入选通”信号,输入,负脉冲有效PC0为“应答”信号输出,负脉冲有效端口地址A口210H,C口212H,控制口213H)DATASEGMENTBufferDB80DUP(?)DATAENDS;CODESEGMENTSTART:MOVAXDATAMOVDSAXLEABXBuffer;输入缓冲区指针送BXMOVDX213HMOVAL0B0H;8255_B的方式选择字,A口工作在方式1,输入,C口低四位输出OUTDXALMOVAL01HOUTDXAL;PC0置1,表示没有“应答”信号CALLDELAY;延时等待对方状态就绪;A口查询方式输入AGA:MOVDX212HINALDXTESTAL20HJZAGA;PC5IBF是否为1,不是,无数据输入,继续查询MOVDX210HINALDXMOV[BX]ALMOVDX212HMOVAL0OUTDXALINCBXNOPNOPINCALOUTDXAL;通过PC0向发送方发“应答”负脉冲CMPBYTEPTR[BX-1]-1;数据接收完了吗?JNEAGA;未完,继续MOVAX4C00HINT21HCODEENDSENDSTART说明这道题有多种可选的解法,上面的方法是程序比较简单的一种这种方法实施时,应先启动8088B,使它首先“就绪”,然后开始通讯由于双方都用负脉冲进行选通,联络过程比较简单,也比较可靠可选的另一种方法是在上述连接的基础上用中断方式进行数据传输,以提高CPU的工作效率需要编制双方的中断服务程序,初始化时要设置中断向量,允许8255中断,开放中断等操作当然也要连接相应的中断请求信号线可选的第三种方法是双方用一根状态线(C端口某一位)送往对方,用这两根线进行联络(“握手”)这种方法看似简单,其实程序是比较复杂的双方联络的过程如下图8088B在初始化完成后,把它的状态线置为“高电平”,表示可以开始接受数据而8088A在初始化完成后,把它的状态线置为“低电平”,表示数据传输尚未开始18088A查询8088B的状态,在发现8088B“就绪”(状态线为高电平)后,把数据发往8255的(A或B)端口28088A发出数据之后把本机状态置为“就绪”(高电平),表示数据已经送到端口的数据线上38088B查询8088A的状态,得知8088A的状态线“就绪”,知道8088A已经把数据送出,于是从8255接收数据,并把自身的状态线置为“未就绪”,表示已经把8088A发出的数据接收48088A查询到8088B的状态线变为低电平,知道对方已经把数据接收完成,于是把本机的状态线置为“低电平”,表示这个数据的发送已经完成,而下一个数据尚未发出58088B查询到8088A的状态线变为“低电平”,知道对方已经结束了第一个数据的传输,在本机做好下一个数据的接收准备之后(例如,把数据存入缓冲区,如果缓冲区满,则把缓冲区内容存入磁盘文件),把本机状态线置为“高电平”,表示已经做好了接收下一个数据的准备68088A得知8088B做好准备,发送下一个数据于是,下一个数据的传输可以由此开始转
①这种方法实施时,应首先启动8088A4.设计一个用8255A作为8个七段显示器的接口电路,并设计一个把内存地址为ADDRA的8个数字在这8个七段显示器上显示的程序解设8个七段显示器采用共阳接法,A口控制段的显示,B口控制位的显示端口地址A口200H,B口201H,控制口203HDATASEGMENTADDRADB××××××××TABLEDB40H4FH24H30H19HDB12H02H78H00H10HDISPBITDBDATAENDSCODESEGMENTASSUMECS:CODEDS:DATASTART:MOVAXDATAMOVDSAXMOVAL80H;对8255A初始化,方式0,输出MOVDX203HOUTDXALLEABXTABLE;BX置为七段码表首地址MOVDISPBIT7FH;置位码初值为7FHLEASIADDRA;SI置为显示缓冲区首地址MOVCX8;CX置为循环次数初值8AGA:MOVAL0FFHMOVDX201HOUTDXAL;熄灭所有数码管MOVAL[SI];取出一个待显示数XLAT;转换成七段码MOVDX200HOUTDXAL;送入段码端口MOVALDISPBIT;MOVDX201HOUTDXAL;送当前位码,点亮一个数码管RORDISPBIT1;产生下一个位码INCSI;修改指针,指向下一个待显示数据CALLDELAY;延时LOOPAGA;处理下一个数码管的显示MOVAX4C00HINT21HCODEENDSENDSTART5.8254定时/计数器的定时与计数方式有什么区别?8254在方式0工作时,各通道的CLK、GATE信号有什么作用?各通道的控制字地址都相同,8254是怎样区分的?解
(1)8254作为计数器使用时,对CLK端的输入脉冲进行单纯的减法计数,这时CLK端输入的脉冲不作为计时基准此外,用作计数器时,计数完成后必须重新初始化,只能使用一次8254作为定时器使用时,要求CLK端输入的脉冲必须作为时钟基准,通过对该基准时钟脉冲的计数来实现精确定时用作定时器时,计数的过程周而往复,重复进行
(2)8254工作在方式0时,CLK端输入计数用的脉冲信号;GATE信号为高电平时,对CLK端输入的脉冲进行计数;GATE信号为低电平时,暂停计数;GATE信号重新为高电平后,恢复原先的计数
(3)由8254的方式控制字中的D
7、D6两位来选择计数通道6.设8254的端口地址为0240H~0243H,通道0输入的CLK频率为1MHz,为使通道0输出1KHz的方波,编写初始化程序如果让通道0与通道1级联(即OUT0接CLK1)实现1秒钟定时,则初始化程序如何编制解
(1)通道0输出1KHz的方波计数初值为1MHz/1KHz=1000,等于十六进制数03E8H,控制字设定为先写低8位,后写高8位,方式3工作,二进制计数方式,所以控制字为36H初始化程序如下MOVAL,36H;MOVDX,243H;写入通道0的控制字OUTDX,AL;MOVDX,240H;MOVAL,0E8H;写入通道0的时间常数OUTDX,AL;MOVAL,03H;OUTDX,AL;
(2)通道0与通道1级联实现1秒定时要实现1秒定时,对1MHz输入脉冲进行分频的系数为1000000=5000×200通道0工作在方式2,分频系数200,采用十进制计数,则通道0方式控制字为25H通道1工作在方式0,分频系数5000,也采用十进制计数,则通道1方式控制字为61H初始化程序如下MOVAL,25H;通道0控制字方式2,十进制计数,只写高8位MOVDX,243H;OUTDX,AL;MOVAL,61H;通道1控制字方式0,十进制计数,只写高8位OUTDX,AL;MOVDX,0240H;MOVAL,02H;通道0时间常数(BCD数高8位)OUTDX,AL;MOVAL,50H;通道1时间常数(BCD数高8位)MOVDX,0241H;OUTDX,AL;如果要再次进行1秒钟定时,则需要对通道1重新初始化如果需要连续的1秒定时信号,则通道1应选用方式3对总数为1000000的分频系数,可以有多种分解方法7.编制一个使PC机的8254产生600Hz方波的程序,并使该方波送至扬声器发声解PC机中利用8254定时器的通道2来驱动扬声器通道2的工作及其输出受到主板上8255A的PB口(口地址61H)控制GATE2接PB0,即PB0=1时,定时器才可能工作;OUT2与PB1相与后输出到扬声器,即PB1=1时,定时器2的OUT2才能输出到扬声器定时器的输出波形是对
1.1931MHZ频率信号分频得到的,因此将定时器2工作在方式3,分频系数用下式计算分频系数=1193100÷给定频率(1193100=12348CH)因此程序如下MOVAL,0B6H;通道2控制字方式3,16位常数OUT43H,AL;送入8254控制端口MOVDX,12H;MOVAX,348CH;DXAX中置入常数12348CHMOVDI,600;DI为输出频率DIVDI;除法运算,计算分频系数OUT42H,AL;低8位送通道2MOVAL,AH;OUT42H,AL;高8位送通道2INAL,61H;ORAL,3;OUT61H,AL;将8255A的B端口低2位置“1”8.在RS-232C接口标准中,引脚TxD、RxD、、、、、的功能是什么?解TxD:串行数据输出RxD:串行数据输入数据终端准备好状态,低电平有效用于向调制解调器或外设表示数据终端已准备好数据设备准备好状态,低电平有效调制解调器或外设准备好时有效请求发送信号,低电平有效表示数据终端设备已经做好发送数据的准备,请调制解调器/外设准备接收数据清除发送(允许传送)信号,低电平有效调制解调器/外设作好传送准备,允许数据终端设备发送数据时有效9.16550的通信控制寄存器中的寻址位有什么作用?在初始化编程时,应该怎样设置?解16550芯片内,接收缓冲寄存器/发送保持寄存器的地址与除数低字节寄存器的地址相同,中断允许寄存器的地址与除数高字节寄存器的地址相同为了区分同一地址的不同用途,16550使用DLAB位来加以标识DLAB位是通信线控制寄存器的最高位D7,该位设置为0,随后的相应操作对接收缓冲寄存器/发送保持寄存器或中断允许寄存器进行;该位设置为1,随后的相应操作对除数寄存器进行在向除数寄存器写入初值之前,应将DLAB置为1由于一般不需要重复访问除数寄存器,写完除数后应将DLAB置为0,以方便后续的操作10.编写用PC机中16550查询方式输入50个字符的异步通信程序设16550的端口地址为3F8H~3FFH,数据格式为8位数据位、1位偶校验位、2位停止位,通信速率为
19.2Kbps解接收子程序中,如果接收成功,清CF标志,否则,置位CF标志位程序如下;16550查询方式接收程序DATASEGMENTREC_DATADB50DUP;存放接收的数据TIMESDW50;要接收的数据个数DATAENDSCODESEGMENTASSUMECS CODE,DS DATABEGINMOVAX,DATAMOVDS,AX;初始化16550MOVDX,03FBH;16550控制寄存器地址送DXMOVAL,80H;置DLAB=1,设置除数寄存器OUTDX,ALMOVAX,003CH;波特率为19200bps时,除数为003CHMOVDX,03F8H;除数寄存器地址送DXOUTDX,ALMOVAL,AHINCDXOUTDX,ALMOVAL,1FH;8位数据位,偶校验,2位停止位MOVDX,03FBH;16550控制寄存器地址送DXOUTDX,AL;写入控制字……CALLRECEIVE……MOVAH,4CH;程序结束,返回操作系统INT21H;查询方式接收子程序RECEIVEPROCNEARLEABX,REC_DATA;接收缓冲区首地址送BXMOVCX,TIMES;要接收的数据个数送CXREPIN MOVDX,03FDH;通信状态寄存器地址送DXINAL,DXTESTAL,1EH;检测接收过程有无错误JNZERRORTESTAL,01H;检测接收缓冲器中是否有数据JZREPIN;没有数据,继续检测MOVDX,03F8H;数据接收寄存器地址送DXINAL,DXMOV[BX],ALINCBXLOOPREPINCLC;接收成功,清CF标志位JMPDONEERROR STC;接收不成功,置CF标志位DONE RETRECEIVEENDPCODEENDSENDBEGIN11Intel8251A与16550芯片相比较,有些什么不同之处?答两个芯片的主要区别是
(1)16550芯片只能进行异步串行通讯,而Intel8251A不仅可以进行异步串行通讯,而且也可以用于同步串行通讯
(2)Intel8251A芯片没有内部的波特率发生电路,因此,它所需要的发送、接收时钟信号只能依赖外部提供12为什么Intel8251A芯片初始化时需要先送3个00H,1个40H?是否每次都需要?答由于Intel8251A只使用两个端口地址,所有的控制信息都写入同一个地址的端口内这样,所有的控制信息必须按照一定的顺序写入,否则就会产生错误为了保证初始化时,Intel8251A芯片处于初始的状态,可以向Intel8251A先送3个00H,1个40H如果程序能够确保Intel8251A已经处于初始状态,那么这项操作是可以省略的习题八
1.什么是DMA传输?DMA传输有什么优点?为什么?所谓直接存储器传送(DMA)是指将外设的数据不经过CPU直接送入内存储器,或者,从内存储器不经过CPU直接送往外部设备使用DMA传输之后,每个数据的传输过程不需要CPU参与,在DMA控制器的控制下,在一个DMA总线周期里完成数据在外部接口和存储单元之间的直接传输所以使用DMA传输既可以减轻CPU的负担,又可以缩短系统对外部设备的响应时间,提高数据传输速率
2.叙述一次数据块DMA传输和一个数据DMA传输的全过程一次数据块DMA传输的全过程程序对DMA控制器进行初始化,写入存储器数据块首地址,传输字节数,传输方向等信息同时启动外部设备(例如,启动输出设备进行第一次输出);外部设备每完成一次输入/输出,它的完成信号通过DMA控制器启动一次DMA数据传输;全部预设的数据传输完成,DMA控制器发出“传输完成”信号,向CPU申请中断CPU在中断服务程序中设置完成标志,或者对DMA控制器进行下一次初始化一个数据DMA传输的全过程外设准备就绪,需要进行DMA操作时,向DMA控制器发出“DMA请求信号”DMA控制器接到此信号后,向CPU发“总线请求信号”CPU接到总线请求信号,在当前总线周期结束后,发出“DMA响应信号”DMAC向外部设备发出“外设读”或“外设写”控制信号,向存储器发出“存储器写”或“存储器读”控制信号,同时发出存储单元地址在这二个信号的作用下,一字节的数据从外设接口通过数据总线送往存储单元,或者从存储单元送往外设接口传送1个字节之后,DMAC自动修改内部地址寄存器和字节计数器的内容DMA控制器撤销“总线请求信号”,CPU也撤销“总线应答”信号
3.什么叫DMA通道?它如何组成?DMA通道是控制一个外设接口和存储器进行DMA传输的相关电路的总和每个通道包括地址寄存器、字节计数器、方式寄存器、DMA请求触发器、屏蔽触发器、状态寄存器以及所需的其他控制电路
4.DMA控制器8237A的成组传送方式和单字节传送方式各有什么特点?它们的适用范围各是什么?成组传送方式下,DMA控制器获得总线控制权后,可以连续进入多个DMA周期,进行多个字节的传输这种方式可以获得最高的数据传输速度在数据传输期间,CPU不能访问总线如果一次传输的数据较多,这种方式会对系统工作产生一定的影响成组传送方式适用于外部设备要求很高的传输速率,系统其他负担较轻,连续占用总线不会产生严重后果的情形在单字节传输方式下,8237A完成1个字节传输后都释放系统总线,一次DMA传输结束,CPU可以在每个DMA周期结束后控制总线这种方式适用于外部设备的传输速率要求不太高,或者系统不允许有较长时间停顿的情况
5.怎样用指令启动一次DMA传输?怎样用指令允许/关闭一个通道的DMA传输?用指令将DMA请求寄存器中相关位置位,可以启动一次DMA传输用指令将DMA屏蔽寄存器中相关位复位,可以允许一个通道的DMA传输将DMA屏蔽寄存器中相关位置位,可以关闭一个通道的DMA传输
6.DMA控制器8237A能不能用中断方式工作?请说明DMA控制器8237A可以用中断方式工作将8237A的信号反相后连接到中断控制器的中断请求输入端,则一次数据块传输结束后,可以向CPU申请中断,由专门的中断服务程序进行结束处理
7.如何判断某通道的DMA传输是否结束?有几种方法可供使用?判断某通道的DMA传输是否结束有二种方法其一是读出DMA控制器的状态寄存器内容,测试其中代表该通道的状态位,可以得知该通道的DMA传输是否结束其二是读出该通道的字节计数器内容,如果值为0(对8237A而言为-1),表示该通道的DMA传输已经结束此外,可以用8237A的信号向CPU申请中断一旦进入这个中断服务程序,表明该通道的DMA传输已经结束
8.叙述一次DMA控制器8237A编程使用的主要步骤DMA控制器8237A初始化编程的主要步骤为发复位命令;写命令字,设置8237A的工作方式;写方式字,设置需使用的通道的工作方式;清除先/后触发器;写入内存储器起始地址;写入传送的字节数-1;清除该通道的屏蔽位;启动外部设备,如果是内存到输出设备,用指令设置第一次DMA请求
9.使用DMA控制器8237A传输一个字节需要多少时间?受那些因素影响?请作具体分析使用DMA控制器8237A传输1字节数据需要4个DMA控制器使用的时钟周期,对于速度稍慢的外设/存储器,也可以插入一个或多个等待周期影响DMA周期时间长短的因素有DMA控制器使用的时钟频率频率越高,DMA周期越短;存储器和外部设备的工作速度如果速度跟不上DMA时钟的要求,则需要插入等待周期,从而延长整个DMA周期;使用压缩时序可以缩短DMA周期;如果存储器数据块首地址低8位为“0”,前256个字节内存地址的高8位相同,它们传送时只需要发送一次高8位地址,后面255个数据的DMA周期达到最小;如果进行存储器之间数据传输,每个字节的传输需要二个DMA周期习题九1.A/D和D/A转换在微机应用中分别起什么作用?计算机加工、处理的信号可以分为数字量(Digit)和模拟量(Analog)两种类型现代计算机内部都采用二进制表示的数字量进行信号的输入、存储、传输、加工与输出为了使用计算机对模拟量进行采集、加工和输出,需要把模拟量转换成便于数字计算机存储和加工的数字量(A/D转换),或者把数字量转换成模拟量(D/A转换)因此,D/A与A/D转换是计算机用于多媒体、工业控制等领域的一项重要技术2.怎样将D/A转换器连接到微型计算机?D/A转换器将数字量转换成模拟量输出为了保存由计算机送来的数字信号,通常需要配置一个“数据寄存器”,向D/A转换器提供稳定的数字信号D/A转换芯片输出的模拟信号功率一般比较小,为了能够驱动执行机构工作,D/A转换器的输出一般都要连接到运算放大器进行功率放大3.修改图9-5,将DAC0832的两级锁存合为一级使用,画出连接图,并编写输出三角波和锯齿波的程序为了将DAC0832的二级缓冲锁存器合为一级使用,可以将它的第二级置为“直通”,也就是把和接地,用第一级的和对输入进行控制,如下图输出三角波的程序段如下S0MOVAL,0;AL中置初值0,输出三角波的上升段S1CALLOUTPUT;调用输出子程序,输出一个值INCAL;产生上升段下一个值JNZS1;上升段未结束,继续输出DECAL;恢复到最大值S2CALLOUTPUT;输出三角波的下降段DECAL;产生下降段下一个值JNZS2;下降段未结束,继续输出JMPS1;下降段结束,输出下一个三角波输出锯齿波的程序段如下MOVAL0J1CALLOUTPUT;输出当前值INCAL;产生下一个输出值JMPJ1子程序“OUTPUT”为上面两段程序共用OUTPUTPROCNEARMOVDXPORT0;DAC0832端口地址OUTDXALPUSHAXMOVAXN;延时的时间常数WT:DECAXJNZWT;延时POPAXRETOUTPUTENDP4.一个8位D/A转换器的满量程(对应于数字量255)为10V分别确定模拟量
2.0V和
8.0V所对应的数字量模拟量
2.0V所对应的数字量为(
2.0/10)×255=51模拟量
8.0V所对应的数字量为(
8.0/10)×255=2045.简述逐次逼近式A/D转换器的工作原理,并将它和∑-△A/D转换器进行比较逐次逼近型(也称逐位比较式)A/D转换器主要由逐次逼近比较寄存器SAR,D/A转换器、比较器以及时序和控制逻辑等部分组成它从SAR的最高位开始,逐位设定SAR寄存器中的数字量,经D/A转换得到电压VC,与待转换模拟电压Vx进行比较通过比较,逐次确定各位的数码应是“1”还是“0”转换结果能否准确逼近模拟信号,主要取决于SAR和D/A的位数位数越多,越能准确逼近模拟量∑-△型模数转换器是根据二次采样的差进行计算的有很强的抗干扰能力,转换精度高,以串行方式输出数据常用于高分辨率(常见为
16、
18、24位)的中、低频信号测量当模拟量输入端接有多路开关时,通道切换后要等待足够长的时间,才能读取转换结果6.若ADC输入模拟电压信号的最高频率为100KHZ,采样频率的下限是多少?完成一次A/D转换时间的上限是多少?香农定理告诉我们采样频率一般要高于或至少等于输入信号最高频率的2倍因此,采样频率的下限应是200KHz在200KHz采样频率下,完成一次A/D转换时间的上限是5μs实际应用中,采样频率可以达到信号最高频率的4~8倍如果采用400KHz的采样频率,完成一次A/D转换时间的上限是
2.5μs7.在使用A/D和D/A转换器的系统中,地线连接时应注意什么?模拟信号很容易受到电源和数字信号的干扰引起波动为提高输出的稳定性,减少误差,模拟信号部分必须采用高精度基准电源VREF和独立的地线所以,要把数字地和模拟地分开模拟地是模拟信号及基准电源的参考地,其余信号的参考地,包括工作电源地,数据、地址、控制等对应的“地”都是数字地连接时,先所有的模拟地连接在一起,把所有的数字地连接在一起,然后在一个点上(注意不是两个或更多)把模拟地和数字地连接起来8.怎样用一个AD芯片测量多路信息?模拟量多于一个时,可以使用多路模拟开关,轮流接通其中的一路进行转换,使多个模拟信号共用一个ADC进行A/D转换9.一台工控PC有两块818卡,基地址分别为BASE1BASE2,试编制采样24路(一块卡16路,一块卡8路)模拟量的C语言程序#include“dos.h”#defineN24/*采样点数*/#defineBASE10x300#defineBASE20x310#defineINTERRUPT0x1c/*定时中断类型号*/staticunsignedadtad[N]tt[N]
[16];voidfarhandler;/*函数handler声明*/voidAD818int;/*函数AD818声明*/voidinterruptfar*oldhandler;/*定义oldhandler为指向中断服务程序的指针*/…………..main{oldhander=getvectINTERRUPT;/*读出原1CH中断向量*/setvectINTERRUPThandler;/*把新的1CH中断向量写入向量表*/…………..}voidAD818intscan/*函数AD818从AD818卡采集一次数据*/{intlbithbitit=0statusbasech;/*采集结果置入全局变量ad中*/base=scan=15BASE1:BASE2;/*根据点号确定所在采集卡的基地址*/ch=scan%16;/*计算该点在本采集卡上的通道号*/outportbbase+2ch;/*向AD818输出通道号*/outportbbase+10;/*AD输入量程控制*/outportbbase+90;/*不使用中断或DMA*/outportbbase+00;/*启动AD转换*/do{it=it+1;status=inportbbase+8128;/*读出AD状态寄存器,查询EOC,等待AD转换完成*/}whilestatus!=0it=10000;lbit=inportbbase+0240;/*读入低8位,清除其中无效的最低4位*/hbit=inportbbase+1;/*读入高8位*/ifit=10000ad=hbit*16+lbit/16;/*采集正常,拼接二段数据*/elsead=0;/*采集数据超时,818卡有故障*/}voidinterruptfarhandler/*55ms定时中断服务程序,采集每个点的数据*/{intispsi;forisp=0;isp=N-1;isp++{AD818isp;/*采集一个模拟量,存入ad*/fori=0s=0;i=14;i++{tt[isp][i]=tt[isp][i+1];/*移动队列中的数据,以便装入新的数据*/s=s+tt[isp][i];}/*求前15个数据的累加和*/tt[isp]
[15]=ad;s=s+ad;/*新数据进队列,求出16个数据的累加和*/tad[isp]=s/16;/*求出16个数据的平均值*/}oldhandler;/*进入原1CH中断服务程序,此后返回断点*/}习题十
1.查找相关资料,用列表方式给出8088,8086,……直到P4各代微处理器的地址、数据线引脚数量,并推算出各自的内存寻址空间处理器数据线地址线内存寻址空间80888201MB808616201MB80286162416MB80386/48632324GBPentium64324GBPentium2~4643664GB
2.什么是MMX指令?它有什么特点?MMX指令是“多媒体扩展指令”的英文简称,它采用SIMD(单指令流多数据流)技术,使得处理器在一条指令中对多个数据进行处理,提高了对多媒体数据的处理能力
3.什么叫动态执行?使用动态执行技术会带来什么好处?动态执行是通过预测指令流和数据流,调整指令的执行顺序,最大地发挥CPU内部各部件的功效,提高系统执行指令的速度动态执行主要采用了多路分支预测利用转移预测技术允许程序几个分支流同时在处理器内执行;数据流分析通过分析指令数据的相关性,把指令进行优化排序后执行,充分利用处理器内部资源;推测执行根据各推测最终的正确性,对多个分支的运行结果进行取舍
4.32位微处理器有哪几种工作方式?各有什么特点?32位微处理器有4种不同的工作方式实地址方式、保护方式、虚拟8086方式、系统管理方式实地址方式实地址方式使用16位80x86处理器的寻址方式(使用20位地址寻址1MB空间)、存储器管理和中断管理可以使用32位寄存器,使用特权级0,可以执行大多数指令保护方式保护方式是32位微处理器的基本工作方式它使用32位地址寻址4GB的实存空间,通过虚拟存储管理、用户优先级管理、I/O管理等技术,扩大可使用的存储空间,对操作系统和用户程序进行隔离和保护虚拟8086方式虚拟8086方式是保护模式下为任务提供的的8086工作环境每个任务使用16位地址寻址1MB的内存空间,以最低特权级运行,不能使用特权指令系统管理方式系统管理模式主要用于电源管理,可以使处理器和外围设备部件进入“休眠”状态,在有键盘按下或鼠标移动时“唤醒”系统,使之继续工作利用SMM可以实现软件关机
5.叙述XT总线与ISA总线的异同之处XT总线可以看作是ISA总线的一个“子集”,它包括8位数据线,20根地址线,使用与CPU相同的
4.77MHz的时钟信号ISA总线在XT总线的基础上,把数据线扩展到16根,地址线扩展到24根,使用独立于CPU的8MHz时钟信号,中断和DMA通道数目都有所增加ISA总线插槽由8位的XT总线插槽和ISA总线扩展插槽两部分组成
6.什么叫分级总线?使用分级总线有什么优点?所谓分级总线是指系统中存在多组总线,每组总线可以有不同的数据线宽度、数据传输速率和不同的信号传输协议系统内的设备按照它们对传输速率、数据吞吐量的不同要求合理地连接在不同的总线上不同总线之间通过“桥”电路进行连接使用分级总线可以使各种设备的数据传输要求得到最大程度的满足,同时使整个系统的数据吞吐量和效能达到最大化
7.简述“两个中心”结构与“南北桥”结构的区别,同时说明“两个中心”结构的优越之处“南北桥”结构和“中心结构”都支持多级总线的系统结构它们的主要区别在于,南桥芯片连接的所有高速外设都要通过PCI总线与处理器相连接,而“中心结构”里所有连接IO设备的总线(PCIISAUSB……)都通过IO控制中心(ICH)与中心高速接口直接连接,从而缓解了PCI总线数据交换的拥挤程度相比较而言,“中心结构”对信息流的路径分配更为合理
8.CPU←→Cache,Cache←→主存,主存←→辅存之间的数据传输各有什么特点?为什么?请分析原因CPU与Cache之间数据传输的主要特点是高速Cache以与CPU相同或接近的速度工作;不确定CPU对Cache的访问可能因“命中”而成功,也可能以“失靶”而失败Cache与主存之间数据传输的主要特征是数据传输以“页”为单位,使用“成组传输方式(突发总线方式)”进行导致上述特点的原因是,这一层次以“高速”为追求的目标,利用了程序、数据的“局部性”原理主存与辅存之间的数据传输以“数据块/扇区”为单位,通常以DMA方式进行导致上述特点的原因是,这一层次以“大容量”、“低价格”为追求的目标,辅存大容量、“粗粒度”的结构特点正好能够满足对上述目标的要求系统对不同层次的数据传输有着不同的要求,因而设置了不同的软硬件结构,最终导致了传输方式上的差异
9.什么叫“相联存储映像表”?说明它的结构和用途相联存储映像表是Cache内纪录Cache中各页在主存的位置和其他信息的表格,由各页的“标记(Tag)”,“状态”和“LRU位”组成“标记(Tag)”记录了该页在主存中的位置,供CPU访问时进行匹配查找使用“状态”和“LRU位”用于Cache页的替换操作
10.为什么要进行Cache和主存的“映像”?有哪几种相联映像的方法?比较各自的利弊Cache和主存的“映像”是主存页调入Cache的“规则”,为了提高CPU在Cache中查找信息的速度,这种“规则”是必须的常见相联映像的方法有三种全相联映像法内存页可以调入Cache的任何一页,规则简单,页冲突的可能性最小,查找所需工作量最大直接映像法每一个内存页只能调入Cache中相同页号的一个页,规则简单,查找方便,块冲突的可能性大组相联映像法每一个内存页可以与Cache中一个组内的若干个页面相对应,规则稍复杂,查找工作量中等,块冲突的可能性中等
11.什么叫“突发总线周期”?它有什么优点?“突发总线周期”也称为“成组传送方式”,总线主设备在发送一个主存地址之后,通过连续的多个周期,传输(读/写)多个地址相连的存储单元的数据这种方式省去了多次发送地址、多次申请总线和多次相互联络的过程,因此可以获得很高的数据传输速率
12.逻辑地址是怎样转换成线性地址的?简要叙述转换过程实地址方式下没有“线性地址”保护模式下,逻辑地址由“段号”和“段内地址”两部分组成使用“段号”查找“段描述符表”,可以获得该段的起始地址,与“段内地址”相加,就得到了对应的“线性地址”
13.线性地址是怎样转换成物理地址的?简要叙述转换过程“线性地址”由处于高位的“页组号”、处于中间的“页号”和处于低位的“页内地址”三部分组成用“页组号”查找“页组表”,得到“页表”的起始地址;用“页号”查找该“页表”,得到该页的起始地址;页起始地址加上“页内地址”就得到了它对应的物理地址
14.请分析使用虚拟存储管理带来的利弊虚拟存储管理把辅存的一部分用作“虚拟”的主存,扩大了操作系统可分配,程序员可利用的存储空间,便于实现任务之间的隔离和保护,有效地支持了“多任务”运行环境的实现它还可以有效地克服“内存碎片”问题,简化了存储管理但是,实现虚拟存储后,每次访问主存都需要进行两次地址的转换,增加了系统的复杂性,增加了系统的硬件成本,降低了访问主存的速度,而且,由于系统复杂程度的增加,系统的可靠性也会受到影响
15.32位微处理器实施保护机制的目的是什么?有哪些主要措施?32位微处理器实施保护机制的根本目的在于增加在“多任务”运行环境下系统的可靠性,使得任务之间、任务和操作系统之间实现隔离和保护为了实现隔离和保护,采取了以下几项措施为任务和资源设定一个“优先级”,优先级较低的任务不能访问优先级较高的资源,不能调用优先级较高的程序模块使用虚拟内存管理机制,使得任务和任务、任务和操作系统所使用的存储空间相互隔离,从而保证每个任务的正常运行不受其它任务的影响,一个任务的故障不影响整个系统的正常运行
16.说明操作系统在保护模式下启动一个任务的过程一个任务用JMP或CALL指令启动一个新的任务时,处理器将当前任务的所有通用寄存器、所有段寄存器中的选择子、EFLAGS、EIP存入该任务自身的TSS,然后将新任务的选择子、描述符装入TR寄存器,并且将对应TSS段中所保存的通用寄存器、段寄存器、EFLAGS、EIP副本装入处理器对应的寄存器中在CS:EIP的控制下,一个新的任务开始执行用JMP、CALL指令调用同一个任务中其他程序段时,指令中的“段选择子”及其描述符被存入CS寄存器,“偏移地址”进入EIP,于是,目标程序被执行对于CALL指令,原来程序的返回信息“CS:EIP”被压入堆栈,和16位微处理器中十分相似中断和异常也会导致任务的转换
17.32位微处理器如何实施对I/O过程的管理?保护方式下对I/O过程的管理主要有两项措施任务状态段TSS中有一个最多64Kbits组成的“I/O允许位图(IOM)”,它的每一位对应一个I/O端口,为0表示该端口允许这个用户进行I/O操作处理器首先检查存放在CS中的当前任务的CPL(当前任务优先级),如果CPL的特权级高于或等于EFLAGS中由IOPL规定的特权级,I/O操作不会受限制,否则将进一步检查IOM,对IOM为1的端口进行操作将产生保护异常;对于运行在虚拟8086方式的任务,用IOM来控制对I/O端口进行访问,对位图对应位为1的端口进行访问将产生保护异常另一种办法是在IOM中封锁对所有端口的访问,当前任务一旦执行I/O指令,立即产生保护异常,进入由操作系统设置的“异常处理程序”,在操作系统的控制下进行间接的“I/O操作”
18.简要叙述保护方式与实地址方式下的中断管理方法的区别在实地址方式下,32位80X86微处理器采用与16位80X86相同的中断管理机制,用1KB大小的“中断向量表”存储各中断服务程序入口地址,这些“中断向量”按照“中断类型”的顺序存放中断向量表存放在地址00000000开始的主存中保护方式下用“中断描述符表”来指出各中断处理程序的入口地址,每一个中断类型对应一个“中断门”或“陷阱门”描述符中断描述符表可以放在内存的任何位置,表的首地址存放在IDTR寄存器中保护模式下中断响应的过程与实地址方式基本相同,但是可以用中断机制进行任务的切换
19.什么叫“串行中断”?它有什么优点?串行中断用一根SERIRQ来传递中断请求信号SERIRQ信号线上的信息组织成“包”,用PCI的时钟信号对“包”内的信号进行同步所有支持串行中断的设备都可以用一个三态门连接到这根线上发送各自的中断请求信号使用串行中断减少了中断请求的引脚数,可以不受中断请求引脚的限制灵活地扩充中断请求数目
20.什么叫“APIC”中断?它有什么用途?APIC是“高级可编程中断控制子系统”的缩写,用于解决多处理器环境下处理器之间的联络、任务分配和中断处理习题十一
1.按功能分,计算机外围设备可分成哪几类?答计算机外部设备按照它们的功能,一般可分为三类供用户进行输入/输出的设备,如键盘、鼠标、显示器等,它们也称为“人机交互设备”;外存储设备,软盘、硬盘、光盘驱动器是典型的外存储设备;专用的其它设备,如数据采集设备、视频采集设备等
2.何谓编码键盘和非编码键盘?答非编码键盘由CPU对键盘各行、各列的状态进行扫描,根据扫描结果,用某种算法计算或查表得到按键的编码CPU效率低,主要用于小型应用系统编码键盘由专用控制器/控制电路对键盘进行扫描,产生按键所对应的编码供CPU读取这种键盘结构稍复杂,但使用方便
3.请说明101键盘接口电路的基本组成原理答参考教材相关内容(图11-1),101键盘接口电路由8048专用单片处理芯片,键盘开关矩阵电路,双向缓冲门电路组成有规律的内部计数信号通过数据线DB0~DB6,送到键盘矩阵的行列译码器,实现对键盘开关矩阵的行列扫描有键按下时,通过KEYDEP信号通知单片机8048扫描程序根据当前计数值,分析确定按键的行、列位置,形成键盘扫描码
4.鼠标常用接口有哪几种类型?简述光机鼠标的工作原理答目前PC上常用的鼠标接口有3种,第一种是最常用的直径8mm的6芯PS/2鼠标接口,第二种是9芯D型插座(使用RS-232串行接口),另外是较新型的USB鼠标接口光机鼠标的工作原理鼠标内置了2个滚轴,X方向滚轴和Y方向滚轴这2个滚轴都与一个可以滚动的橡胶球接触,并随着橡胶球滚动一起转动X,Y滚轴上装有带孔的译码轮,它的转动会阻断或导通LED发出的光线,在光敏晶体管上产生表示位移的脉冲通过脉冲编码确定光标移动的方向和距离
5.论述打印机接口的主要通信连接信号答打印机接口的主要控制信号(输出)有数据选通,低电平有效数据在它的配合下送入打印机AUTO_FD自动换行,高电平有效有效时打印机每次回车后自动换行初始化信号,低电平有效有效时,打印机被复位SEL联机控制位,高电平有效有效时打印机才能与接口连通主要状态信号(输入)有BUSY忙信号,高电平表示打印机忙有四种情况正在输入数据、正在打印操作、在脱机状态、打印机出错确认,低电平有效有效时表示打印机已经接收完毕接口送来的一个数据PE纸尽信号,高电平有效有效时表示打印机缺纸SLCTIN选择信号,高电平有效有效时表示打印机处于联机状态出错信号,低电平有效有效时表示打印机出错
6.分别叙述IDE和EIDE磁盘接口的技术特性答IDE磁盘接口的技术特性IDE接口在ST506的基础上进行改进而成,它把控制器集成到驱动器内消除驱动器和控制器之间的数据丢失问题,提高数据传输的可靠性从驱动器中引出的信号线已不是控制器和驱动器之间的接口信号线,而是通过简单处理后可与主系统连接的信号线IDE采用了40线单组电缆连接,除了对系统总线上的信号做必要的处理之外,其余信号基本上是原封不动地送往硬盘驱动器,IDE实际上已经是系统级的接口EIDE磁盘接口的技术特性与IDE相比,EDIE有以下几个方面的特点支持大容量的硬盘(540MB);EIDE允许连接更多的设备通常提供两个插座,称为主插座和辅插座,每个插座可连接主、从两个设备,一共可连接4个设备;EIDE具有更高的数据传输速率标准EIDE驱动器的最大突发数据传输率可达16MB/S而原有的IDE驱动器的最大突发数据传输率仅为3MB/S;EIDE支持三种硬盘工作模式普通模式(Normal)、逻辑块寻址模式(LBA)、大硬盘模式(LAG)
7.硬盘的主要技术指标包括哪些?答硬盘的主要技术指标包括硬盘容量硬盘能够储存的信息的总量传输速率单位时间内传输的信息数量影响传输速率的因素有电机转速、存储密度、Cache容量、接口方式等平均寻道时间磁头寻找目标磁道的时间,影响磁盘的工作速度转速IDE接口硬盘工作时主轴和碟片转速多为5400rpm和7200rpm两种转速越高,硬盘的传输速率越高;除了上面主要的指标之外,下面几项指标也影响硬盘的性能单碟容量硬盘一般由四到五张碟片组成单张碟片的容量越大,硬盘的总容量随之增大,数据读写速度也越快;Cache硬盘中Cache的容量越大,硬盘的实际传输率就越大硬盘采用的Cache现多为512KB和2MB两种磁头类型目前有两种类型的磁头磁阻磁头MR(MagnetoResistiveheads)和巨磁组磁头GMR(GiantMagnetoResistiveheads)MR和GMR磁头通过磁阻的变化去感应信号的幅度,具有高灵敏度,高可靠性的优点;
8.简述显示器技术性能指标和显卡的种类答显示器有以下主要技术性能指标尺寸通常指的是显像管的对角尺寸(英寸),实际显示面积小于标称尺寸;点距相同颜色两个相邻的磷光体间的距离点距越小,显示出来的图像越细腻,目前大多数显示器的点距是
0.28mmn和
0.25mm刷新频率是显示器每秒屏幕刷新的次数,刷新频率越高,图像显示就越稳定在不同的分辨率下,对应的刷新频率可能有所不同带宽带宽是显示器每秒扫描像素的点数,常见的是几十兆,高性能显示器的带宽在100M以上分辨率指水平方向和垂直方向上最大像素个数.用水平方向像素数×垂直方向像素数来表示显像管的形状主要有球面、平面直角和纯平几种,以平面直角和纯平最为常见;扫描方式有逐行扫描和隔行扫描两种,目前都为逐行扫描方式;显卡的种类MDA单色显示卡它只有字符方式,无图形输出能力;CGA彩色图形显示卡它支持字符、图形两种方式但分辨率不高,颜色种类较少;EGA增强型图形显示卡其字符、图形功能比CGA卡有较大提高,显示分辨率也较高;VGA视频图形阵列显示卡标准分辨率为640×480,16种颜色VGA卡兼容了上述各种显示卡的显示模式,支持更高的分辨率和更多的颜色种类SVGA(超级VGA)显示卡SVGA是一种比VGA更强的显示标准SVGA的标准模式是800×600,新型显示器分辨率可达1280×
1024、1600×1200等
9.试计算1024×768分辨率、24位彩色所需的显存为多少?答所需的显存大小为24/8×1024×768=2359296Byte=
2.25MB
10.何谓AGP显示总线接口?AGP4X的数据传输速率是多少?答AGP显示总线接口(加速图形接口)是新一代局部图形总线技术,为任务繁重的图形加速卡提供了一条专用高速通道采用与外频相同的时钟频率进行数据传输时,AGP总线的数据传输速率为266MB/S,是PCI总线数据传输率的两倍借助如此高的传输率,我们可以使一些原本只能在显存中进行的函数运算扩展到主存中AGP有两种模式DMA模式和Execute模式DMA模式适用于从系统内存到图形内存之间的大批量数据传输系统内存中的数据不能被图形加速器直接调用,只有调入图形内存才能被图形加速芯片所寻址在Execute模式中,加速芯片将图形内存与系统内存看作一体,通过一种叫做图形地址再映象的机制,使加速芯片可直接对系统内存寻址,减轻局部图形内存的压力AGP4X的数据传输速率是1064MB/S(=266MB/S×4)
11.简述声卡的工作原理,声音的采集和还原采用了什么技术?衡量音质好坏的技术指标有哪些?答声卡主要由总线接口控制芯片、混音控制芯片、数字信号处理器(DSP)、A/D及D/A转换器、高级信号接口等组成输入到声卡的声音信号首先由模数转换器ADC把模拟信号转换成数字信号,这个过程称为“采样”然后,DSP(数字信号处理器)将来自ADC的信号加以处理,对输入的数字声音用PCM、DPCM或ADPCM方式进行编码和压缩,并形成WAV格式文件送入计算机磁盘存储对计算机内以文件形式存放的声音输出(回放)时,磁盘中的WAV文件首先送入DSP芯片,经解码后变成数字声音信号送至D/A转换部分数模转换器DAC把数字信号还原为模拟信号,驱动扬声器单元发声音乐合成器用来播放MIDI音乐文件播放时,MIDI信息从文件中读出,经MIDI接口送至合成器合成器将这些信息转换成乐器的音阶、音色、持续时间等,经处理后变成声音信号输出技术指标有采样频率它决定了声音采集的精度,足够的采样频率能保证不丢失有效信号采样频率越高,采集得到的信号越能精确地保存原信号的特征;采样的量化值它决定了每个采样点的采样精度,量化值越大,所记录声音的变化程度就越细腻常用的几种采样频率与量化值的组合11KHz/8bitMono电话音质;22KHz/8bitStereo调幅广播水平;22KHz/16bitStereo音乐磁带的音质水平;44KHz/16bitStereo音乐CD或调频广播音质水平
12.IEEE1394串行总线的通信方式有哪两种?为什么说1394接口比较适合数字视频的传输?答IEEE1394总线上的通讯有异步和同步两种模式对于异步传输,数据发送方和接收方互换地址,然后进行数据传输接收方收到数据包后,向发送方传回确认信息接收方没有收到数据包,则启动错误修复机制对于同步传输,发送方首先要获得一个特定带宽的数据通道,然后将标志接收方的通道标识(ID)附加在所要传输的数据中一起发送接收方对数据流进行检测,对具有特定ID信号的数据时进行接收同步数据传输模式的优先级高于异步传输模式由于1394的同步传输方式传输速率高,优先级高,使用CPU资源少,所以特别适合于传输数字视频
13.USB通用串行总线和IEEE串行1394总线有哪些不同?答它们的主要区别是
(1)USB要求CPU来控制数据的传输,有一定的CPU占用率,IEEE1394不需要CPU控制,CPU的占用率极低
(2)USB只支持异步传输,IEEE1394不仅支持异步数据传输也支持同步数据传输
(3)USB需要使用集线器连接各设备IEEE1394不需要集线器(HUB)就可连接63台设备
(4)另外,IEEE1394的数据传输速率总体上高于USB习题十二
1.总线的指标有哪几项?总线标准和总线产品哪一个先产生1总线宽度:总线宽度是可以同时传输的数据位数,位数越多,一次传输的信息就越多2总线频率:总线通常都有一个基本时钟,总线上其它信号都以这个时钟为基准,这个时钟的频率也就是总线工作的最高频率总线频率越高,单位时间内传输的数据量就越大3单个数据传输周期数:传输方式的不同,使得每个数据传输所用的时钟周期数不同单个数据传输周期数越少,传输率越高此外,总线的仲裁方式,容错性能,是否支持突发成组传输,也反映了总线的性能总线标准的产生有多种形式有的总线产品推出后得到广泛的认同,随后成为事实上的工业标准,这个产品所采用的技术规范最终成为标准,标准产生在产品之后有的技术问题得到较多的关注,由标准化组织或者相关集团发起,制定了相应的标准这时,产品的出现晚于标准的制定
2.ISA卡设计时如何解决资源冲突问题?ISA的I/O空间仅有100H~3FFH的768个地址可供使用,其中不少端口已分配给“常规”的设备使用,新设计I/O扩充卡的端口地址不能与它们冲突另外,扩充卡之间使用的地址也不能发生冲突为解决这个矛盾,ISA卡上一般都设有一组开关(switch),用户可以通过设定这组开关来设置这块ISA所占用的I/O起始地址,使它位于所使用计算机I/O的空闲位置,从而避免发生冲突
3.ISA总线需要进行总线仲裁吗?为什么?ISA总线是一个简单的多主控总线,需要使用总线的“主设备”是CPU和最多7个使用DMA传送的设备当CPU以外的一个或多个设备需要使用总线时,需要进行“总线仲裁”对于使用DMA请求使用总线的设备来说,“仲裁”要分两次进行1DMA请求信号送到8237,由8237进行第一次“仲裁”;28237的请求信号发送到CPU,在一个总线周期结束时释放总线
4.若有两块818ISA卡BASE1=0x0250BASE2=0x0330switch分别应如何设置?BASE1=0x250swith146=offswith235=onBASE2=0x320swith125=offswith346=on
5.PCI总线怎样的信号组合启动一个总线的访问周期,又怎样结束一个访问周期?它的AD0~AD31同CPU的同名引脚有何不同?主设备获得总线使用权后,将FRAME#置为有效,在AD0~31上发出地址信号,C/BE#上发出总线命令,一次总线访问周期开始主设备在发出最后一组数据读写的启动信号之后,将FRAME#信号置为无效,表示数据传输即将结束在最后一项数据传输后,主设备撤销IRDY信号,从设备撤销TRDY#和DEVSEL#信号,一次PCI总线传输结束PCI总线信号独立于CPU,使用独立于CPU的时钟信号对于PCI总线来说,CPU是它所连接的众多设备中的一个PCI总线的AD0~31是地址和数据分时复用信号,它们与CPU同名引脚传输的信号类型相同,但是并不等同CPU对PCI总线上设备进行访问时,CPU发出的地址经Host/PCI桥缓冲,按照PCI的时序定时后由桥电路向PCI总线“转发”DMA传输时,PCI总线上的AD0~31来自DMA控制器而不是来自CPU
6.一块PCI卡上最多可以实现多少路中断信号?由于PCI总线上只有4条中断请求线,因而一块PCI卡最多可以实现4路中断请求说明1对于单项功能的PCI卡,只能使用INTA#请求中断;对于对功能PCI卡,可以使用其它的三根中断请求引脚2PCI总线允许“共享”中断请求信号线,这是与以前有较大区别的例如,有两块PCI卡插在PCI总线上,按照规定,他们都使用同一个INTA#申请中断在“中断描述符表”上,中断服务的入口可能是设备甲,或者是设备乙,现假设为设备甲如果设备乙申请中断,那么,首先会进入设备甲的中断服务程序该程序通过查询状态,发现自己并没有申请中断,于是发出相应信息后返回此后,由操作系统调度进入设备乙的中断服务程序(参见习题11第8题答案)3PCI总线上的中断请求进入ICH芯片后,与“SIO”芯片送来的“串行中断”(由传统设备键盘、鼠标、串口、并口、软驱发出,通过L/F总线传送到ICH芯片)一起,被送往ICH芯片内的“中断申请信号路由器”可以通过程序来设置每一个中断请求使用的实际的中断请求引脚(除少数已集成在CPU内,中断类型固定的申请以外),最终由“路由器”产生12个中断申请信号,送到芯片内两个级联的8259中断控制逻辑主片8259产生的中断请求最终由ICH的INTR引脚送往CPU
7.在PCI卡配置空间中,基地址寄存器的作用是什么?一个PCI设备最少可申请多少地址空间?最少可申请多少I/O空间PCI总线上的设备采用“即插即用”的方法,所有设备使用的存储空间和IO空间的具体位置事先是不确定的,需要在系统初始化时通过“配置”过程来确定PCI卡上的基地址寄存器有两个方面的作用
(1)寄存器的最低的几位记录申请所需空间的类型(存储器空间/IO空间)、空间的大小等信息(寄存器的这几位是只读的)
(2)寄存器的高位用来纪录操作系统分配给它的存储空间/IO空间的起始地址(寄存器的这几位是部分可写的)由于有6个基地址寄存器,PCI设备最多可以申请6段地址空间对于申请存储空间的基地址寄存器,它的第0~3位是只读位,第4~31位用来表示申请地址空间的大小,因而一个PCI设备申请地址空间最少是16个byte对于申请I/O空间的基地址寄存器,它的第0~1位是只读位,第2~31位用来表示申请地址空间的大小,因而申请I/O地址空间最少是4个byte例如,某PCI设备申请1MB的存储空间,它的基地址寄存器位0~位19均为只读其中位0固定为0,表示申请存储器空间;位1~2表示“映射”的类型,如果基地址寄存器为32位,可以“映射”到32位地址空间的任何位置,这两位可以固定为“00”;其余位均固定为0系统进行配置操作时,向该寄存器写入32位全“1”,然后读出该寄存器的内容由于低20位均为只读位,所以实际读出的内容为高位12个“1”和低位20个“0”其中位0~位2表示空间类型和“映射”类型,其它的“0”(位4~位19)表示了申请空间的大小随后,系统根据各设备的请求进行空间的统一分配,将分配给该设备的存储空间首地址写入该基地址寄存器对于1MB的空间而言,它首地址的低20位应为0,它的高12位反映了实际的起始地址基地址寄存器的高12位正好能容纳这12位“有效”的起始地址
8.USB主机怎样了解USB设备的接入?集线器的D+和D-线上各有一个15KΩ的下拉电阻,没有USB设备连上时,D+和D-线都为低电平全速和高速设备在D+线上有一个
1.5kΩ的上拉电阻,而低速设备在D-线上有一个
1.5kΩ的上拉电阻当集线器有USB设备连接上时,D+和D-线中会有一根变成高电平集线器通过监视D+和D-线来判断有哪一种速度的设备连上了USB总线集线器发现D+线变成高电平时,再次向设备发出询问,高速设备会响应这个询问,而全速设备则不会响应这样集线器就知道所连接上的USB设备的速度反过来,对高速USB设备来讲,如果发现集线器的这个询问,就知道它所连接的集线器是支持高速的,否则集线器是不支持高速的到此,集线器和设备都知道了对方的速度,接下来的通讯以双方所共同支持的最高速度进行
9.一台微机有5台USB设备,另一台微机有10台USB设备,各需用四端口的集线器几个?画出它们的结构图5台USB设备,需用四端口的集线器1个(不包括根集线器)10台USB设备,需用四端口的集线器3个(不包括根集线器)它们的连接如右图所示
10.用8086汇编程序读出(注意是32位)PCI设备所分配到的存储器首地址MOVAH0B1H;MOVAL02H;MOVCX设备ID值;MOVDX厂商ID值;MOVSI0;索引号INT1AH;得到总线号(BH)、设备号(BL高5位)、功能号(BL低3位)JCERROR;错误时转ERRORPP:MOVAH0B1H;MOVAL09H;AL=09H读取基址寄存器内容QQ:MOVDI10H;第一个PCI基址寄存器地址INT1AH;ANDAHAH;AH=0表示读取成功JNZERRORTESTECX01;ECX末位=0,该寄存器存放存储空间首地址JZMMANDECX0FFFFFFFCH;ECX末位=1,该寄存器存放I/O空间首地址(高30位)STCJMPDONEMM:ANDECX0FFFFFFF0H;从基地址寄存器获取存储空间首地址(高28位)DONE:MOVEAXECX;说明
(1)读取PCI配置信息需要知道该PCI设备的设备ID值(置于CX中)和厂商ID值(置于DX中)然后用AH=0B1HAL=02H的INT1AH功能调用获得该PCI设备的总线号(BH)设备号(BL高5位)、功能号(BL低3位)
(2)一个PCI总线设备可以有6个基地址寄存器,本程序只读取了第一个基地址寄存器所存储的配置空间首地址读取其他配置空间首地址可以重复使用从“PP”标号开始的程序,同时修改标号为“QQ”的指令中的PCI基地址寄存器地址第二个基地址寄存器地址为14H,第3个为18H,……以此类推
(3)如果基地址寄存器存放的是存储空间基地址,它的末位为0,高28位添加4个0就是操作系统分配给该设备的存储空间首地址(不讨论64位基地址的情况)如果基地址寄存器存放的是I/O空间基地址,它的末位为1,高30位添加2个0就是操作系统分配给该设备的I/O空间首地址
(4)为了区分读出的是存储空间基地址还是I/O空间首地址,上述程序用CF加以区分CF=0读出的是存储空间基地址(在EAX中);CF=1读出的是I/O空间基地址(在EAX中)
11.两台PCI设备之间可直接传输数据吗?两台USB设备之间呢?两台PCI设备之间可直接传输数据由PCI主设备申请使用总线,获得总线使用权后用地址信号呼叫从设备,然后进行数据传输两台USB设备之间不可直接传输数据USB总线采用“主-从”方式进行通讯,每一次数据传输必须由USB主机发起这样,两台USB设备之间的数据传输必需通过USB主机间接进行
12.那些总线具有热插拔功能?对哪一类总线这个功能是必需具备的?USB总线和PCI总线都支持热插拔(HotPlugIn)对于USB总线来说,热插拔功能是必需的需要说明的是,目前一般PC机内的PCI总线设备不支持“热插拔”功能实现该功能需要相应的软、硬件的支持“热插拔”的PCI总线设备主要应用于某些通讯设备中
13.从硬件来讲,一个USB信息传输到微处理器需经过那几个环节?USB总线上的数据传输是一种“主-从式”的传输,所有的传输都由USB主机发起一个USB信息传输到CPU需经过集线器、根集线器和控制器这几个环节
14.为什么PCI/ISA扩展桥必须对总线上的地址进行负向译码?地址在哪个范围内?PCI总线设备在接收到落在自己地址范围内的地址信号时,发出DEVSEL#信号进行应答如果没有一个设备对主设备发出的地址作出响应,则由一个指定的设备对主设备的呼叫作出响应,这个设备称为负向译码设备ISA总线与PCI总线有着不同的信号传输协议,ISA总线设备没有对主设备进行应答的功能为了使PCI主设备与ISA总线从设备的数据传输能够正常进行,必须由PCI/ISA扩展桥充当ISA从设备的代理,进行负向译码,对PCI主设备的呼叫进行应答由于ISA总线上的I/O设备仅对低10位的地址线进行译码,并且前256个地址已经分配给系统板上的I/O接口芯片,所以ISA的I/O空间在0100H~03FFH(十六进制)的768个地址之内X=36H=00110110BY=78H=01111000B-Δ=10111110BCF=1SF=1OF=0PF=1ZF=0AF=1X=36H=00110110BY=78H=01111000B+Σ=10101110BCF=0SF=1OF=1PF=0ZF=0AF=0图2-28译码电路电路全地址译码连接图SP0200H4000H2200H1200HCALLFARPTRSUB3SP2200H1200HCALLSUB2SP1200HCALLSUB10200H4000H2200H1200HSP从SUB1返回主程序后0200H4000H2200HSP1200H从SUB2返回SUB1后0200H4000HSP2200H1200H从SUB3返回SUB2后。