还剩99页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第1章
1.1IA-32结构微处理器直至P4,有哪几种?[解]
80386、
80486、Pentium、PentiumPro、PentiumII、PentiumIII、Pentium
41.280386与8086在功能上有哪些主要区别?[解]从8086到80386,处理器的功能有了质的飞跃体现在∶
1.从16位寄存器发展为32位寄存器
2.地址寄存器也发展为32位可寻址的地址范围达到4G字节,有了巨大的扩展
3.增加了保护方式使处理器有了两种工作方式∶实地址方式和保护虚地址方式实地址方式用于与8086兼容;保护方式才是32位处理器能真正发挥其完整功能的工作方式
4.引入了多任务、任务切换的概念
5.引入了四级特权机制,引入了调用门、陷入门、中断门,使程序能在不同特权之间切换
6.引入了存储管理单元(MMU),使采用80386的操作系统能方便地实现请页(每页为4K字节)虚拟存储器管理
7.增加了新指令(主要是保护方式的指令)
1.3从功能上,80486与80386有哪些主要区别?[解]80486从功能上来说是80386+80387+片上缓存
1.4奔腾相对于80486在功能上有什么扩展?[解]奔腾增加了第二条流水线,实现每个时钟执行两条指令;片上的一级缓存容量加倍;寄存器仍是32位,但内部数据通路是128和256位以加速内部数据传送,且猝发的外部数据总线已经增加至64位;增加了高级的可编程中断控制器(AdvancedProgrammableInterruptControllerAPIC)以支持多奔腾处理器系统
1.5PII以上处理器基于什么结构?[解]PII是基于P6系列处理器又增加了MMX技术
1.6微处理器、微型计算机和微型计算机系统三者之间有什么不同[解]把CPU(运算器和控制器)用大规模集成电路技术做在一个芯片上,即为微处理器微处理器加上一定数量的存储器和外部设备(或外部设备的接口)构成了微型计算机微型计算机与管理、维护计算机硬件以及支持应用的软件相结合就形成了微型计算机系统
1.7CPU在内部结构上由哪几部分组成CPU应具备哪些主要功能[解]CPU主要由起运算器作用的算术逻辑单元、起控制器作用的指令寄存器、指令译码器、可编程逻辑阵列和标志寄存器等一些寄存器组成其主要功能是进行算术和逻辑运算以及控制计算机按程序的规定自动运行
1.8微型计算机采用总线结构有什么优点[解]采用总线结构,扩大了数据传送的灵活性、减少了连线而且总线可以标准化易于兼容和工业化生产
1.9数据总线和地址总线在结构上有什么不同之处如果一个系统的数据和地址合用一套总线或者合用部分总线,那么,要靠什么来区分地址和数据[解]数器总线是双向的(数据既可能读也可能写),而地址总线是单向的8086为了减少芯片的引脚数量,采用数据与地址线复用,既作数据总线也作为地址总线它们主要靠信号的时序来区分通常在读写数据时,总是先输出地址(指定要读/写数据的单元),过一段时间再读或写数据
1.10控制总线传输的信号大致有哪几种[解]主要是区分读/写存储器还是外部设备、读还是写以及外界输入的READY和INT等信号
1.11在以下六个题中所用的模型机的指令系统如表1所示表1模型机指令系统指令种类助记符机器码功能数据传送LDAnLDH,nLDA,HLDH,ALDA,nLDn,ALDA,HLDH,A3En26n7C673An32n7E77n→An→HH→AA→H以n为地址,把该单元的内容送A,即n→A把A的内容送至以n为地址的单元,A→n以H的内容为地址,把该单元的内容送A,H→A把A的内容送至以H的内容为地址的单元,A→H加法ADDA,nADDA,HADDA,HC6n8486A+n→AA+H→AA与以H为地址的单元的内容相加,A+H→A减法SUBnSUBHSUBHD6n9496A–n→AA–H→AA-H→A逻辑与ANDAANDHA7A4A∧A→AA∧H→A逻辑或ORAORHB7B4A∨A→AA∨H→A异或XORAXORHAFACA⊕A→AA⊕H→A增量INCAINCH3C24A+1→AH+1→H减量DECADECH3D25A-1→AH-1→H无条件转移JPnJPZnJPNZnJPC,nJPNC,nJPMnJPPnC3nCAnC2nDAnD2nFAnF2nn→PCZ=1,n→PCZ=0,n→PCCy=1n→PCCy=0n→PCS=1,n→PCS=0,n→PC停机指令HALT76停机在给定的模型机中,若有以下程序,分析在程序运行后累加器A中的值为多大若此程序放在以10H为起始地址的存储区内,画出此程序在内存中的存储图LDA20HADDA15HLDA30HADDA36HADDA1FHHALT[解]程序在存储器中存放示意图如图1-1所示地址内容指令10H3ELDA20H11H2012HC6ADDA15H13H1514H3ELDA30H15H3016HC6ADDA36H17H3618HC6ADDA1FH19H1F1AH76HALT图1-1题
1.11中程序在存储器中存放示意图这段程序运行完后累加器A中的值为A=30H+36H+1FH=85H
1.12要求同题
1.6,程序如下LDA,50HSUB30HLDA,10HADDA,36HSUB1FHHALT分析程序运行后累加器中的值是多少,并且画出该程序在内存中的存储图[解]程序在存储器中存放示意图如图1-2所示地址内容指令10H3ELDA50H11H5012HD6ADDA30H13H3014H3ELDA10H15H1016HC6ADDA36H17H3618HD6ADDA1FH19H1F1AH76HALT图1-2题
1.12中的程序在存储器中的存放示意图这段程序运行完后累加器A中的值为A=10H+36H-1FH=27H
1.13在给定的模型机中,写出用累加的办法实现15×15的程序[解]LDA0LDH15LOOP:ADDA15DECHJPNZLOOPHALT
1.14在给定的模型机中,写出用累加的办法实现20×20的程序[解]模型机的寄存器是8位,其最大能表示的值为256而20×20=400超出了模型机中能表示的最大值故此题在模型机中无法做需要用8086中的寄存器对才能实现
1.15在模型机中,用重复相减的办法实现除法的程序如下LDA,M2;M2为放除数的存储单元LDH,AXORALOOP LDM3,A;M3为放商的存储单元LDA,M1;M1为放被除数或余数的存储单元SUBHJPC,DONELDM1,ALDA,M3INCAJPLOOPDONE MALT若此程序放在以20H开始的存储区,画出它的存储图[解]程序在存储器中的存储图如图1-3所示地址内容指令20H3ALDAM221HM222H67LDHA23HAFXORA24H32LDM3A25HM326H3ALDAM127HM128H94SUBH29HDAJPCDONE2AH322BH76LDM1A2CHM12DH3ALDAM32EHM32FH3CINCA30HC3JPLOOP31H2432H76HALT图1-3题
1.15中的程序在存储器中存放的示意图
1.16在模型机中,把二进制数转换为BCD码的程序流程图如图1-4所示图1-4题
1.16程序流程图编写出该程序[解]LDH0;计数值H清零LDABinary;把待转换的二进制数→AS1:SUBA64H;待转换的二进制数-100JPMS2;结果﹤0,转S2INCH;计数值加1JPS1S2:ADDA64H;恢复剩余的二进制数LDBinaryA;保存剩余的二进制数LDBCD3H;保存百位BCD码LDH0;计数值H清零LDABinary;剩余的二进制数→AS3:SUBA0AH;剩余的二进制数-10JPMS4;结果﹤0,转S4INCH;计数值加1JPS3S4:ADDA0AH;恢复剩余的二进制数LDBCD1A;保存个位BCD码LDBCD2H;保存十位BCD码HALT第2章
2.18086的基本程序执行寄存器是由哪些寄存器组成?[解]基本程序执行寄存器由以下寄存器组成∶1通用寄存器这八个寄存器能用于存放操作数和指针2段寄存器这些寄存器最多能保持四个段选择子3FLAGS程序状态和控制寄存器FLAGS寄存器报告正在抵行的程序的状态并允许有限地(应用程序级)控制处理器4IP指令指针寄存器IP寄存器包合下一条要挑行的指令的16-位指针
2.28086的存储器是如何组织的?地址如何形成?[解]8086有20条地址引线,它的直接寻址能力为2**20=1M字节所以,在一个8086组成的系统中,可以有多达1M字节的存储器这1M字节逻辑上可以组织成一个线性矩阵地址从00000H到FFFFFH但是,在8086内部的AIU能进行16位运算,有关地址的寄存器如SP、IP,以及BP、SI、DI等也都是16位的,因而8086对地址的运算也只能是16位这就是说,对于8086来说,各种寻址方式,寻找操作数的范围最多只能是64K字节所以,整个1M字节存储器以64K为范围分为若干段在寻址一个具体物理单元时,必须要由一个基地址再加上由各种寻址方式确定的的16位偏移量来形成实际的20位物理地址段基地址就是由8088中的段寄存器,中的16位数自动左移4位,然后与16位偏移量相加,形成20位物理地址
2.3通用寄存器起什么作用?[解]通用寄存器主要用于∶1逻辑和算术操作的操作数2用于地址计算的操作数3内存指针
2.4指令地址如何形成?[解]由段寄存器CS确定的段基地址与由指令指针确定的偏移量相加形成指令地址
2.5如何形成指令中的各种条件码?[解]指令中的条件码,即标志寄存器中的状态标志它们主要由算术和逻辑运算指令设置或清除指令系统中也有设置或清除进位标志的指令
2.68086的总线接口部件有哪些功能请逐一说明[解]总线接口单元(BIU)负责与存储器接口;执行单元(EU)执行各种操作BIU主要由段寄存器、指令指针、加法器(形成20位地址)、预取的指令流队列等组成
2.78086的总线接口部件由哪几部分组成[解]8086中的总线接口单元(BIU)负责CPU与存储器之间的信息传送具体地说,BIU既负责从内存的指定部分取出指令,送至指令队列中排队(8086的指令队列有6个字节,而8088的指令队列只有4个字节);也负责传送执行指令时所需的操作数执行单元(EU)负责执行指令规定的操作
2.8段寄存器CS=1200H,指令指针寄存器IP=FF00H,此时,指令的物理地址为多少[解]指令的物理地址=12000H+FF00H=21F00H
2.98086的执行部件有什么功能由哪几部分组成[解]8086的执行部件负责指令的执行它主要由算术逻辑单元和标志寄存器及通用寄存器等部分组成
2.10状态标志和控制标志有何不同程序中是怎样利用这两类标志的8086的状态标志和控制标志分别有哪些[解]状态标志反映算术和逻辑运算的结果,主要用作于各种条件控制标态实现一些控制作用EFLAGS寄存器有六个状态标志,它们是∶1进位标志CCarryFlag当结果的最高位字节操作时的D7或字操作时的Dl
5、双字操作的D31产生一个进位或借位,则C=1,否则为0这个标志主要用于多字节数的加、减法运算移位和循环指令也能够把存储器或寄存器中的最高位左移时或最低位右移时放人标志C中2辅助进位标志AAuxitiaryCarryFlag在字节操作时,则由低半字节(一个字节的低4位)向高半字节有进位或借位,则A=1,否则为0这个标志用于十进制算术运算指令中3溢出标志OOverflowFlag在算术运算中,带符号数的运算结果超出了8位、16位或32位带符号数能表达的范围,即在字节运算时>十127或<一128,在字运算时>+32767或<一32768,在双字运算时+2**31-1或-2**31此标志置位,否则复位一个任选的溢出中断指令,在溢出情况下能产生中断4符号标志S.SignFlag它的值与运算结果的最高位相同即结果的最高位字操作时为D15为1,则S=1;否则,S=0由于在IA-32结构微处理器中,符号数是用补码表示的,所以S表示了结果的符号,0=正,1=负5奇偶标志PParityFlag若操作结果中“1”的个数为偶数,则P=1,否则P=0这个标志可用于检查在数据传送过程中是否发生错误6零标志ZZerofLag若运算的结果为0,则Z=1,否则Z=0一个控制标志,即方向标志DDirectionFlag若用指令置D=1,则引起串操作指令为自动减量指令,也就是从高地址到低地址或是“从右到左”来处理串;若使D=0,则串操作指令就为自动增量指令STD和CLD指令分别地设置和清除DF标志第3章
3.1分别指出下列指令中的源操作数和目的操作数的寻址方式1MOVSI,3002MOVCX,DATA[DI]3ADDAX,[BX][SI]4ANDAX,CX5MOV[BP],AX6PUSHF[解]⑴源操作数为立即寻址,目的操作数为寄存器寻址⑵源操作数为变址寄存器加位移量寻址,目的操作数为寄存器寻址⑶源操作数为基址加变址寻址,目的操作数为寄存器寻址⑷源操作数和目的操作数都为寄存器寻址⑸源操作数为寄存器寻址,目的操作数为寄存器间接寻址6为堆栈操作
3.2试述指令MOVAX,2000H和MOVAX,DS:[2000H]的区别[解]前一条指令是立即寻址,即把立即数2000H传送至寄存器AX后一条指令是直接寻址,是把数据(DS)段中的地址为2000H单元的内容传送至寄存器AX
3.3写出以下指令中内存操作数的所在地址1MOVAL,[BX十10]2MOV[BP十10],AX3INCBYTEPTR[SI十5]4MOVDL,ES[BX十SI]5MOVBX,[BP十DI十2][解]1数据段中由BX+10单元2堆栈段BP+10单元3数据段SI+5字节单元4附加段(ES段)BX+SI单元5堆栈段BP+DI+2单元
3.4判断下列指令书写是否正确1MOVAL,BX2MOVAL,CL3INC[BX]4MOV5,AL5MOV[BX],[SI]6MOVBL,F5H7MOVDX,2000H8POPCS9PUSHCS[解]1不正确,AL与BX数据宽度不同2正确3不明确是增量字节还是字4不正确,立即数不能作为目的操作数5不明确要传送的是字节还是字(应是[SI]而不表[S1])6正确但十六进制数F5H应写为0F5H7正确8不正确,CS不能作为POP指令的操作数9不正确,CS不能作为PUSH指令的操作数
3.5设堆栈指针SP的初值为1000H,AX=2000H,BX=3000H,试问1执行指令PUSHAX后SP=2再执行PUSHBX及POPAX后SP=、AX=、BX=[解]⑴SP=0FFEH⑵SP=0FFEH、AX=3000H、BX=3000H
3.6要想完成把[3000H]送[2000H]中,用指令MOV[2000H],[3000H]是否正确如果不正确,应用什么方法[解]不正确正确的方法是MOVAL[3000H]MOV[2000H]AL
3.7假如想从200中减去AL中的内容,用SUB200,AL是否正确如果不正确,应用什么方法[解]不正确正确的方法是MOVBL200SUBBLAL
3.8用两种方法写出从80H端口读入信息的指令再用两种方法写出从40H口输出100H的指令[解]1INAL80H2MOVDX80HINALDX3MOVAL100HOUT40HAL4MOVAL100HMOVDX40HOUTDXAL
3.9假如AL=20H,BL=10H,当执行CMPAL,BL后,问1AL,BL中内容是两个无符号数,比较结果如何影响哪几个标志位2AL、BL中内容是两个有符号数,结果又如何,影响哪几个标志位[解]⑴AL=20H,BL=10H,O=0,S=0,Z=0,A=0,P=0,C=0⑵因为两个都是符号正数,其结果同⑴
3.10若要使AL×10,有哪几种方法,编出各自的程序段[解]1使用乘法指令MOVBL10MULBL2使用移位指令SHLAL1MOVBLALSHLAL2ADDALBL3使用加法指令ADDALALMOVBLALADDALALADDALALADDALBL
3.118086汇编语言指令的寻址方式有哪几类用哪一种寻址方式的指令执行速度最快[解]寻址方式分为立即数寻址方式、寄存器操作数寻址方式和存储器操作数寻址方式其中寄存器操作数寻址方式的指令执行速度最快
3.12直接寻址方式中,一般只指出操作数的偏移地址,那么,段地址如何确定如果要用某个段寄存器指出段地址,指令中应如何表示[解]默认的数据访问,操作数在DS段;堆栈操作在SS段;串操作源操作数(SI)在DS段,目的操作数(DI)在ES段;用BP作指针在SS段如果要显式指定段地址,则在操作数中规定段寄存器例如MOVAXES:BX+10H
3.13在寄存器间接寻址方式中,如果指令中没有具体指明段寄存器,那么,段地址如何确定[解]在寄存器间接寻址方式中,如果指令中没有具体指明段寄存器,段地址是隐含约定的,也就是隐含的选择段寄存器如操作类型为指令,则指定代码段寄存器DS,如操作类型为堆栈操作,则指定堆栈段寄存器SS,……,如表2中所示表2段寄存器的约定操作类型约定段寄存器可修改的段寄存器逻辑地址指令CS无IP堆栈操作SS无SP源串地址DSCS、ES、SSSI目的串地址ES无DIBP用作基止寄存器SSCS、DS、ES有效地址通用数据读写DSCS、ES、SS有效地址当需要超越约定时,通常用段替代前缀加冒号“:”来表示段超越,它允许程序设计者偏离任何约定的段例如MOVES:[EBX]EAX这时数据将从寄存器EAX传送至附加段中由EBX寻址的存储单元,而不是传送到数据段中
3.14用寄存器间接寻址方式时,BX、BP、SI、DI分别针对什么情况来使用这四个寄存器组合间接寻址时,地址是怎样计算的举例进行说明[解]在寄存器间接寻址情况下,BX和BP作为间址寄存器使用,而SI、DI作为变址寄存器使用除BP间址默认的段为堆栈段,其地的都默认为数据段它们都可以单独使用,或加上偏移量或组合使用如[BX+n][BP+n][SI+n][DI+n][BX+SI+n][BX+DI+n][BP+SI+n][BP+DI+n]
3.15设DS=2100H,SS=5200H,BX=1400H,BP=6200H,说明下面两条指令所进行的具体操作MOVBYTEPTR[BP],200MOVWORDPTR[BX],2000[解]前一条指令是把立即数(应是字节)200,传送至堆栈段(BP的默认段)偏移量由BP规定的字节单元(地址为52000H+6200H=58200H)第二条指令是把立即数2000,传送至数据段(BX的默认段)偏移量由BX规定的字单元(地址为21000H+1400H=22400H)
3.16使用堆栈操作指令时要注意什么问题传送指令和交换指令在涉及内存操作数时分别要注意什么问题[解]使用堆栈指令可以把内存单元作为一个操作数(从内存到内存)但堆栈固定在堆栈段且只能由SP指向且堆栈操作要修改堆栈指针MOV指令不能实现内存单元间的数据传送XCHG是交换,有一个操作数必须是寄存器
3.17下面这些指令中哪些是正确的哪些是错误的如是错误的,请说明原因XCHGCS,AXMOV[BX],
[1000]XCHGBX,IPPUSHCSPOPCSINBX,DXMOVBYTE[BX],1000MOVCS,
[1000][解]1错误,CS不能交换2错误,MOV指令不能在内存间传送3错误,IP不能交换4错误,CS可能作为PUSH指令的操作数5错误,CS可能作为POP指令的操作数6错误,IN指令的目的操作数是累加器7错误,目的操作数是字节单元8错误,CS不能作为MOV指令的目的操作数
3.18以下是格雷码的编码表00000100012001130010401105011160101701008110091101请用换码指令和其他指令设计一个程序段,实现格雷码往ASCII码的转换[解]MOVBXTABLEMOVSIASCII_TABMOVAL0MOVCX10TRAN:XLATTABLEMOVDLALADDDL30HMOV[SI]DLINCALLOOPTRAN
3.19用乘法指令时,特别要注意先判断用有符号数乘法指令还是用无符号数乘法指令,这是为什么[解]因为有符号数和无符号数,数的乘法是一样的但结果的符号取决于两个操作数的符号
3.20字节扩展指令和字扩展指令用在什么场合举例说明[解]主要用于字节相除和字相除之前,把被除数扩展为两倍宽度的操作数
3.21什么叫BCD码什么叫组合的BCD码什么叫非组合的BCD码8086汇编语言在对BCD码进行加、减、乘、除运算时,采用什么方法[解]BCD码为十进制编码的二进制数组合的BCD数是把两位BCD加在一个字节中,高位的在高四位非组合的BCD码是把一位BCD数放在一个字节的低四位,高四位为08086在BCD加、减和乘以后用BCD调整指令把结果调整为正确的BCD数在BCD除法前先用BCD调整指令再做除法
3.22用普通运算指令执行BCD码运算时,为什么要进行十进制调整具体讲,在进行BCD码的加、减、乘、除运算时,程序段的什么位置必须加上十进制调整指令[解]因为8086指令把操作数作为二进制数进行二进制运算,要得到正确的BCD结果,需要进行调整在加、减、乘法指令之后加上BCD调整指令,而在除法指令之前先用BCD调整指令再用除法指令
3.23普通移位指令和循环移位指令带CF的和不带CF的两类在执行操作时,有什么差别在编制乘除法程序时,为什么常用移位指令来代替乘除法指令试编写一个程序段,实现将BX中的数乘以10,结果仍放在BX中[解]这两种指令的区别在于是否把标志位(CF)的值放入循环中左移一位相当于乘2,右移一位相当于除2故左移和右移可实现乘或除2的幂而移位指令比乘法和除法指令要快得多要实现BX中的数乘10,可以用乘(2+8)实现,乘2即左移一位,乘8即左移三位,把左移一位和左移三位的数相加就行SHLBX1MOVAXBXSHLBX2ADDBXAX
3.24使用串操作指令时,特别要注意和SI、DI这两个寄存器及方向标志DF密切相关请具体就指令MOVSB/MOVSW、CMPSB/CMPSW、SCASB/SCASW、LODSB/LODSW列表说明和SI、DI及DF的关系[解]指令实现操作DFSIDIMOVSBDS:[SI]→ES:[DI]0+1+11-1-1MOVSWDS:[SI]→ES:[DI]0+2+21-2-2CMPSBDS:[SI]-ES:[DI]0+11-1-1CMPSWDS:[SI]-ES:[DI]0+2+21-2-2SCASBAL-ES:[DI]0+1+11-1-1SCASWAX-ES:[DI]0+2+21-2-2LODSBDS:[SI]→AL0+1+11-1-1LODSWDS:[SI]→AX0+2+21-2-
23.25用串操作指令设计实现如下功能的程序段首先将100H个数从2170H处搬到1000H处,然后,从中检索相等于AL中字符的单元,并将此单元值换成空格符[解]MOVSI2170HMOVDI1000HMOVCX100HREPMOVSDISINEXT:SCASBJZN1LOOPNEXTN1:DECDIMOVDI20HJMPNEXT
3.26在使用条件转移指令时,特别要注意它们均为相对转移指令,请解释“相对转移”的含义如果要往较远的地方进行条件转移,那么,程序中应该怎样设置[解]相对转移即为相对于指令指针的转移通常,偏移量是8位数,这是短(short)转移,它可以规定16位偏移量,这就是段内(near)转移
3.27带参数的返回指令用在什么场合设栈顶地址为3000H,当执行RET0006后,SP的值为多少[解]带参数的返回指令用于跳过在调用时通过堆栈传送的参数执行RET0006指令后,SP=2FF6H
3.28在执行中断指令时,堆栈的内容有什么变化中断处理子程序的入口地址是怎样得到的[解]在执行中断指令后,处理器先推入标志寄存器,再推入断点处的指令指针和CS值中断处理程序的入口地址由中断向量和中断向量(描述符)表得到
3.29在执行中断返回指令IRET和普通子程序返回指令RET时,具体操作内容有什么不同[解]IRET除了弹出中断要返回的指令的地址(CS和IP)外,还要恢复中断前的标志寄存器
3.30设当前SS=2010H,SP=FEOOH,BX=3457H,计算当前栈顶地址为多少当执行PUSHBX指令后,栈顶地址和栈顶2个字节的内容分别是什么[解]当前的栈顶为20100H+FE00H=2FF00H执行PUSHBX后,栈顶为2FF00H–2=2FDFE,而2FF00H中的内容为57H,2FDFF中的内容为34H第4章
4.1在下列程序运行后,给相应的寄存器及存储单元填入运行的结果MOVAL,10HMOVCX,1000HMOVBX,2000HMOV[CX],ALXCHGCX,BXMOVDH,[BX]MOVDL,01HXCHGCX,BXMOV[BX],DLHLT[解]寄存器及存储单元的内容AL=10HBL=00HBH=20HCL=00HCH=10HDL=01HDH=10H1000H=10H2000H=01H
4.2要求同题
4.1,程序如下MOVAL,50HMOVBP,1000HMOVBX,2000HMOV[BP],ALMOVDH,20HMOV[BX],DHMOVDL,01HMOVDL,[BX]MOVCX,3000HHLT[解]寄存器及存储单元的内容AL=50HBL=00HBH=20HCL=00HCH=30HDL=20HDH=20HBP=1000H1000H=50H2000H=20H
4.3若在自1000H单元开始有一个100个数的数据块,要把它传送到自2000H开始的存储区中去,用以下三种方法,分别编制程序1不用数据块传送指令;2用单个传送的数据块传送指令;3用数据块成组传送指令[解]1LEASI1000HLEADI2000HMOVCX100L1:MOVAX[SI]MOV[DI]AXLOOPL1HLT2LEASI1000HLEADI2000HMOVCX100CLDL1:MOVSBLOOPL1HLT3LEASI1000HLEADI2000HMOVCX100CLDREPMOVSBHLT
4.4利用变址寄存器,编一个程序,把自1000H单元开始的100个数传送到自1070H开始的储存区中去[解]LEASI1000HLEADI1070HMOVCX100CLDREPMOVSBHLT
4.5要求同
4.4,源地址为2050H,目的地址为2000H,数据块长度为50[解]LEASI2050HLEADI2000HMOVCX50STDREPMOVSBHLT
4.6编一个程序,把自1000H单元开始的100个数传送至1050H开始的存储区中注意数据区有重叠[解]LEASI1000HLEADI1050HADDSI63HADDDI63HMOVCX100STDREPMOVSBHLT
4.7在自0500H单元开始,存有100个数要求把它传送到1000H开始的存储区中,但在传送过程中要检查数的值,遇到第一个零就停止传送[解]LEASI0500HLEADI1000HMOVCX100N1:MOVAL[SI]TESTAL0JZN2MOV[DI]ALINCSIINCDILOOPN1N2:HLT
4.8条件同题
4.7,但在传送过程中检查数的值,零不传送,不是零则传送到目的区[解]LEASI0500HLEADI1000HMOVCX100N1:MOVAL[SI]TESTAL0JZN2MOV[DI]ALN2:INCSIINCDILOOPN1HLT
4.9把在题
4.7中指定的数据块中的正数,传送到自1000H开始的存储区[解]LEASI0500HLEADI1000HMOVCX100N1:MOVAL[SI]TESTAL0JSN2MOV[DI]ALN2:INCSIINCDILOOPN1HLT
4.10把在题
4.7中指定的数据块中的正数,传送到自1000H开始的存储区;而把其中的负数,传送到自1100H开始的存储区且分别统计正数和负数的个数,分别存入1200H和1201H单元中[解]LEASI0500HLEADI1000HLEABX1100HMOVCX100MOVDX0N1:MOVAL[SI]TESTAL0JSN2MOV[DI]ALINCDLINCSIINCDIJMPN3N2:MOV[BX]ALINCDHINCSIINCBXN3:LOOPN1LEABX1200HMOV[BX]DLMOV[BX+1]DHHLT
4.11自0500H单元开始,有10个无符号数,编一个程序求这10个数的和用8位数运算指令,把和放到050A及050B单元中和用两个字节表示,且高位在050B单元[解]LEABX0500HMOVAX0MOVCL10N1:MOVDL[BX]ADDALDLADCAH0INCBXDECCLJNZN1MOV050AHAX
4.12自0200H单元开始,有100个无符号数,编一个程序求这100个数的和用8位数运算指令,把和放在0264H和0265H单元和用两字节表示,且高位在0265H单元[解]LEABX0200HMOVAX0MOVCL100N1:MOVDL[BX]ADDALDLADCAH0INCBXDECCLJNZN1MOV0264HAX
4.13题同
4.12,只是在累加时用16位运算指令编程序[解]LEABX0200HMOVAX0MOVCL100N1:MOVDX[BX]ADDAXDXINCBXDECCLJNZN1MOV0264HAX
4.14若在0500H单元中有一个数x1利用加法指令把它乘2,且送回原存储单元假定x*2后仍为一个字节;2x*4;3x*10假定x*10≤255[解]1LEABX0500HMOVAL[BX]ADDALALMOV[BX]AL2LEABX0500HMOVAL[BX]ADDALALADDALALMOV[BX]AL3LEABX0500HMOVAL[BX]ADDALALMOVDLALADDALALADDALALADDALDLMOV[BX]AL
4.15题意与要求同题
4.14,只是x*2后可能为两个字节[解]LEABX0500HMOVAL[BX]ADDALALADCAH0MOV[BX]AX
4.16若在存储器中有两个数a和b它们所在地址用符号表示,下同,编一个程序实现a*10+ba*10以及“和”用两字节表示[解]LEASIDATA1LEADIDATA2MOVAX[SI]ADDAXAXMOVDXAXADDAXAXADDAXAXADDAXDXADDAX[DI]
4.17若在存储器中有数a、b、c、d它们连续存放,编一个程序实现a*10+b*10+c*10+d和≤65535[解]LEASIDATAMOVAX[SI]MOVCX2N1:ADDAXAXMOVDXAXADDAXAXADDAXAXADDAXDXADDAX[SI+1]INCSILOOPN
14.18在0100H单元和010AH单元开始,存放两个各为10个字节的BCD数地址最低处放的是最低字节,求它们的和,且把和放在0114H开始的存储单元中[解]LEASI0100HLEADI0114HCLCMOVCL10N1:MOVAL[SI]MOVBL10[SI]ADCALBLDAAMOV[DI]ALINCSIINCDIDECCLJNZN
14.19在0200H单元和020AH单元开始,存放两个各为10个字节的二进制数地址最低处放的是最低字节,求它们的和,且把和放在0214H开始的存储单元中[解]LEASI0200HLEADI0214HCLCMOVCL10N1:MOVAL[SI]MOVBL10[SI]ADCALBLMOV[DI]ALINCSIINCDIDECCLJNZN
14.20在0200H单元开始放有数A低位在前NA=95437862310456289101在020AH单元开始放有数BNB=78964238154078218450求两数之差,且把差值送入自0200H开始的存储区[解]LEASI0200HLEADI020AHCLCMOVCL10N1:MOVAL[SI]MOVBL[DI]SBCALBLMOV[SI]ALINCSIINCDIDECCLJNZN
14.21若在0500H单元有一个数x,把此数的前四位变0,后四位维持不变,送回同一单元[解]MOVAL[0500H]AND0FHMOV[0500H]AL
4.22条件同题
4.21,要求最高位不变,后7位都为0[解]MOVAL[0500H]AND80HMOV[0500H]AL
4.23若在0500H单元有一个数x,把此数的前四位变“1”,后四位维持不变,送回同一单元[解]MOVAL[0500H]OR0F0HMOV[0500H]AL
4.24把x的最低位变“1”,高7位不变,送至0600H单元[解]MOVAL[0500H]0R01HMOV[0500H]AL
4.25若在0500H单元有一个数x,把此数的前四位变反,后四位维持不变,送回同一单元[解]MOVAL[0500H]XOR0F0HMOV[0500H]AL
4.26把x的最高位取反,后7位不变,送至0600H单元[解]MOVAL[0500H]XOR80HMOV[0600H]AL
4.27从0200H单元读入一个数,检查它的符号,且在0300H单元为它建立一个符号标志正为00,负为FF[解]MOVAL[0200H]ANDALALJSMINUSMOV[0300H]00HJMPNEXTMINUS:MOV[0300H]0FFHNEXT:
4.28若从0200H单元开始有100个数,编一个程序检查这些数,正数保持不变,负数都取补后送回[解]LEABX0200HMOVCX100CHE:MOVAL[BX]ANDALALJSMINUAINCBXJMPL1MINUS:NEGALMOV[BX]ALINCBXL1:LOOPCHEHLT
4.29把题
4.28中的负数取补后送至0300H单元开始的存储区[解]LEABX0200HLEADI0300HMOVCX100CHE:MOVAL[BX]ANDALALJSMINUAINCBXJMPL1MINUS:NEGALMOV[DI]ALINCBXINCDIL1:LOOPCHEHLT
4.30若在0200H和0201H单元中有一个双字节数,编一个程序对它们求补[解]MOVAX[0200H]NEGAXMOV[0200H]AX
4.31在BX寄存器对中有一个双字节数,对它求补[解]NEGBX
4.32若在0200H~0203H单元中有一个四字节数,编一个程序对它求补[解]LEABX0200HMOVAX[BX]NEGAXMOV[BX]AXMOVAX[BX+2]MOVDX0SBCDXAXMOV[BX+2]DX
4.33若在0200H和0201H单元中有两个正数,编一个程序比较它们的大小,把大的数放在0201H单元中[解]MOVAL[0200H]CMPAL[0201H]JNSLAGJMPNEXTLAG:XCHGAL[0201H]NEXT:
4.34条件同上,把较小的数放在0201H单元中[解]MOVAL[0200H]CMPAL[0201H]JSLESSJMPNEXTLESS:XCHGAL[0201H]NEXT:
4.35条件与要求同题
4.33,只是两个数为无符号数[解]MOVAL[0200H]CMPAL[0201H]JNCLAGJMPNEXTLAG:XCHGAL[0201H]NEXT:
4.36条件与要求同题
4.33,相比较的是两个带符号数[解]MOVAL[0200H]CMPAL[0201H]JGLAGJMPNEXTLAG:XCHGAL[0201H]NEXT:
4.37若自0500H单元开始有1000个带符号数,把它们的最小值找出来,放在1000H单元中[解]LEABX[0500H]MOVAX[BX]INCBXINCBXMOVCX999AGAIN:CMPAX.[BX]JLNEXTMOVAX.[BX]NEXT:INCBXINCBXLOOPAGAINMOV[100H]AXHLT
4.38若自1000H单元开始有1000个无符号数,把它们的最大值找出来,放在2000H单元中[解]LEABX[1000H]MOVAX[BX]INCBXINCBXMOVCX999AGAIN:CMPAX.[BX]JNCNEXTMOVAX.[BX]NEXT:INCBXINCBXLOOPAGAINMOV[100H]AXHLT
4.39若在0200H单元中有一个数x,用移位方法实现1x*22x*4x*≤255且送回原单元[解]SHL[0200H]1SHL[0200H]
14.40编一个程序,使寄存器对BX中的数整个左移一位[解]SHLBX
14.41编一个程序,使寄存器对BP中的数整个右移一位最高位维持不变[解]SARBP
14.42在0200H单元中有一个数x,利用移位和相加的办法,使x*10假定x*10≤255后送回原单元[解]MOVAL[0200H]SHLAL1MOVDLALSHLAL2ADDALDLMOV[0200H]AL
4.43条件和要求同题
4.42,但x*10后可大于255[解]MOVAX[0200H]SHLAX1MOVDXAXSHLAX2ADDAXDXMOV[0200H]AX
4.44在0200H和0201H单元中,存有一个两字节数高位在后,编一个程序把它们整个右移一位[解]SAR[0201H]1RCR[0200H]
14.45在自BUFFER单元开始,放有一个数据块,BUFFER和BUFFER+1单元中放的是数据块的长度,自BUFFER+2开始存放的是以ASCII码表示的10进制数码,把它们转换为BCD码,且把两个相邻单元的数码并成一个单元地址高的放在高四位放到自BUFFER+2开始的存储区中[解]MOVCX[BUFFER]LEASIBUFFER+2LEADIBUFFER+2TRAN:MOVAL[SI]SUBAL30HMOVBLALINCSIMOVAL[SI]SUBAL30HSHLAL4ADDALBLMOV[DI]ALINCSIINCDIDECCXDECCXJNZTRAN
4.46在自BUFFER单元开始,放有一个数据块,BUFFER和BUFFER+1单元中放的是数据的长度,自BUFFER+2开始存放数据,每一单元放的是两位BCD码,把它们分别转换为ASCII码,放到自BLOCK开始的存储区中低四位BCD码转换成的ASCII码放在地址低的单元,而BLOCK和BLOCK+1放转换成的ASCII码的长度[解]MOVCX[BUFFER]MOVDXCXADDDXDXLEASIBUFFER+2LEADIBLOCK+2MOV[BLOCK]DXTRAN:MOVAL[SI]MOVBLALANDAL0FHADDAL30HMOV[DI]ALINCDIMOVALBLSHRAL4ADDAL30HMOV[DI]ALINCSIINCDIDECCXJNZTRAN
4.47在自BUFFER单元开始,放有一个数据块,BUFFER和BUFFER+1单元中放的是数据块的长度,自BUFFER+2开始存放的是以ASCII码表示的16进制数码即0—9,A—F,把它们转换为16进制数码,放在同一单元中[解]MOVCX[BUFFER]LEASIBUFFER+2TRAN:MOVAL[SI]SUBAL30HMOV[SI]ALINCSILOOPTRAN
4.48条件同题
4.47,把转换以后的两个相邻的16进制数并在一个存储单元中[解]MOVCX[BUFFER]LEASIBUFFER+2LEADIBUFFER+2TRAN:MOVAL[SI]SUBAL30HMOVBLALINCSIMOVAL[SI]SUBAL30HSHLAL4ADDALBLMOV[DI]ALINCSIINCDIDECCXDECCXJNZTRAN
4.49若在某存储区中已输入4个以ASCII码表示的16进制数码高位在前,把它们转换为二进制数放入BX寄存器对中[解]LEASIDATAMOVAL[SI]SUBAL30HMOVBLALMOVAL[SI+1]SUBAL30HSHLAL4ANDBLALMOVAH[SI+2]SUBAH30HMOVBHAHMOVAH[SI+3]SUBAH30HSHLAH4ANDBHAH
4.50在自BUFFER单元开始的数据块中,前两个单元放的是数据块的长度,自BUFFER+2开始存放的是二进制的数据块把每一个存储单元的两位16进制数,分别转换为各自的ASCII码,放到自BLOCK开始的存储区中开始两个单元放新的数据块的长度[解]MOVCX[BUFFER]MOVDXCXADDDXDXLEASIBUFFER+2LEADIBLOCK+2MOV[BLOCK]DXTRAN:MOVAL[SI]MOVDLALANDAL0FHADDAL30HMOV[DI]ALINCDIMOVALDLSHRAL4ADDAL30HMOV[DI]ALINCSIINCDILOOPTRAN
4.51在题
4.45中,把相邻单元的两个数码看成是两位十进制数后面的为十位数,把它们转换为相应的二进制数,放到自BUFFER+2开始的存储区中[解]MOVCX[BUFFER]LEASIBUFFER+2LEADIBUFFER+2TRAN:MOVAL[SI]SUBAL30HMOVBLALINCSIMOVAL[SI]SUBAL30HADDALALMOVDLALADDALALADDALALADDALDLADDALBLMOV[DI]ALINCSIINCDIDECCXDECCXJNZTRAN
4.52在题
4.50中,把数据块中的每一单元的二进制数转换为相应的BCD码每一字节的二进制数,对应三位BCD码,再把它们转换为ASCII码放到自BLOCK开始的存储区中开始两个单元放新的数据块的长度[解]MOVCX[BUFFER]MOVDXCXADDDXDXADDDXCXLEASIBUFFER+2LEADIBLOCK+2MOV[BLOCK]DXMOVDL0TRAN:MOVAL[SI]TRAN1:SUBAL64HJSN1INCDLJMPTRAN1N1:ADDAL64HADDDL30HMOV[DI]DLINCDIMOVDL0N2:SUBAL0AHJSN3INCDLJMPN2N3:ADDAL0AHADDDL30HMOV[DI]DLINCDIADDAL30HMOV[DI]ALINCSIINCDILOOPTRAN
4.53若在DX寄存器中放有四位BCD码,把它们转换为相应的二进制数,放在BX寄存器中[解]采用千位数×10十百位数×10+十位数×10+个位数的方法转换MOVAXBXANDAX0F000HSHRAX12MOVDXAXCALLCHANGEMOVAXDXMOVCXBXANDCX0F00HSHRCX8ADDAXCXMOVDXAXCALLCHANGEMOVAXDXMOVCXBXANDCX00F0HSHRCX4ADDAXCXMOVDXAXCALLCHANGEMOVAXDXANDBX000FHADDAXBXMOVBXAXCHANGEPROCADDDXDXMOVCXDXADDDXDXADDDXDXADDDXCXRETCHANGEENDP
4.54若在BX寄存器中有一个16位无符号数,把它们转换为相应的BCD码,放到自DATA开始的存储区中每一位BCD码占一个存储单元,高位在前[解]用在BX寄存器的16位无符号数有多少个
10000、
1000、
100、10,再把它们以BCD数表示来转换LEADIDATAMOVDL0T1:SUBBX10000JCN1INCDLJMPT1N1:ADDBX10000MOV[DI]DLINCDIMOVDL0T2:SUBBX1000JCN2INCDLJMPT2N2:ADDBX1000MOV[DI]DLINCDIMOVDL0T3:SUBBX100JCN3INCDLJMPT3N3:ADDBX100MOV[DI]DLINCDIMOVDL0T4:SUBBX10JCN4INCDLJMPT4N4:ADDBX10MOV[DI]DLINCDIMOV[DI]BL
4.55若在BX寄存器中有一个16位带符号数,把它们转换为相应的BCD码,放在自DATA开始的存储区中符号占一个单元,每一位BCD码占一个存储单元,高位在前[解]LEADIDATAMOVDL0ANDBXBXJSMINUSMOVAL00HMOV[DI]ALJMPPLUSMINUS:MOVAL0FFHMOV[DI]ALPLUS:INCDIANDBX7FFFHT1:SUBBX10000JCN1INCDLJMPT1N1:ADDBX10000MOV[DI]DLINCDIMOVDL0T2:SUBBX1000JCN2INCDLJMPT2N2:ADDBX1000MOV[DI]DLINCDIMOVDL0T3:SUBBX100JCN3INCDLJMPT3N3:ADDBX100MOV[DI]DLINCDIMOVDL0T4:SUBBX10JCN4INCDLJMPT4N4:ADDBX10MOV[DI]DLINCDIMOV[DI]BL
4.56若自STRING单元开始存放一个字符串以字符$结尾1编一个程序统计这个字符串的长度不包括$字符;2把字符串的长度,放在STRING单元,把整个字符串往下移两个存储单元[解]LEADISTRINGXORDXDXMOVAL’$’CLDAGAIN:SCASBJEN1INCDXJMPAGAINN1:LEASISTRING+2XCHGSIDIMOVCXDXREPMOVSBMOV[STRING]DX
4.57若自STRING单元开始存放一个字符串以字符空格引导,以$结尾,编一个程序统计这个字符串的长度忽略前导空格和结尾的$字符[解]LEADISTRINGXORDXDXMOVAL20HCLDAGAIN:SCASBJNEN1JMPAGAINN1:MOVAL’$’A1:SCASBJEN2INCDXJMPA1N2:MOV[LENGTH]DX
4.58在题
4.57的字符串中,统计数字字符′0′~′9′的个数[解]LEADISTRINGXORDXDXMOVAL’$’CLDAGAIN:SCASBJEN1CMPAL’0’JLA1CMPAL’9’JGA1INCDXA1:JMPAGAINN1:MOV[RESULT]DX
4.59在题
4.57的字符串中,统计16进位字符即′0′~′9′,′A′~′F′的个数[解]LEADISTRINGXORDXDXMOVAL’$’CLDAGAIN:SCASBJEN1CMPAL’0’JLA1CMPAL’9’JGA2INCDXA2:CMPAL’A’JLA1CMPAL’F’JGA1INCDXA1:JMPAGAINN1:MOV[RESULT]DX
4.60在题
4.57的字符串中,把十进制数字字符′0′~′9′传送至DATA开始的存储区中,在DATA和DATA+1单元存放的是这个数字字符串的长度,自DATA+2单元开始存放字符[解]LEADISTRINGLEABXDATA+2XORDXDXMOVAL’$’CLDAGAIN:SCASBJEN1CMPAL’0’JLA1CMPAL’9’JGA1MOV[BX]ALINCBXINCDXA1:JMPAGAINN1:MOV[DATA]DX
4.61条件和要求同题
4.60,只是传送的是16进制数字字符[解]LEADISTRINGLEABXDATA+2XORDXDXMOVAL’$’CLDAGAIN:SCASBJEN1CMPAL’0’JLA1CMPAL’9’JGA2INCDXMOV[BX]ALINCBXA2:CMPAL’A’JLA1CMPAL’F’JGA1INCDXMOV[BX]ALINCBXA1:JMPAGAINN1:MOV[DATA]DX
4.62在自STRI1和STRI2开始各有一个由10个字符组成的字符串,检查这两个字符串是否相等,在STFLAG单元中建立一个标志相等为00,不等为FF[解]LEASISTR1LEADISTR2MOVCX10`CLDREPZCMPSBJNEUNMATMOVAL0JMPOUTPTUNMAT:MOVAL0FFHOUTPT:MOV[STFLAG]AL
4.63编一个程序,统计一个八位二进制数中的为“1”的位的个数[解]用对二进制数移位,检查CF标志确定是否为“1”LEABXDATAMOVDL0MOVAL[BX]MOVCL8A1:SHLAL1JNCA2INCDLA2:DECCLJNZA1MOV[RESULT]DL
4.64编一个程序,统计一个16位二进制数中的为“1”的位的个数LEABXDATAMOVDL0MOVAX[BX]MOVCL16A1:SHLAX1JNCA2INCDLA2:DECCLJNZA1MOV[RESULT]DL
4.65在自STRI1开始有一个字符串前两个字节为字符串长度,对每一个字符配上偶检验位,送回原处[解]LEASISTRI1+2MOVCX[STRI1]CYC:MOVAL[SI]ANDALALJPEN1ORAL80HMOV[SI]ALN1:INCSIDECCXJNZCYC以下各题所编的程序必须包含必要的伪指令
4.66自NUMBER单元开始放有两个多字节的用BCD码表示的十进制数,NUMBER单元放的是字节数,NUMBER+1开始连续存放两个多字节数高位在后,编一个程序把这两个多字节数相加,和接着原来的数连续存放[解]NAMEADD_BCDDATASEGMENTNUMBERDWLENGTHDB’x1x2…xn’DB’y1y2…yn’DBLENGFHDUPDATAENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATASS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVESAXLEASINUMBER+2MOVBXSIMOVCX[NUMBER]ADDBXCXMOVDXBXADDBXCXMOVDIBXMOVBXDXCLCAGAIN:MOVAL[SI]ADCAL[BX]DAAMOV[DI]ALINCSIINCBXINCDILOOPAGAINRETSTARTENDPCODEENDSENDBEGIN
4.67编一个程序,使放在DATA及DATA+1单元的两个八位带符号数相乘,乘积放在DATA+2及DATA+3单元中高位在后[解]NAMEMULDATA1SEGMENTDATADBX1X2DBDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVAL[DATA]IMUL[DATA+1]MOV[DATA+2]ALMOV[DATA+3]AHRETSTARTENDPCODEENDSENDBEGIN
4.68编一个程序,使放在DATA被除数及DATA+1除数的两个八位带符号数相除,商放在DATA+2单元,余数放在DATA+3单元中[解]NAMEDIVDATA1SEGMENTDATADBX1X2DBDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVAL[DATA]CBWIDIV[DATA+1]MOV[DATA+2]ALMOV[DATA+3]AHRETSTARTENDPCODEENDSENDBEGIN
4.69编一个程序,使放在DATA和DATA+1的两字节无符号数与在DATA+2及DATA+3中的无符号数相乘,乘积接着原来的数存放高位在后[解]NAMEMULWDATA1SEGMENTDATADMX1X2DBDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXLEABXDATAMOVAX[BX]MUL2[BX]MOV4[BX]AXMOV6[BX]DXRETSTARTENDPCODEENDSENDBEGIN
4.70编一个24位无符号数相乘的程序[解]在32位处理器中,可以用32位乘法指令把24位无符号数高位添8位0放在32位寄存器中相乘以后的64位结果在EDX:EAX中NAME24MULDATA1SEGMENTDATADBX1X2X30DBY1Y2Y30DB8DUPDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVEAX0PUSHEAXMOVAXWORDPTRDATAMOVDSAXLEAEBXDATAMOVEAX[EBX]MUL4[EBX]MOV8[EBX]EAXMOV12[EBX]EDXRETSTARTENDPCODEENDSENDBEGIN
4.71编一个程序,使上题中的两个16位无符号数相除,商和余数接着原来的数存放先放商,高位在后[解]NAMEDIV_16DATA1SEGMENTDATADWX1X2DBDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVAX[DATA]CWDIDIV[DATA+2]MOV[DATA+4]AXMOV[DATA+6]DXRETSTARTENDPCODEENDSENDBEGIN
4.72在题
4.69中,相乘的是两个16位的带符号数,计算乘积[解]NAMEIMULWDATA1SEGMENTDATADMX1X2DBDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXLEABXDATAMOVAX[BX]IMUL2[BX]MOV4[BX]AXMOV6[BX]DXRETSTARTENDPCODEENDSENDBEGIN
4.73若在自DATA开始的7个单元中,第一个单元放数的符号用ASCII码表示,接着最多为5位用ASCII码表示的十进制数码高位在前,且数值在±32768范围内,然后是非数字字符表示数的结束编一个程序,把它转换为相应的16位二进制数用补码表示,放在BX寄存器中[解]NAMEBCD_TO_BDATA1SEGMENTDATADBX1X2X3X4X5X6X7DATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVBL0AHMOVCX0MOVSI1MOVDX0LOP:MOVALDATA[SI]CMPAL30HJLN1CMPAL39HJGN1INCCXINCSIJMPLOPN1:SUBSICXMOVAX0LOP1:MOVDLDATA[SI]ANDDL0FHADDAXDXDECCXJZN1CALLMUL10INCSIJMPLOP1N3:MOVBLDATACMPBL’+’JZN2NEGAXN2:MOVBXAXRETSTARTENDPMUL10PROCADDAXAXPUSHDXMOVDXAXADDAXAXADDAXAXADDAXDXPOPDXRETMUL10ENDPCODEENDSENDBEGIN
4.74把在BX寄存器对中的16位带符号二进制数转换为十进制数,且把符号位及各位十进制码转换为相应的ASCII码,放到自DATA开始的7个存储单元中高位在前,最后填以空格[解]NAMEH_TO_BCDDATA1SEGMENTDATADB7DUPDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXLEADIDATAMOVDL0ANDBXBXJSMINUSMOVAL’+’MOV[DI]ALJMPPLUSMINUS:MOVAL’-’MOV[DI]ALPLUS:INCDIANDBX7FFFHT1:SUBBX10000JCN1INCDLJMPT1N1:ADDBX10000ADDDL30HMOV[DI]DLINCDIMOVDL0T2:SUBBX1000JCN2INCDLJMPT2N2:ADDBX1000ADDDL30HMOV[DI]DLINCDIMOVDL0T3:SUBBX100JCN3INCDLJMPT3N3:ADDBX100ADDDL30HMOV[DI]DLINCDIMOVDL0T4:SUBBX10JCN4INCDLJMPT4N4:ADDBX10ADDDL30HMOV[DI]DLINCDIADDBL30HMOV[DI]BLINCDIMOVAL20HMOV[DI]ALRETSTARTENDPCODEENDSENDBEGIN
4.75若自STRING开始有一个字符串以′#′号作为字符串的结束标志,编一个程序,查找此字符串中有没有字符$,有多少个$放在NUMBER单元中,没有$则其为0,否则即为$的个数;且把每一个$字符所存放的地址,放到自POINTR开始的连续的存储单元中[解]NAMES_STRINGDATA1SEGMENTSTRINGDB’…#’NUMBERDWPOINTRDB100DUPDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVESAXLEADISTRINGLEASINEMBERLEABXPOINTRCLDMOVDL0`LOP1:SCASBCMPAL’#’JEDONECMPAL’$’JEN1JMPLOP1N1:INCDLDECDIMOV[BX]DIINCBXINCDIJMPLOP1DONE:MOV[SI]DLRETSTARTENDPCODEENDSENDBEGIN
4.76某一个监控程序中,有10个命令,分别以字母A、B、C、D、E、F、G、H、I、J表示这10个命令有10个处理程序,它们的入口地址形成一个表格CMDTBL3000CMDTBL30003500;A命令入口30023550;B命令入口30043600;C命令入口30063640;D命令入口30083670;E命令入口300A36B0;F命令入口300C3700;G命令入口300E3730;H命令入口30103760;I命令入口301237A0;J命令入口若打入的命令字已在累加器A中,编一个程序,根据输入的命令字转至相应的处理程序[解]NAMECMD_LISTDATA1SEGMENTORG3000CMDTBLDW3500355036003640367036B
0.37003730376037A0ORG3500CMDADWX1ORG3550CMDBDWX2ORG3600CMDCDWX3ORG3640CMDDDWX4ORG3670CMDEDWX5ORG36B0CMDFDWX6ORG3700CMDGDWX7ORG3730CMDHDWX8ORG3760CMDIDWX9ORG37A0CMDJDWX10DATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXCMPAL’A’JETRAN1CMPAL’B’JETRAN2CMPAL’C’JETRAN3CMPAL’D’JETRAN4CMPAL’E’JETRAN5CMPAL’F’JETRAN6CMPAL’G’JETRAN7CMPAL’H’JETRAN8CMPAL’I’JETRAN9CMPAL’J’JETRAN10JMPDONETRAN1:JMPCMDATRAN2:JMPCMDBTRAN3:JMPCMDCTRAN4:JMPCMDDTRAN5:JMPCMDETRAN6:JMPCMDFTRAN7:JMPCMDGTRAN8:JMPCMDHTRAN9:JMPCMDITRAN10:JMPCMDJDONE:RETSTARTENDPCODEENDSENDBEGIN
4.77条件同题
4.76,只是有一个转移指令表,如下所示3000CMDJPT3000JP3500;转至A命令处理程序入口3003JP3550;转至B命令处理程序入口3006JP3600;转至C命令处理程序入口3009JP3640;转至D命令处理程序入口300CJP3670;转至E命令处理程序入口300FJP36B0;转至F命令处理程序入口3012JP3700;转至G命令处理程序入口3015JP3730;转至H命令处理程序入口3018JP3760;转至I命令处理程序入口301BJP37A0;转至J命令处理程序入口要求同题76[解]NAMEJMP_LISTDATA1SEGMENTORG3000CMDJPTDB/4FFDW3500DB/
4.FFDW3550DB/4FFDW3600DB/4FFDW3640DB/4FFDW3670DB/4FFDW36B0DB/4FFDW3700DB/4FFDW3730DB/4FFDW3760DB/4FFDW37A0DATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXLEASICMDJPTCMPAL’A’JETRAN1CMPAL’B’JETRAN2CMPAL’C’JETRAN3CMPAL’D’JETRAN4CMPAL’E’JETRAN5CMPAL’F’JETRAN6CMPAL’G’JETRAN7CMPAL’H’JETRAN8CMPAL’I’JETRAN9CMPAL’J’JETRAN10JMPDONETRAN1:JMP[SI]TRAN2:JMP4{SI}TRAN3:JMP8[SITRAN4:JMP12[SI]TRAN5:JMP16[SI]TRAN6:JMP20[SI]TRAN7:JMP24[SI]TRAN8:JMP28[SI]TRAN9:JMP32[SI]TRAN10:JMP36[SI]DONE:RETSTARTENDPCODEENDSENDBEGIN
4.78某一个操作系统有6个内部命令,把这6个内部命令及相应的处理程序的入口地址,组成一个内部命令表INCMDT,如下所示ORG2000HINCMDT DB′ATRIB′DB00DW2020DB′BYE′DB00DW2050DB′DIR′DB00DW20A0DB′ERA′DB00DW2100DB′REN′DB00DW2140DB′SAVE′DB00DW2180DB′TYPE′DB00DW21E0若输入的内部命令字符以00字节作为命令字符的结束标志,已在BUFFER开始的存储区中编一个程序根据输入的命令字转至相应的处理程序[解]存在内部命令表和BUFFER中的命令,只是它们的首字符,例如‘ATRIB’,为‘A’NAMEICMD_LISTDATA1SEGMENTORG2000HINCMDT DB′ATRIB′DB00DW2020DB′BYE′DB00DW2050DB′DIR′DB00DW20A0DB′ERA′DB00DW2100DB′REN′DB00DW2140DB′SAVE′DB00DW2180DB′TYPE′DB00DW21E0DATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXLEASIBUFFERLEABXINCMDTMOVAL[SI]CMPAL[BX]JETRAN1CMPAL4[BX]JETRAN2CMPAL8[BX]JETRAN3CMPAL[BX+0C]JETRAN4CMPAL[BX+10]JETRAN5JMPDONETRAN1:JMP2[BX]TRAN2:JMP6[BX]TRAN3:JMP[BX+OA]TRAN4:JMP[BX+0E]TRAN5:JMP[BX+12]DONE:RETSTARTENDPCODEENDSENDBEGIN
4.79条件同题
4.78,但在BUFFER开始的存储区中的命令字,可能是一个内部命令,则应转至相应的处理程序;可能不是内部命令,则在程序中应建立一个标志[解]存在内部命令表和BUFFER中的命令,只是它们的首字符,例如‘ATRIB’,为‘A’NAMEICMD_LIST1DATA1SEGMENTORG2000HINCMDTDB′ATRIB′DB00DW2020DB′BYE′DB00DW2050DB′DIR′DB00DW20A0DB′ERA′DB00DW2100DB′REN′DB00DW2140DB′SAVE′DB00DW2180DB′TYPE′DB00DW21E0FLGDBDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXLEASIBUFFERLEABXINCMDTMOVAL[SI]CMPAL[BX]JETRAN1CMPAL4[BX]JETRAN2CMPAL8[BX]JETRAN3CMPAL[BX+0C]JETRAN4CMPAL[BX+10]JETRAN5JMPDONETRAN1:JMP2[BX]TRAN2:JMP6[BX]TRAN3:JMP[BX+OA]TRAN4:JMP[BX+0E]TRAN5:JMP[BX+12]DONE:MOVDL0FFHMOVFLGDLRETSTARTENDPCODEENDSENDBEGIN
4.80在自BLOCK开始的存储区中有1000个带符号数用气泡排序法编一个程序,使它们排列有序[解]NAMEBOBBLE_SORTDATA1SEGMENTBLOCKDWX1X2…X999DATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXCONTI:MOVBL0MOVCX1000ADDCXCXMOVSICXDECSIDECSIAGAIN:MOVAXBLOCK[SI]CMPAXBLOCK[SI-2]JGENEXTXCHGAXBLOCK[SI-2]MOV[SI]AXMOVBL-1NEXT:DECSIDECSILOOPAGAINCMPBL0JNECONTIRETSTARTENDPCODEENDSENDBEGIN
4.81在自TABLE开始的存储区中有一个有序排列带符号数,大的在后面的数据块,其中TABLE及TABLE+1中存放数据块长度N可以大于255,若要搜索的关键字已输入至累加器A中编一个程序用对分搜索法搜索此关键字,在程序中建立一个标志,表示是否有此关键字[解]NAMEB_SEARCHDATA1SEGMENTTABLEDWNDWX1X2…XN-1FLGDWDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXLEASITABLE+2MOVCX[TABLE]MOVDISIMOVDICXMOVDX1CONTI:MOVBXSIADDBXDISHRBX1CMPAX[BX]JEFOUNDPUSHFCMPBXSIJENOFODPOPFJLELESSMOVSIBXJMPNEXTLESS:MOVDIBXNEXT:INCDXJMPCONTINOFOD:MOVDX-1FOUND:MOVFLGDXRETSTARTENDPCODEENDSENDBEGIN
4.82条件及要求同题
4.81,只是已排序的数据块是大的数在前面地址低处[解]NAMEB_SEARCH1DATA1SEGMENTTABLEDWNDWX1X2…XN-1FLGDWDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXLEASITABLE+2MOVCX[TABLE]MOVDISIMOVDICXMOVDX1CONTI:MOVBXSIADDBXDISHRBX1PUSHDXMOVDH[BX]MOVDL[BX+1]CMPAXDXPOPDXJEFOUNDPUSHFCMPBXSIJENOFODPOPFJLELESSMOVSIBXJMPNEXTLESS:MOVDIBXNEXT:INCDXJMPCONTINOFOD:MOVDX-1FOUND:MOVFLGDXRETSTARTENDPCODEENDSENDBEGIN
4.83把数据块传送程序编为一个子程序MOVE,源地址、目的地址和传送的字节数放在自ADDR开始的存储单元中[解]NAMESUBPROGRAM_1DATA1SEGMENTADDRDWS_ADDRDWD_ADDRDWLEN...DATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAX...CALLMOV1RETSTARTENDPMOV1PROCLEABXADDRMOVSI[BX]MOVDI[BX+2]MOVCX[BX+4]CLDREPMOVSS_ADDRD_ADDRRETMOV1ENDPCODEENDSENDBEGIN
4.84把八位无符号数乘法程序编为一个子程序,被乘数、乘数和乘积放在自DATA开始的存储单元中[解]NAMESUBPROGRAM_2DATA1SEGMENTDATADBYDBXDW...DATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAX...CALLMUL1RETSTARTENDPMUL1PROCLEABXDATAMOVAL[BX]MUL[BX+1]MOV[BX+2]AXRETMUL1ENDPCODEENDSENDBEGIN
4.85把八位无符号数除法程序编为一个子程序,被除数、除数、商和余数放在自DATA开始的存储单元中[解]NAMESUBPROGRAM_3DATA1SEGMENTDATADBYDBXDW...DATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAX...CALLDIV1RETSTARTENDPDIV1PROCLEABXDATAMOVAL[BX]CBWDIV[BX+1]MOV[BX+2]ALMOV[BX+3]AHRETMUL1ENDPCODEENDSENDBEGIN
4.86写一个宏定义,使8088的8位寄存器之间的数据能实现任意传送[解]宏定义如下X_MOVEMACROP1P2MOVP1P2ENDM
4.87写一个宏定义,使8088的16位寄存器的数据互换[解]宏定义如下X_CHMACROP1P2XCHGP1P2ENDM
4.88写一个宏定义,能把任一个寄存器的最高位移至另一个寄存器的最低位中[解]宏定义如下X_SHRMACROP1P2SHLP11RCLP21ENDM
4.89写一个宏定义,能把任一个内存单元中的最高位移至另一个内存单元的最低位中[解]宏定义如下X_SHMMACROP1P2LEASIP1LEADIP2SHL[SI]1RCL[DI]1ENDM
4.90写一个宏定义,能把任一个寄存器的最低位移至另一个寄存器的最高位中[解]宏定义如下X_SHR1MACROP1P2SARP11RCRP21ENDM
4.91写一个宏定义,能把任一个内存单元中的最低位移至另一个内存单元的最高位中[解]宏定义如下X_SHM1MACROP1P2LEASIP1LEADIP2SAR[SI]1RCR[DI]1ENDM
4.92用宏定义写一个数据块传送指令X_MOVSMACROP1P2P3LEASIP1LEADIP2MOVCXP2CLDREPMOVSWENDM
4.93写一个宏定义,能使任一个寄存器对向左或向右移位指定的次数[解]宏定义如下X_SH1MACROP1P2P3MOVCLP1SP2P3CLENDM第5章
5.1总线周期的含义是什么8086/8088的基本总线周期由几个时钟组成如一个CPU的时钟频率为8MHz,那么,它的一个时钟周期为多少一个基本总线周期为多少如主频为5MHz呢[解]CPU访问总线(从内存储器或I/O端口读/写字节或字)所需的时间称为总线周期8086/8088的基本总线周期由4个时钟组成若CPU的时钟频率为8
(5)MHz,时钟周期为1/8MHz=125(1/5MHz=200)ns,基本总线周期为4×125
(200)ns=500
(800)ns
5.2在总线周期的Tl、T
2、T
3、T4状态,CPU分别执行什么动作什么情况下需要插入等待状态TwTw在哪儿插入怎样插入[解]以存储器读为例在T1周期,输出地址信号、地址锁存允许信号、内存或I/O端口访问控制信号;在T2周期,CPU开始执行数据传送操作,此时,8086内部的多路开关进行切换,将地址/数据线AD0~AD15上的地址撤消,切换为数据总线,为读写数据作准备8288发出数据总线允许信是和数据发送/接收控制信号DT/R#允许数据收发器工作,使数据总线与8086的数据线接通,并控制数据传送的方向同样,把地址/状态线A16/S3~A19/S6切换成与总线周期有关的状态信息,指示若干与周期有关的情况在T3周期开始的时钟下降沿上,8086采样READY线如果READY信号有效高电平,则在T3状态结束后进入T4状态,在T4状态开始的时钟下降沿,把数据总线上的数据读入CPU或写到地址选中的单元在T4状态中结束总线周期如果访问的是慢速存储器或是外设接口,则应该在T1状态输出的地址,经过译码选中某个单元或设备后,立即驱动READY信号到低电乎8086在T3状态采样到BEADY信号无效,就会插入等待周期Tw,在Tw状态CPU继续采样READY信号;直至其变为有效后再进入T4状态,完成数据传送,结束总线周期在T4状态,8086完成数据传送,状态信号S0#~S2#变为无操作的过渡状态在此期间,8086结束总线周期,恢复各信号线的初态,准备执行下一个总线周期
5.38086和8088是怎样解决地址线和数据线的复用问题的ALE#信号何时处于有效电平[解]8086和8088是利用信号的时序来解决地址线和数据线的复用的无论是内存或I/O端口访问,CPU总是先输出要访问的内存单元或I/O端口的地址,使内存和I/O端口有时间进行地址译码以找到要访问的单元,然后才能进行数据传送所以CPU在T1周期输出地址,同时输出ALE#信号以锁存在复用线上输出的地址在T2周期,CPU开始执行数据传送操作,此时,8086内部的多路开关进行切换,将地址/数据线AD0~AD15上的地址撤消,切换为数据总线,为读写数据作准备
5.4Tl状态下,数据/地址线上是什么信息用哪个信号将此信息锁存起来数据信息是在什么时候给出的用时序图表示出来[解]在T1周期,数握/地址线上输出的是地址用ALE#信号把地址锁存在T2周期在CPU内部已把数据/地址线切换为数据线
5.5若已有两个数a=200b=150用累加的办法求x=a*b,可以有两种编程序的方法1用一个起始值为0的16位部分积寄存器,把被乘数即200加150次即次数由乘数决定,即直接用150次加法指令2方法同上,但用循环程序,用乘数作循环次数分别编写出这两种程序,比较这两种程序的执行时间((指令的执行时间见附录)[解]1用累加的方法MOVBXaMOVAX0ADDAXBXADDAXBX...ADDAXBX2用循环的方法;MOVBXaMOVCXbMOVAX0LOP1:ADDAXBXLOOPLOP11方法所需时间为前两条立即数传送时钟周期数为4加法指令的时钟周期数为3,故程序段的总时钟周期数=4+4+3×150=4582方法所需时间为前3条立即数传送时钟周期数为4加法指令的时钟周期数为3,LOOP指令的时钟周期数为17,故程序段的总时钟周期数=4+4+4+17×150=2562显然,第二钟方法缩短了程序的长度,但时钟周期数却大大增加了
5.6若用部分积右移的办法来编乘法程序,编出程序,计算这种方法所用的执行时间,与题
5.5中的结果相比较[解]用部分积右移的算法是置部分积为0,由乘数的最低位判断,若其为1,则把被乘数加至部分积(乘数为0则不加被乘数),然后部分积和乘数都右移一位,重复上述的操作,重复次数为乘数的位数相应的程序为MOVAX0MOVDL10010110BMOVBL200MOVCL8LOP1:SHRDL1JNCN1ADDAHBLN1:SARAX1DECCLJNZLOP1RET此程序段的时钟周期数=4+4+4+4+2+16+3+2+16×8=328比上述两种方法都快
5.7编出用被乘数左移的方法实现乘法的程序,计算它的执行时间,与题5中的结果相比较[解]用被乘数左的算法是置部分积为0,由乘数的最低位判断,若其为1,则把被乘数加至部分积(乘数为0则不加被乘数),然后被乘数左移一位,乘数右移一位,重复上述的操作,重复次数为乘数的位数相应的程序为MOVAX0MOVDL10010110BMOVBL200MOVCL8LOP1:SHRDL1JNCN1ADDALBLN1:SHLBL1DECCLJNZLOP1RET此程序段的时钟周期数=4+4+4+4+2+16+3+2+16×8=328与部分积右移的结果一样
5.8下面是两个能实现数据块传送的程序MOVBX,AREA1MOVSI,0MOVDI,AREA2MOVDI,0MOVCX,100MOVCX,100LOOP1MOVAL,[BX]LOP1MOVAL,AREA1SIMOV[DI],ALMOVAREA2DI,ALINCBXINCSIINCDIINCDILOOPLOOP1LOOPLOP1HLTHLT比较这两个程序的执行时间[解]这两个程序段执行时间的主要区别在于循环中传送内存操作数的寻址方式左边的是采用基址寻址,每条指令为5个时钟周期,而右边的采用偏移量加基址或变址寻址,每条指令是9个时钟周期故左边的程序段比右边的要快
5.9下面是两个能把累加器A中的数*10*10后仍<255的程序SALALADDAL,ALMOVCL,ALMOVCL,ALSALALADDAL,ALSALALADDAL,ALADDAL,CLADDAL,CL比较这两个程序的执行时间[解]这两个程序段执行时间的主要区别是用移位还是用加法指令实现×
2、×4与×8,移位指令用2个时钟周期,加法指令用3个时钟周期故,左边的程序段比右边的快
5.10编一个能用软件实现延时20ms的子程序[解]20ms延时,要用指令的循环实现,最简单的循环,是对CX寄存器装入一立即数,然后用LOOP循环装入立即数为4个时钟周期,LOOP是17个时钟周期若一个时钟周期是125ns,则需循环20ms/21×125ns=762故程序段为MOVCX762LOP1LOOPLOP
15.11编一个能用软件实现延时100ms的子程序[解]要延时100ms,则只需使延时20ms的程序段执行5次MOVBL5DEL20:MOVCX762LOP1:LOOPLOP1DECBLJNZDEL
205.12编一个能用软件实现延时1s的子程序[解]要延时1s,则执行10次100ms,也即需使延时20ms的程序段执行50次MOVBL50DEL20:MOVCX762LOP1:LOOPLOP1DECBLJNZDEL
205.13若在TIME开始的存储区中,已输入了以BCD码表示的时、分、秒的起始值共用三个存储单元,时在前,利用延时1秒的子程序,以CPU内部的三个寄存器中,产生实时时钟[解]NAMECLOCKDATA1SEGMENTTIMEDBYDBXDWZDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXLEABXTIMEMOVCH[BX]MOVDH[BX+1]MOVDL[BX+2]AGAIN:CALLDELAYMOVALDLADDAL1DAAMOVDLALCMPAL.60JNEN1MOVDL0MOVALDHADDAL1DAAMOVDHALCMPAL60JNEN1MOVDH0MOVALCHADDAL1DAAMOVCHALCMPAL24JNEN1MOVCH0N1:JMPAGAINSTARTENDPDELAYPROCPUSHBXPUSHCXMOVBL50DEL20:MOVCX762LOP1:LOOPLOP1DECBLJNZDEL20POPCXPOPBXRETDELAYENDPCODEENDSENDBEGIN第6章
6.1若有一单板机,具有用8片2114构成的4KRAM,连线如图2所示(说明此图用原习题集中的图2)图2若以每1KRAM作为一组,则此4组RAM的基本地址是什么地址有没有重叠区,每一组的地址范围为多少[解]RAM的基本地址为第一组0000~03FFH第二组4000~43FFH第三组8000~83FFH第四组C000~C3FFH地址有重叠区每一组的地址范围为000~3FFH(1024个字节)
6.2若某一单板机的存储器连线如图3所示(说明此图用原习题集中的图3)图3其中地址译码器的输出与输入编码之间的关系如下表所示A15-A11译码器输出A15-A11译码器输出00111001100010100100Y7未用Y6未用Y6RAM2选择Y4RAM1选择00111000100000100000Y3未用Y2PROM2选择Y1PROM1选择Y0ROM选择分析图上的ROM、PROM
1、PROM2和各组RAM1K为一组的地址范围;每一种存储器的地址有没有重叠,重叠区是什么[解]ROM0000~07FFHPROM10800~0FFFHPROM21000~17FFHRAM1(第1组)2000~23FFH(第2组)2400~27FFHRAM2(第3组)2800~2BFFH(第4组)2C00~2FFFH每一种存储器的地址都没有重叠,重叠区是指一个存储单元出现多个地址的现象
6.3在题
6.2中,若用2114片子扩展4KRAM有没有可能片子的各引线应如何连接[解]用2114片子扩展4KRAM是可能的新扩展的8片2114芯片的地址线和数据线的连接方法与图3中原有的2114芯片完全相同,只是组选择信号的连接不同而已如可以安排新1组RAM的组选择(A15~A10)001100新2组RAM的组选择(A15~A10)001101新3组RAM的组选择(A15~A10)001110新4组RAM的组选择(A15~A10)
0011116.4若要扩充1KRAM用2114片子,规定地址为8000-83FFH,地址线应如何连接[解]扩充1KRAM至规定地址8000~83FFH,其地址线的低10位接芯片,高6位地址(A15~A10=100000)产生组选择信号
6.5若要用2114片子扩充2KRAM,规定地址为4000-47FFH,地址线应如何连接[解]扩充2KRAM至规定地址4000~47FFH,则把它们分为两组,它们的地址线的低10位接芯片,高6位地址产生两组译码输出A15~A10=100000和100001产生两组选择信号
6.6如何检查扩展的RAM工作是否正常[解]可以编一个程序向RAM写一个数,然后再从RAM读出检查是否相等
6.7编一个简单的RAM检查程序,此程序能记录有多少个RAM单元工作有错,且能把出错的RAM单元的地址记录下来[解]NAMERAMCKDATA1SEGMENTRAM1DB1024DUPADERRDB2050DUPDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVAL05MOVCX1024LEASIRAM1MOVDISILEABXADERR+2MOVDX0CLDREPSTOSBMOVCX1024CK1:LODSBCMPAL05JEN1INCDXDECSIMOV[BX]SIINCSIINCBXINCBXN1:LOOPCK1MOVADERRDXRETSTARTENDPCODEENDSENDBEGIN
6.8若有型号为2142的1024×4bit静态RAM片子,其方框图、读出和写入的时序如图4,图5和图6所示若与8088CPU相配合构成2KRAM分析此存储器与CPU如何连线(说明此图用原习题集中的图4)图4静态RAM芯片2142的方框图(说明此图用原习题集中的图5)图5静态RAM芯片2142的读出时序(说明此图用原习题集中的图6)图6静态RAM芯片2142的写入时序[解]把2K2142分为两组,每页为1KRAM2142的10条地址线直接带地址总线地址的高6位A15~A10经译码分别接至CS1#,CS2接至电源,WE#端接CPU的WR#输出存储器不禁止输出,则OD端接地第7章
7.1外部设备为什么要通过接口电路和主机系统相连[解]因为外部设备种类繁多,输入信息可能是数字量、模拟量或开关量,而且输入速度、电平、功率与CPU差距巨大所以,通常要通过接口电路与主机系统相连
7.2接口电路的作用是什么按功能可分为几类[解]接口电路使主机与不同种类的设备、不同信号类型、不同工作速度与不同电平与功率的外部设备正确连接,保证信息的正确传送接口电路按功能可分为并行接口电路和串行接口电路两大类
7.3数据信息有哪几类举例说明它们各自的含义[解]数据信息可分为三种基本类型1数字量由键盘等输入的信息是以二进制形式表示的数或以ASCII码表示的数或字符2模拟量当计算机用于控制时,大量的现场信息经过传感器把非电量例如温度、压力、流量、位移等等转换为电量,并经放大即得模拟电压或电流这些模拟量必须先经过A/D转换才能输入计算机位数由A/D转换的精度确定;计算机的控制输出也必须先经过D/A转换才能去控制执行机构3开关量这是一些两个状态的量,如电机的运转与停止,开关的合与断,阀门的打开和关闭等等这些量只要用一位二进制数即可表示,故字长8位的机器一次输入或输出可控制8个这样的开关量
7.4CPU和输入/输出设备之间传送的信息有哪几类[解]CPU和输入/输出设备之间传送的信息有:
1.数据Data在微型机中,数据通常为8位、16位或32位
2.状态信息Status在输入时,有输入设备的信息是否准备好Ready;在输出时有输出设备是否有空Empty,若输出设备正在输出信息,则以忙Busy指示等等
3.控制信息Control例如控制输入输出设备启动或停止等等
7.5什么叫端口通常有哪几类端口计算机对I/O端口编址时通常采用哪两种方法在8086/8088系统中,用哪种方法对I/O端口进行编址[解]端口是信息输入或输出的通路在计算机中用地址来区分不同的端口计算机对I/O端口编址时通常采用两种方法1存储器对应输入输出方式在这种方式中,把一个外设端口作为存储器的一个单元来对待,故每一个外设端口占有存储器的一个地址从外部设备输入一个数据,作为一次存储器读的操作;而向外部设备输出一个数据,则作为一次存储器写的操作2端口寻址的输入输出方式在这种工作方式中CPU有专门的I/O指令,用地址来区分不同的外设但要注意实际上是以端口Port作为地址的单元,因为一个外设不仅有数据寄存器还有状态寄存器和控制命令寄存器,它们各需要一个端口才能加以区分,故一个外设往往需要数个端口地址CPU用地址来选择外设8086/8088中采用端口寻址的输入输出方式
7.6为什么有时候可以使两个端口对应一个地址[解]若两个端口的数据传送方向不同,或两个端口所使用的信息,占用端口的不同位,则它们可对应同一个地址
7.7CPU和外设之间的数据传送方式有哪几种实际选择某种传输方式时,主要依据是什么[解]CPU和外设之间的数据传送方式主要有1查询传送方式2中断传送方式3直接数据通道传送(DMA)方式具体采用哪种传送方式,取决于数据传送的速度和数量当外部设备的信息传送速度较低或要求实时处理时,采用中断方式;当外设速度与CPU相当时,用查询方式;当要求传送速度快且是批量传送时,采用DMA方式
7.8条件传送方式的工作原理是怎样的主要用在什么场合画出条件传送查询方式输出过程的流程图[解]条件传送方式(即查询方式),主要是在数据传送前,先查询传送的条件是否满足(输入的信息是否已就绪;输出设备是否忙)若未满足就继续查询当查询到条地满足时,就进行数据传送主要用于输入输出信息的速度与CPU的速度相当的场合流程图如下
7.9设一个接口的输入端口地址为0100H,而它的状态端口地址为0104H,状态端口中第5位为1表示输入缓冲区中有一个字节准备好,可输入设计具体程序实现查询式输入[解]查询输入的程序段为POL1:INAL0104HANDAL20HJZPOL1INAL0100H
7.10查询式传送方式有什么优缺点中断方式为什么能弥补查询方式的缺点[解]查询方式是程序不停地主动输入状态信息进行查询优点是保证在条件具备时才进行输入或输出,传送可靠但若输入速度较慢,则CPU的大量时间用于查询等待,而只有较少的时间实现输入输出使得CPU的效率很低中断方式是在程序启动输入输出过程后,程序不等待,继续执行直至外部设备条件具备后,由外设通过中断信号通知CPU,条件已经具备,则CPU暂停程序的执行,处理输入输出工作故CPU的效率高
7.11和DMA方式比较,中断传输方式有什么不足之处[解]中断传送仍是由CPU通过程序来传送,每次要保护断点,保护现场需用多条指令,每条指令要有取指和执行时间这对于一个高速I/O设备,以及成组交换数据的情况,例如磁盘与内存间的信息交换,就显得速度太慢了所以希望用硬件在外设与内存间直接进行数据交换DMA而不通过CPU,这样数据传送的速度的上限就取决于存储器的工作速度但是,通常系统的地址和数据总线以及一些控制信号线例如IO/M#、RD#、WR#等是由CPU管理的在DMA方式时,就希望CPU把这些总线让出来即CPU连到这些总线上的线处于第三态——高阻状态,而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束等信号这些都是由硬件实现的
7.12叙述用DMA方式传输单个数据的全过程[解]用DMA方式传输单个数据的过程为1当要传送数据时,向CPU发出HOLD信号,向CPU发出DMA请求信号2当CPU接收到HOLD信号,在当前总线周期结束时,CPU向外设发出DMA请求的响应信号HLDADMA控制器接收到HLDA信号后,接管对总线的控制,进入DMA方式3DMA控制器发出地址信息,对存储器寻址4DMA控制器能发出读或写等控制信号,读或写数据5读或写数据后,向CPU发出DMA结束信号,使CPU恢复正常工作状态
7.13DMA控制器的地址线为什么是双向的什么时候往DMA控制器传输地址什么时候DMA控制器往地址总线传输地址[解]A0~A3地址,输入/输出——这四条最低4位地址线是双向三态信号线在空闲周期,这四条是地址输入线,CPU用这四条地址线选择8237内部不同的寄存器在DMA传送时,由这四条线输出要访问的存储单元的最低4位地址A4~A7地址,输出——这是四条三态的地址输出线,只用于DMA传送时,由它们输出要访问的存储单元地址低8位中的高4位
7.14在设计DMA传输程序时,要有哪些必要的程序模块设计一个用DMA方式实现数据块输出的程序段[解]要进行DMA传送,需要启动DMA请求、等待CPU的DMA响应,然后就是数据传送(这是主体部分),数据传送完成后就要结束DMA工作用DMA方式实现数据块输出的程序流程图如下
7.15在查询方式、中断方式和DMA方式中,分别用什么方法启动数据传输过程[解]查询方式在要进行数据输入输出的程序中,用程序查询条件,当条件满足时,程序输入或输出数据在中断方式,由中断请求信号,使CPU转至中断服务程序,在中断服务程序中完成数据传统在DMA方式中,DMA控制器向CPU发出DMA请求,CPU响应DMA请求后,由DMA控制器启动和完成数据传送
7.16若有一个CRT终端,它的输入输出数据的端口地址为01H,状态端口的地址为00H,其中D7位为TBE,若其为1,则表示发送缓冲区空,CPU可向它输出新的数据;D6位为RDA,若其为1,则表示输入数据有效,CPU可把它输入1编一个程序,从终端上输入100个字节的字符,送到以BUFFER开始的内存缓冲区中去2若已有一个能用查询方法从键盘输入一个字符放于累加器A中的子程序GETCH,利用此子程序,完成上题中提出的要求3编一个程序,把内存中自BLOCK开始的100个字节的数据块,通过终端显示4若已有一个能用查询方式,把累加器AL中的字符输出的子程序PUTCH,利用此子程序,完成题3中的要求5编一个程序,能从终端上输入一个字符,放入寄存器CL6编一个程序,使能把在寄存器CL中的一个字符输出给终端7编一个程序,能把内存中以STRING开始的一个字符串以′$′字符作为结束标志通过终端输出8编一个程序,利用子程序PUTCH实现题7的要求9编一个程序,能从终端输入一个字符串以回车键作为字符串的结束标志放到内存中以BUFFER开始的缓冲区10编一个程序,先向终端输出一个提示符′>′,表示要求输入一个十进制数;然后能从终端上输入一个带符号的最多为5位的十进制数但数值范围在±32768以内,以非数字字符作为输入的十进制数的结束标志,把这个十进制数连同符号放至内存中以DATA开始的缓冲区高位在前11条件及要求同题10,在输入十进制数的程序中,允许输入的十进制数码多于5个,但程序中取后输入的5个12编一个程序,能把累加器A中的八位带符号二进制数,以十进制数形式输出注意在终端上输入输出的字符都以ASCII码表示13编一个程序,把在AX寄存器中的16位带符号二进制数,以十进制数的形式输出[解]下面大部分只给出了相应的程序段1LEABXBUFFERMOVCX100POL1:INAL00HANDAL40HJEPOL1INAL01HMOV[BX]ALINCBXLOOPPOL12LEABXBUFFERMOVCX100POL1:CALLGETCHMOV[BX]ALINCBXLOOPPOL13LEABXBLOCKMOVCX100POL1:INAL00HANDAL80HJEPOL1MOVAL[BX]OUT01H,ALINCBXLOOPPOL14LEABXBLOCKMOVCX100POL1:CALLPUTCHINCBXLOOPPOL15POL1:INAL00HANDAL40HJEPOL1INAL01HMOVCLAL6POL1:INAL00HANDAL80HJEPOL1MOVALCLOUT01HAL7LEABXSTRINGPOL1:INAL00HANDAL80HJEPOL1MOVAL[BX]CMPAL’$’JEN1OUT01HALINCBXJMPPOL1N1:OUT01HALRET8LEABXSTRINGPOL1:CALLPUTCHMOVAL[BX]CMPAL’$’JEN1OUT01HALINCBXJMPPOL1N1:OUT01HALRET9LEABXBUFFERPOL1:INAL00HANDAL40HJEPOL1INAL01HCMPAL’CR’JEN1MOV[BX]ALINCBXJMPPOL1N1:MOV[BX]ALRET10NAMEGET_DECIMALDATA1SEGMENTDATADB6DUPDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVDL’’MOVAH2INT21HLEABXDATAMOVAH10INT21HLOP1:MOVAL[BX]CMPAL’+’JEN1CMPAL’-’JEN1CMPAL30HJLN2CMPAL39HJGN2ANDAL0FHMOV[BX]ALINCBXJMPLOP1N1:MOV[BX]ALINCBXJMPLOP1N2:RETSTARTENDPCODEENDSENDBEGIN11NAMEGET_DECIMALDATA1SEGMENTDATADB6DUPBUFFERDB10DUPDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVDL’’MOVAH2INT21HLEABXDATAMOVAH10INT21HLEASIBUFFERMOVDL0LOP1:MOVAL[BX]CMPAL’+’JEN1CMPAL’-’JEN1CMPAL30HJLN2CMPAL39HJGN2ANDAL0FHINCDLMOV[SI]ALINCSIINCBXJMPLOP1N1:MOV[BX]ALINCBXJMPLOP1N2:CMPDL5JLELOP2MOVDL5LOP2:MOVAL[SI-1]MOV[BX-1]ALDECSIDECBXDECDLJNZLOP2RETSTARTENDPCODEENDSENDBEGIN
7.17试说明在DMA方式时内存往外设传输数据的过程[解]当CPU响应DMA请求发出HLDA信号后,DMA控制器接受对总线的控制,向地址线发生要寻址的内存的地址,并发出读/写控制信号把内存的数据输分至外设然后判断是否已传送完若未完,修改内存地址,重复输出过程直至输出完成,结束DMA请求
7.18对一个DMA控制器的初始化工作包括哪些内容[解]DMA控制器的初始化工作包括1输出主清除命令2写入基与现行地址寄存器3写入基与现行字节数寄存器4写入模式寄存器5写入屏蔽寄存器6写入命令寄存器7写入请求寄存器若有软件请求,就写入至指定通道,就可以开始DMA传送的过程若无软件请求,则在完成了1~6的编程后,由通道的DREQ启动DMA传送过程
7.19DMA控制器8237A什么时候作为主模块工作什么时候作为从模块工作在这两种情况下,各控制信号处于什么状态,试作说明[解]除了在级连方式,作为第二级或其后级时,8237工作在从模式其他情况下都工作在主模式在级连情况下,第一级只起优先权网络的作用,除了由某一个二级的请求向CPU输出HRQ信号外,并不输出任何其它信号实际的操作是由第二级的片子完成的若有需要还可由第二级扩展到第三级等等
7.208237A有哪几种工作模式各自用在什么场合[解]
1.单字节传送模式这种模式是编程为一次只传送一个字节数据传送后字节计数器减量,地址要相应修改增量或减量取决于编程HRQ变为无效,释放系统总线若传送使字节数减为0,TC发生或者终结DMA传送,或重新初始化
2.块传送方式在这种传送方式,8237由DREQ启动就连续地传送数据,直至字节数计数器减到零产生TCTerminalCount,或者由外部输入有效的EOP#信号来终结DMA传送
3.请求传送方式在这种工作方式下,8237可以进行连续的数据传送当出现以下三种情况之一时停止传送
①字节数计数器减到0,发生TC;
②由外界送来一个有效的EOP#信号;
③外界的DREQ信号变为无效外设的数据已传送完
4.级连方式这种方式用于通过级连以扩展通道第二级的HRQ和HLDA信号连到第一极的DREQ和DACK上
7.21什么叫DMA控制器的自动预置功能这种功能是用得很普遍的,举一个例子说明它的使用场合[解]自动预置功能即自动初始化功能,即若在模式寄存器的编程中允许自动初始化,则在每次EOP#后,现行地址寄存器初始化为它的初始值即保存在基地址寄存器中的值现行字节数寄存器它自动初始化至它的起始状态(即保存在基字节数寄存器中的值)这种功能使用在从一内存地址传送相同字节数的场合
7.22用DMA控制器进行内存到内存的传输时,有什么特点[解]8237可以编程工作在存储器到存储器传送这时就要用到两个通道,通道0的地址寄存器编程为源区地址;通道1的地址寄存器编程为目的区地址,字节数寄存器编程为传送的字节数传送由设置一个通道0的软件DREQ启动,8237按正常方式向CPU发出DMA请求信号HRQ,待CPU用HLDA信号响应后传送就可以开始,每传送一个字节要用8个时钟周期,4个时钟周期以通道0为地址从源区读数据送入8237的临时寄存器;另4个时钟周期以通道1为地址把临时寄存器中的数据写入目的区每传送一个字节,源地址和目的地址都要修改可增量也可以减量修改,字节数减量传送一直进行到通道1的字节数计数器减到零,产生TC引起在EOP#端输出一个脉冲,结束DMA传送
7.23DMA控制器8237A是怎样进行优先级管理的[解]8237有两种优先权方式可供选择,一种是固定优先权,在这种方式下通道的优先权是固定的,通道0的优行权最高,通道3的优先权最低;另一种方式是优先权旋转,在这种方式下刚服务过的通道的优先权变为最低的,其他通道的优先权也作相应的旋转
7.24设计8237A的初始化程序;8237A的端口地址为0000一000FH,设通道0工作在块传输模式,地址加1变化,自动预置功能;通道l工作于单字节读传输,地址减1变化,无自动预置功能;通道
2、通道3和通道l工作于相同方式然后对8237A设控制命令,使DACK为高电平有效,DREQ为低电平有效,用固定优先级方式,并启动8237A工作[解]若高四位经译码连至cs#的地址为5OUT5DHALMOVAL94HOUT5BHALMOVAL75HOUT5BHALMOVAL76HOUT5BHALMOVAL77HOUT5BHALMOVAL00HOUT5AHALMOVAL0E0HOUT58HAL第8章
8.1在中断响应过程中,8086往8259A发的两个INTA#信号分别起什么作用[解]CPU发出的第一个脉冲告诉外部电路,其提出的中断请求已被响应,应准备将类型号发给CPU,8259A接到了这个脉冲时,把中断的最高优先级请求置入中断状态寄存器(ISR)中,同时把IRR中的相应位复位CPU发出的第二个脉冲告诉外部电路将中断的类型号放在数据总线上
8.28086最多可有多少级中断按照产生中断的方法分为哪两大类[解]8086最多可以有256种中级按产生中断的方法,可分为内部中断(软件中断)和外部中断两大类
8.3非屏蔽中断有什么特点可屏蔽中断有什么特点分别用在什么场合[解]非屏蔽中断不受CPU中断标志的影响,无论中断标志是允许中断或禁止中断,在非屏蔽中断引线上的中断请求,CPU在当前指令执行完以后,都要响应此中断可屏蔽中断则受中断标志影响,只是在开中断(允许中断)情况下,CPU才响应可屏蔽中断非屏蔽中断,使用在CPU必须要响应的场合,例如电源故障
8.4什么叫中断向量它放在哪里对应于1CH的中断向量存放在哪里如果1CH的中断处理子程序从5110H2030H开始,则中断向量应怎样存放[解]中断向量是区分不同中断和获取相应的中断服务程序的一个字节的量它或是由CPU产生(对于软件中断)或由外设在中断响应周期输送至CPU的8086在内存的前1K字节有一个中断向量表,存放最多为256个中断服务程序的入口题中的中断在中断向量表中的存放如图7所示图7中断向量的存放
8.5从8086/8088的中断向量表中可以看到,如果一个用户想定义某个中断,应该选择在什么范围[解]应在向量32~256之间选择
8.6非屏蔽中断处理程序的入口地址怎样寻找[解]CPU已经给定非屏蔽中断的中断向量为2由中断向量2从中断向量表中查找
8.7叙述可屏蔽中断的响应过程,一个可屏蔽中断或者非屏蔽中断响应后,堆栈顶部四个单元中是什么内容[解]CPU响应可屏蔽中断的过程为1关中断8086在CPU响应中断后,发出中断响应信号INTA#的同时,内部自动地实现关中断2保留断点CPU响应中断,封锁IP+1,且把IP和CS推入堆栈保留,以备中断处理完毕后,能返回主程序3保护现场为了使中断处理程序不影响主程序的运行,故要把断点处的有关的各个寄存器的内容和标志位的状态,推入堆栈保护起来8086是由软件即在中断服务程序中把要用到的寄存器的内容用PUSH指令推人堆栈4给出中断入口,转入相应的中断服务程序8086是由中断源提供的中断矢量形成中断入口地址即中断服务程序的起始地址在中断服务程序完成后,还要做下述的
5、6两步5恢复现场把所保存的各个内部寄存器的内容和标志位的状态,从堆栈弹出,送回CPU中的原来位置这个操作在8086中也是由服务程序中用POP指令来完成的6开中断与返回在中断服务程序的最后,要开中断以便CPU能响应新的中断请求和安排一条返回指令,将堆栈内保存的IP和CS值弹出,运行就恢复到主程序CPU响应中断要保护断点,故堆栈顶部的内容为IP和CS
8.8一个可屏蔽中断请求来到时,通常只要中断允许标志为l,便可在执行完当前指令后响应,在哪些情况下有例外[解]若中断标志为0,即禁止中断,则CPU就不响应可屏蔽中断或此中断有屏蔽设置,屏蔽此中断
8.9在编写中断处理子程序时,为什么要在于程序中保护许多寄存器[解]因为在用户程序运行时,会在寄存器中有中间结果,当在中断服务程序中要使用这些寄存器前要把这些寄存器的内容推至堆栈保存(称为保护现场)在从中断服务程序返回至用户程序时把这些内容从堆栈恢复至寄存器中(称为恢复现场)
8.10中断指令执行时,堆栈的内容有什么变化中断处理子程序的入口地址是怎样得到的[断]因为要保护现场,故堆栈中会保存现场的内容中断处理子程序的入口地址是由中断向量从中断向量表中获取
8.11中断返回指令IRET和普通子程序返回指令RET在执行时,具体操作内容有什么不同[解]因为在响应中断时,CPU除了保护断点外,还要保护标志寄存器所以,IRET指令要恢复断点和标志寄存器
8.12若在一个系统中有五个中断源,他们的优先权排列为
1、
2、
3、
4、5,他们的中断服务程序的入口地址分别为3000H、3020H、3050H、3080H、30A0H编一个程序,当有中断请求CPU响应时,能用查询方式转至申请中断的优先权最高的源的中断服务程序[解]若五个中断源的中断请求放在一中断状态寄存器中,按优先权分别放在状态的位7(优先权最高)至位3中查询方法的程序段为INALSTATUSCMPAL80HJNEN1JMP3000HN1:INALSTATUSCMPAL40HJNEN2JMP3020HN2:INSTATUSCMPAL20HJNEN3JMP3050HN3:INSTATUSCMPAL10HJNEN4JMP3080HN4:INSTATUSCMPAL08HJNEN5JMP30A0HN5:RET
8.13设置中断优先级的目的是什么[解]若有多个外设同时请求中断,它们之间是有轻重缓急的,设置中断优先级就能使CPU按轻重缓急要求响应中断而且,设置了中断优先级可以使优先级高的中断优先级低的中断处理,实现中断嵌套
8.14软中断两字节INTN指令的功能调用与子程序调用有何异同[解]软中断的功能与子程序调用相当只是子程序是调用用户程序,而软中断是调用系统程序
8.15可编程中断控制器8259A在中断处理时,协助CPU完成哪些功能[解]8259A有中断请求寄存器、优先权电路和中断在服务寄存器,可接收多个中断请求以及优先权处理8259A还可以对每个中断源进行屏蔽
8.168259A具有哪些中断操作功能指出与这些功能相对应的控制字ICW/OCW的内容[解]ICW1的D4必须为1D0确定是否送ICW4,若根据选择ICW4的各位应为0,则可令D0位即IC4为0,则不送ICW4D1位SNGL,规定系统中是单片8259A工作还是级连工作D2位ADI,规定CALL地址的间隔,D2=1,则间隔为4,这适用于建立一个转移指令表;D2=0,则间隔为8D3位LTIM,规定中断请求输入线的触发方式,D3=1为电平触发方式,此时边沿检测逻辑断开;D3=0则为边沿触发方式ICW2当应用于8088/8086系统中时,ICW2的D7~D3用以确定中断向量的T7~T3,此时ICW2的D2~D0位无用ICW3用于8259A的级连,若系统中只有一片8259A,则不用ICW3;若有多片8259A级连,则主8259A和每一片从8259A都必须用ICW38259A最多允许有一片主8259A和8片从8259A,使中断源扩展至64个主和从8259A的ICW3有所不同,对于主8259A由SP#=1或由ICW4中的M/S=1规定在缓冲方式所决定,ICW3的每一位对应于一片从8259A,即若有一片从8259A,则可令ICW3的S0=1,别的位全为0;若有两片从8259A,则可令S0=1S1=1,别的位全为0……若是从8259A,则ICW3中只有低三位bit2-0作为这个从8259A的标识符ID,高5位全为0在中断响应周期中,主8259A通过级连线输送申请中断的源中优先权最高的源所在的从8259A的标识符,每个从8259A拿这个标识符与自己编程时ICW3中所规定的标识符相比较,只有两者相符合的这片从8259A,能在下个中断响应周期输送入一个字节的中断向量ICW4的D0位μPM,用于规定所用的微处理器μPM=0,则规定8259A用于MCS-80/85系统中;若μPM=1,则规定用于MCS-86系统中D1位AEOI,规定结束中断的方式,若AEOI=1,则为自动结束中断方式D2位M/S,它与D3位BUF配合使用,若BUF=1,选择为缓冲模式,则M/S=1确定为主8259A;若M/S=0,则为从8259A若BUF=0,则M/S位不起作用D3位BUF,若BUF=1,则为缓冲模式,此时SP#/EN#变为允许输出线,同时由M/S确定是主还是从8259AD4位SFNM,若SFNM=1,则规定为特殊的全嵌套模式OCW1是中断屏蔽命令字,命令字的每一位,可以对相应的中断请求输入线进行屏蔽OCW1的某一位为“1”则相应的输入线被屏蔽;若某一位为“0”,则相应的输入线的中断就允许OCW2说明了R、SL、EOI三位的功用,它们的不同组合决定了几种不同的工作方式在其中的三种工作方式中要用到OCW2的最低三位即L
2、L
1、L0,这三位二进制编码决定了8个中断源的某一个被SEOI信号复位,或规定某一个的优先权最低D
4、D3为00是写入OCW2的标志OCW3的最低两位决定下一个操作是否为读操作RR=1,以及是读中断请求寄存器IRR若RIS=0,还是读中断服务寄存器ISR若RIS=1D2位P,决定是查询命令P=1,还是非查询命令P=0D
4、D3位为01为写入OCW3的标志D
6、D5这两位决定是否工作于特殊屏蔽模式,当D
6、D5为11时,则允许特殊屏蔽模式;而D
6、D5为10时撤除特殊屏蔽模式返回正常的屏蔽模式若D6位ESMM=0,则D5位SMM不起作用
8.17什么是中断响应周期在中断响应中8086CPU和8259A一般完成哪些工作[解]中断响应周期是从用户程序至中断服务程序的过渡周期在第一个中断响应周期,8259A确定中断的优先级,在第二个中断响应周期,8259A送出中断向量,CPU获取此向量转至中断服务程序的入口
8.18若有一中断源,当其有中断请求时,要求CPU把一个100个字节的数据块从AREA1开始的存储区传送至AREA2开始的存储区要求编出主程序与中断有关的部分,中断服务程序所有程序的入口地址包括中断服务程序入口地址表由伪指令给定具体的值可由自己指定[解]假定中断向量为100,中断服务程序的入口为2000:1000NAMEINT_1DATA1SEGMENTORG0000HINT_TDDX1X2…X99DW10002000AREA1:DBD1D2…D100AREA2:DB100DUPDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSORG2000:0000HCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXSTIHERE:JMPHERE...RETSTARTENDPORG1000HINT_SPROCPUSHAXPUSHSIPUSHBXPUSHCXMOVCX100LEASIAREA1LEABXAREA2LOP1:MOVAL[SI]MOV[BX]ALINCSIINCBXLOOPLOP1POPCXPOPBXPOPSIPOPAXIRETINT_SENDPCODEENDSENDBEGIN
8.19若在内存中自7000H单元开始有一个1000个字节的信息组要存入磁盘存入磁盘的操作是在中断服务程序中完成的,但磁盘的写入每次只写入一个记录即128字节;且是从指定的磁盘缓冲区例如起始地址为0080H把信息写入磁盘的所以在每次写入磁盘以前,要把一个记录的信息从它所在的存储区传送至磁盘缓冲区编出中断服务程序中能起这样传送作用的程序段[解]NAMEINT_2DATA1SEGMENTORG0080HBUFFERDB128DUPORG7000HAREA1:DBD1D2…D1000DATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVESAXSTIHERE:JMPHERE...RETSTARTENDPINT_SPROCPUSHSIPUSHDIPUSHCXMOVCX128LEASIAREA1LEADIBUFFERCLDREPMOVSBCALLWRDISKPOPCXP0PDIPOPSIIRETINT_SENDPCODEENDSENDBEGIN
8.20若要把磁盘上一个1K字节的文件读入内存自7000H开始的存储区中读盘的操作是在中断服务程序中完成的,但读盘每次读入一个记录128字节放在磁盘缓冲区中所以在每次读入一个记录后,要把信息自磁盘缓冲区传送至它的存储区编出中断服务程序中能完成这样传送的程序段[解]NAMEINT_3DATA1SEGMENTORG0080HBUFFERDB128DUPORG7000HAREA1:DB1024DUPDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVESAXSTIHERE:JMPHERE...RETSTARTENDPINT_SPROCPUSHSIPUSHDIPUSHCXCALLRDDISKMOVCX128LEASIBUFFERLEADIAREA1CLDREPMOVSBPOPCXP0PDIPOPSIIRETINT_SENDPCODEENDSENDBEGIN
8.218086有哪几种中断?哪些是硬件中断?哪些是软件中断?[解]8086有两类中断软件中断——由指令的执行所引起的;硬件中断——由外部主要是外设的请求所引起的
1.外部中断8086有两条外部中断请求线NMI——NonMaskableInterrupt非屏蔽中断和INTR可屏蔽中断
2.内部中断8086可以有几种产生内部中断的情况1DIV或IDIV指令2INT指令3INTO指令4单步执行
8.22什么是8086的中断向量?中断向量表是什么?8086的中断向量表放在何处?[解]8086的中断向量是区分不同中断和获取相应的中断服务程序的一个字节的量它或是由CPU产生(对于软件中断)或由外设在中断响应周期输送至CPU的中断向量表是存放256个中断服务程序入口的跳转表,由中断向量从表中取出相应的中断服务程序的入口8086在内存的前1K字节有一个中断向量表,存放最多为256个中断服务程序的入口
8.238259A的初始化命令字和操作命令字有什么差别它们分别对应于编程结构中哪些内部寄存器[解]8259A的初始化命令字是使8259A在开始工作前处在正确的起始状态初始化命令主要规定8259A的工作模式和中断向量初始化命令字写至ICW1~ICW48259A操作命令字主要用于规定8259A的工作方式,如·中断屏蔽·结束中断·优先权旋转·中断状态工作命令字可在8259A已经初始化以后的任何时间写入
8.248259A的中断屏蔽寄存器IMR和8086/8088的中断允许标志IF有什么差别在中断响应过程中,它们怎样配合起来工作[解]8086/8088的中断允许标志IF,用于确定是否允许或禁止可屏蔽中断多个外设都可以连至CPU的可屏蔽中断输入线利用8259A的中断屏蔽寄存器IMR可以对外设的中断请求,分别地予以屏蔽,增大了灵活性
8.258259A有几种结束中断处理的方式各自应用在什么场合除了中断自动结束方式以外,其他情况下如果没有在中断处理程序中发中断结束命令,会出现什么问题[解]当某一个中断源的服务完成时,必须给8259A一个中断结束命令,使这个源在ISR中的相应位复位否则,8259A就不是处在在正常的起始状态在不同的工作情况下,8259A可以有几种不同的给出中断结束命令的方法
①自动中断结束模式AEOI可以在ICW4中规定工作在这种模式,则在最后一个中断响应周期对于MCS-86为第二个的INTA#信号的后沿8259A自动地使中断源在ISR中的相应位复位这种方式显然只能用于不要求中断嵌套的情况下
②非自动中断结束方式EOI在这种工作方式下,当中断服务完成从中断服务程序返回之前,必须输送中断结束EOI命令若是工作在8259A级连的情况下,则必须送两个EOI命令,一个送给从8259A,另一个送给主8259A若是在特殊嵌套模式下,在送了第一个EOI命令后,必须经过检查确定这一片从8259A的所有申请中断的源都已经服务了,才向主8259A送出另一个EOI命令
8.268259A引入中断请求的方式有哪几种如果对8259A用查询方式引入中断请求,那会有什么特点中断查询方式用在什么场合[解]一片8259A有8个中断请求输入线有一条中断输出线,通过8259A的级连,最多可扩展为64个输入请求主8259A的中断输出线连至CPU的可屏蔽中断输入线若当外部中断源超过64个时,则8259A片子可工作在查询方式此时,在8259A的编程中,使OCW3的D2位P置为1程序中令CPU关中断,用查询对外设进行服务在令OCW3的D2位P置为1后的下一个读命令,8259A看作为中断响应信号,使最高优先权的ISR的相应位置位读命令从数据总线上读取一个字节,其内容为D7D6D5D4D3D2D1D0I————W2W1W0其中I=1,则表示此片8259A有中断请求,I=0则无中断,可查询别的片子在I=1时,W2~W0即为有中断请求的最高优先权源的编码
8.278259A的初始化命令字有哪些它们各自有什么含义哪几个应写入奇地址哪几个应写入偶地址[解]8259A的初始化命令字有四个,但并不是所有的初始化编和都要写此四个ICWICW1和ICW2是必须送的,而ICW3和ICW4是由工作方式来选择的ICW1的D4必须为1D0确定是否送ICW4,若根据选择ICW4的各位应为0,则可令D0位即IC4为0,则不送ICW4D1位SNGL,规定系统中是单片8259A工作还是级连工作D2位ADI,规定CALL地址的间隔,D2=1,则间隔为4,这适用于建立一个转移指令表;D2=0,则间隔为8D3位LTIM,规定中断请求输入线的触发方式,D3=1为电平触发方式,此时边沿检测逻辑断开;D3=0则为边沿触发方式D
7、D
6、D5这三位在8086中无用ICW2的D7~D3用以确定中断向量的T7~T3,此时ICW2的D2~D0位无用ICW3用于8259A的级连,若系统中只有一片8259A,则不用ICW3;若有多片8259A级连,则主8259A和每一片从8259A都必须用ICW3主和从8259A的ICW3有所不同对于主8259A由SP#=1或由ICW4中的M/S=1规定在缓冲方式所决定,ICW3的每一位对应于一片从8259A,即若有一片从8259A,则可令ICW3的S0=1,别的位全为0;若有两片从8259A,则可令S0=1S1=1,别的位全为0……若是从8259A,则ICW3中只有低三位bit2-0作为这个从8259A的标识符ID,高5位全为0在中断响应周期中,主8259A通过级连线输送申请中断的源中优先权最高的源所在的从8259A的标识符,每个从8259A拿这个标识符与自己编程时ICW3中所规定的标识符相比较,只有两者相符合的这片从8259A,能在下两个中断响应周期输送一个字节的中断向量ICW4的D0位μPM,用于规定所用的微处理器μPM=0,则规定8259A用于MCS-80/85系统中;若μPM=1,则规定用于MCS-86系统中D1位AEOI,规定结束中断的方式,若AEOI=1,则为自动结束中断方式D2位M/S,它与D3位BUF配合使用,若BUF=1,选择为缓冲模式,则M/S=1确定为主8259A;若M/S=0,则为从8259A若BUF=0,则M/S位不起作用D3位BUF,若BUF=1,则为缓冲模式,此时SP#/EN#变为允许输出线,同时由M/S确定是主还是从8259AD4位SFNM,若SFNM=1,则规定为特殊的全嵌套模式这些中ICW1偶数地址,而ICW
2、ICW3和ICW4是奇数地址
8.288259A的ICW2设置了中断类型码的哪几位说明对8259A分别设置ICW2为30H、38H、36H有什么差别[解]在8086系统中,ICW2规定了中断向量的高5位ICW2为30H和38H设置了两个不同的中断向量而36H与30H一样,是同一个向量
8.298259A通过ICW4可以给出哪些重要信息什么情况下不需要用ICW4什么情况下要设ICW4[解]ICW4确定所有的CPU、中断结束方式、缓存方式和嵌套方式若选择ICW4的各位为0,则可以不写ICW
48.30试按照如下要求对8259A设置初始化命令字系统中有一片8259A,中断请求信号用电平触发方式,下面要用ICW4,中断类型码为60H、61H、62H……67H,用特殊全嵌套方式,不用缓冲方式,采用中断自动结束方式8259A的端口地址为93H、94H[解]按题目的要求,ICW1为19H,ICW2为60H,ICW4为13H相应为程序段为MOVAL19HOUT94HALMOVAL60HOUT95HALMOVAL13HOUT95HAL
8.31怎样用8259A的屏蔽命令字来禁止IR3和IR5引腿上的请求又怎样撤消这一禁止命令设8259A的端口地址为93H、94H[解]除了初始化编程外,要屏蔽IR3和IR5有中断请求,需输出OCW1,屏蔽IR3和IR5的OCW1=28H撤销屏蔽的OCW1=00H相应的程序段为MOVAL28HOUT95HAL...MOVAL00HOUT95HAL
8.32试用OCW2对8259A设置中断结束命令,并使8259A按优先级自动循环方式工作[解]OCW2=40H
8.338086系统中,8259A采用了级连方式,试说明在主从式中断系统中8259A的主片和从片的连接关系[解]在级连方式下,外设的中断请求,连至从片的IR0~IR7,从片的INT输出线连至主片的IR0~IR7中的某一条所以,主8259A可与8个从片相连主片的INT输出线连至CPU的INTR端第9章
9.1定时与计数技术在微机系统中有什么作用[解]在控制系统中,常常要求有一些实时时钟以实现定时或延时控制,如定时中断、定时检测、定时扫描等等,也往往要求有计数器能对外部事件计数
9.28253有哪几种工作方式各有何特点其用途如何[解]方式0━计完最后一个数时中断,用于只计数一次方式1━—可编程序的单拍脉冲方式2━—速率发生器方式3━—方波速率发生器方式4━—软件触发选通方式5━—硬件触发选通方式
2、
4、5的输出波形是相同的,都是宽度为一个CLK周期的负脉冲但方式2是连续工作,方式4由软件设置计数值触发启动,而方式5由门控脉冲触发启动方式5硬件触发选通与方式1硬件再触发单拍脉冲,工作方式基本相同,但输出波形不同,方式1输出的为宽度是N个CLK脉冲的低有效脉冲计数过程中输出为低,而方式5输出的为宽度是1个CLK脉冲的负脉冲计数过程中输出为高
9.3在某一应用系统中,8253地址为340H~343H,定时器0用作分频器N为分频系数,定时器2用作外部事件计数器,如何编制初始化程序[解]定时器0用作分频器,工作在方式2,其初始化程序为MOVAL34HOUT343HALMOVALN1OUT342HALMOVALN2OUT342HAL定时器2用作外部事件计数器,工作在方式0,其初始化程序为MOVAL0B0HOUT343HALMOVALN1OUT342HAL`MOVALN2OUT342HAL
9.4若已有一频率发生器,其频率为1MHz,若要求通过8253,产生每秒一次的信号,8253应如何连接?编出初始化程序[解]1MHz的信号要变为每秒一次,则需经过106分频显然一个通道的计数为16位最大为65536故需两个通道级连则每个通道计数为1000用通道0和通道1级连都工作在方式2初始化程序为MOVAL34HOUT343HALMOVAL0E8HOUT342HALMOVAL03HOUT342HALMOVAL74HOUT343HALMOVAL0E8HOUT342HALMOVAL03HOUT342HAL
9.5条件同上,若要求每隔五秒钟产生一个正脉冲,8253应如何连接?编出初始仅程序[解]要求每隔五秒钟产生一个正脉冲,仍用两个通道级连,第一个通道计数为5000要求输出正脉冲,比较合适的方法是8253通道1的输出经过反相后得到初始化程序为MOVAL34HOUT343HALMOVAL13HOUT342HALMOVAL88HOUT342HALMOVAL74HOUT343HALMOVAL0E8HOUT342HALMOVAL03HOUT342HAL
9.68253计数器/定时器中,时钟信号CLK和门脉冲信号GATE分别起什么作用[解]CLK信号是8253的输入时钟信号,8253对CLK信号计数或分频GATE信号是8253的门控信号,控制8253是否计数在各种方式下,门控信号的作用如表3所示表3门控信号的作用方式功能GATE低或变为低上升沿高0计完最后一个数中断禁止计数—允许计数1硬件再触发单拍脉冲—
①启动计数
②下一个CLK脉冲使输出变低—2速率发生器
①禁止计数
②立即使输出为高
①重新装入计数值
②启动计数允许计数3方波速率发生器
①禁止计数
②立即使输出为高启动计数允许计数4软件触发选通禁止计数—允许计数5硬件触发选通—启动计数—
9.7说明8253在6种工作模式下的特点,并举例说明使用场合[解]见题
9.
29.88253工作于模式4和模式5时有什么不同[解]工作模式4与5的主要区别在于门控信号的控制作用在模式4,GATE应保持为“1”,由软件启动计数而模式5是由门控脉冲的上升沿触发启动计数
9.9编程将8253计数器O设置为模式1,计数初值为3000H;计数器1设置为模式2计数初值为2010H;计数器2设置为模式4,计数初值为4030H;计数器3设置为模式3,计数初值为5060H[解]若端口地址为F8H~FBH,初始化程序为MOVAL32HOUT0FBHALMOVAL00HOUT0F8HALMOVAL30HOUT0F8HALMOVAL74HOUT0FBHALMOVAL10HOUT0F8HALMOVAL20HOUT0F8HALMOVAL0B8HOUT0FBHALMOVAL30HOUT0F8HALMOVAL40HOUT0F8HALMOVAL0F6HOUT0FBHALMOVAL60HOUT0F8HALMOVAL50HOUT0F8HAL
9.10下面是一个8253的初始化程序段8253的控制口地址为46H,3个计数器端口地址分别为40H、42H、44H在8253初始化前,先将8259A的所有中断进行屏蔽,8259A的奇地址端口为81H请对下面程序段加详细注释,并以十进制数表示出各计数器初值INI CLIMOVAL,0FFHOUT81H,AL;屏蔽8259A的所有中断MOVAL,36H;通道0先输出低8位后输出高8位方式3二进制计数OUT46H,ALMOVAL,0OUT40H,ALMOVAL,40HOUT40H,AL;计数值为4000H
(1024)MOVAL,54H;通道1只写低8位方式2二进制计数OUT46H,ALMOVAL,18H;计数值为十进制24OUT42H,ALMOVAL,OB6H;通道2只先写低8位后写高8位方式3二进制计数OUT46H,ALMOVAL,46HOUT44H,ALMOVAL,80HOUT44H,AL
9.11下面是一个用8253作为定时器的发音程序,程序中已加了部分注释请对8253的有关程序段加上注释8253的控制口地址为46H,3个计数器端口地址分别为40H、42H、44H,8255A的B端口接扬声器驱动电路,B端口的地址为61HSOUND PUSHFCLIORDH,DH;DH中为发长音的个数JZK3;如不发长音,则转K3K1MOVBL,6;如发长音,则置长音计数器CALLBEEL;调用发音程序K2LOOPK2;两音之间留一点间隙DECDH;长音发完否JNZK1;否,则继续K3MOVBL,1;如发完长音,则置短音计数器CALLBEEL;调用发音程序K4LOOPK4;发音之间留一点间隙DECDL;继续发短音吗JNZK3;是,则继续K5LOOPK5;否,则留一个间隙POPF;标志恢复RET;返回BEEL MOVAL,B6H;通道2先输出低8位后输出高8位方式3二进制计数OUT46H,ALMOVAX,533HOUT44H,ALMOVAL,AH;计数值为533HOUT44H,ALINAL,61H;取扬声器驱动信息MOVAH,ALORAH,03;接通扬声器OUT61H,AL;扬声器驱动SUBCX,CX;一次发音时间定时K7LOOPK7;等待8253中断DECBL;BL中为发音计数值JNZK7;如未结束,则继续发音MOVAL,AH;如发音结束,则恢复B端口信息OUT61H,ALRET第10章
10.1接口部件的输入/输出操作具体对应哪些功能,举例说明[解]CPU总是通过接口电路Interface才能与外设连接所以,接口电路一边与CPU连接,另一边与外设连接在接口电路中要有输入输出数据的锁存器和缓冲器;要有状态如READY,BUSY等和控制命令的寄存器,以便于CPU与接口电路之间用应答方式程序查询式来交换信息,也便于接口电路与外设间传送信息接口电路中还要有端口的译码和控制电路;以及为了与CPU用中断方式交换信息所需要的中断请求触发器,中断屏蔽触发器,中断优先权排队电路和能向CPU发出中断矢量的电路等这样才能解决CPU的驱动能力问题、时序的配合问题和实现各种控制,保证CPU能正确地可靠地与外设交换信息
10.2从广义上说接口部件有哪些功能[解]从广义上说接口部件应有以下功能
1.两个或两个以上的具有锁存器或缓冲器的数据端口
2.每个数据端口都有与CPU用应答方式交换信号所必须的控制和状态信息;也有与外设交换信息所必须的控制和状态信息
3.通常每个数据端口还具有能用中断方式与CPU交换信息所必需的电路
4.选片和控制电路
5.通常这类接口片子可用程序选择数据端口;选择端口的传送方向输入或输出或双向;选择与CPU交换信息的方法查询或中断等等故片中要有能实现这些选择的控制字寄存器,它可由CPU用输出指令来写入
10.3在输入过程和输出过程中,并行接口分别起什么作用[解]在输入过程中并行接口主要起输入数据的锁存器作用在输出过程中并行接口主要起输出数据的缓冲器作用
10.48255A的3个端口在使用时有什么差别[解]通常端口A或B作为输入输出的数据端口(端口A还可以作为双向数据端口),而端口C作为控制或状态信息的端口,它在“方式”字的控制下,可以分成两个四位的端口每个端口包含一个四位锁存器它们分别与端口A和B配合使用,可用以作为控制信号输出,或作为状态信号输入
10.5当数据从8255A的端口C往数据总线上读出时,8255A的几个控制信号CS#、Al、AO、RD#、WR#分别是什么[解]这时,CS#=0A1=1A0=0RD#=0WR#=
110.68255A的方式选择控制字和置1/置0控制字都是写入控制端口的,那么,它们是由什么来区分的[解]用控制字的D7确定D7=1,写入的是方式控制字;而D7=0,写入的是按位置位/复位字
10.78255A有哪几种基本工作方式对这些工作方式有什么规定[解]8255A有三种基本的工作方式
1.方式0Mode0——基本输入输出
2.方式1Mode1——选通输入输出
3.方式2Mode2——双向传送
10.8对8255A设置工作方式,8255A的控制口地址为00C6H要求端口A工作在方式l,输入;端口B工作在方式0,输出;端口C的高4位配合端口A工作;低4位为输入[解]按要求的方式控制字为10111001B编程语句为MOVAL0B8HOUT00C6HAL
10.9设8255A的4个端口地址为00COH,00C2H,00C4H,00C6H,要求用置0/置1方式对PC6置1,对PC4置O[解]对端口CPC6置1的控制字为00001101B,对PC4置0的控制字为00001000B程序段为MOVAL0DHOUT00C6HALMOVAL08HOUT00C6HAL
10.108255A的方式0一般使用在什么场合在方式0时,如要使用应答信号进行联络,应该怎么办[解]8255A的方式0一般使用在普通的输入和输出,它没有固定的与外设之间的联络信号线若在方式0,要使用联络信号就可以利用端口C的一些引线来实现
10.118255A的方式1有什么特点参考教材中的说明,用控制字设定8255A的A口工作于方式1,并作为输入口;B口工作于方式1,并作为输出口,用文字说明各个控制信号假定8255A的端口地址为00COH,00C2H,00C4H,00C6H[解]8255A方式1的特点为
1.用作一个或两个选通端口
2.每一个端口包含有8位的数据端口三条控制线是固定指定的,不能用程序改变;提供中断逻辑
3.任一个端口都可作为输入或输出
4.若只有一个端口工作于方式1,余下的13位,可以工作在方式0由控制字决定
5.若两个端口都工作于方式1,端口C还留下两位,这两位可以由程序指定作为输入或输出,也具有置位/复位功能题中要求的方式控制字为10111100B,相应的初始化程序段为MOVAL0BCHOUT00C6HAL在方式1输入时,当外设的数据已经输至8255A的端口数据线上,用选通信号STB#把数据锁入8255A的输入锁存器,选通信号的宽度至少为500ns选通信号经过时间tSIB后,IBF信号有效,输给外设,阻止外设输入新的数据,也可供CPU查询;在选通信号结束后,经过tSIT向CPU发出INTR信号中断是允许的话CPU响应中断,发出RD#信号,把数据读入CPU在RD#信号有效后经过tRIT就清除中断请求,当RD#信号结束后,数据已读至CPU,使IBF变低表示输入缓冲器已空,通知外设可输入新的数据在方式1输出时,用在中断控制方式时,输出过程是由CPU响应中断开始的,在中断服务程序中,CPU输出数据和发出WR#信号,WR#信号一方面清除INTR经过时间tWIT,另外在WR#上升沿,使OBF有效,通知外设接受数据,实质上OBF信号是外设的一个选通命令在WR#上升沿后经过tWB时间数据就输出了,当外设接受数据后,发出ACK#信号,它一方面使OBF#无效经过tAOB,另一方面在ACK#的上升沿使INTR有效经过tAIT,发出新的中断请求
10.128255A的方式2用在什么场合说明端口A工作于方式2时各信号之间的时序关系[解]8255A的方式2主要用在要求通道双向工作的场合方式2各信号的时序是方式1的输入与输出方式的组合,故各个时间参数的意义也相同输出是由CPU执行输出指令给出I/OWR#信号开始的,输入是由选通信号开始的输入、输出的顺序是任意的,只要WR#在ACK#以前发生;STB#在RD#以前发生就行
10.13现有四种简单外设
①一组8位开关;
②一组8位LED指示灯;
③一个按钮开关;
④一个蜂鸣器要求1用8255A作为接口芯片,将这些外设构成一个简单的微机应用系统,画出接口连接图;2编制三种驱动程序,每个程序必须包括至少有两种外设共同作用的操作给出程序清单[解]1用8255A的端口B作为8位开关输入;端口A作为8位LED指示灯的输出;用PC0连至按钮开关;PC7输出接蜂鸣器接线如图8所示图8连线图2编制由开关输入经LED输出显示;按钮输入的L0显示和按钮输入,蜂鸣器响1秒的三种程序
①CODESEGMENTASSUMECS:CODESTARTMOVDX28BH;8255A控制端口地址MOVAL10000011B;端口A方式0输出,端口B方式0输入OUTDXALINOUT:MOVDX289H;端口B地址INALDX;从端口B输入MOVDX288H;端口A地址OUTDXALMOVDL0FFH;判断是否有按键MOVAH06HINT21HJZINOUT;若无,继续MOVAH4CH;否则,返回DOSCODEENDSENDSTART
②CODESEGMENTASSUMECS:CODESTARTMOVDX28BH;8255A控制端口地址MOVAL10000011B;端口A方式0输出,PC0输入OUTDXALINOUT:MOVDX28AH;端口C地址INALDX;从端口C输入MOVDX288H;端口A地址OUTDXAL;从端口A输出MOVDL0FFH;判断是否有按键MOVAH06HINT21HJZINOUT;若无,继续MOVAH4CH;否则,返回DOSCODEENDSENDSTART
③CODESEGMENTASSUMECS:CODESTARTMOVDX28BH;8255A控制端口地址MOVAL10000011B;端口PC7输出,PC0输入OUTDXALINOUT:MOVDX28AH;端口C地址INALDX;从端口C输入OUTDXAL;从端口C输出MOVBL50;延时1秒DEL20:MOVCX762LOP1:LOOPLOP1DECBLJNZDEL20MOVDL0FFH;判断是否有按键MOVAH06HINT21HJZINOUT;若无,继续MOVAH4CH;否则,返回DOSCODEENDSENDSTART第11章
11.1为什么串行接口部件中的4个寄存器可以只用1位地址来进行区分[解]串行接口部件中有两类端口,即控制(控制字和状态字)端口和数据端口,故要由地址来区分而控制端口的控制字和状态字,数据端口的发送和接收,都可由输入和输出来区分
11.2在数据通信系统中,什么情况下可以采用全双工方式,什么情况下可用半双工方式[解]若通信双方的接收和发送不需要同时进行,就可以用半双工方式否则,就要用全双工方式
11.3什么叫同步通信方式什么叫异步通信方式它们各有什么优缺点[解]同步通信是通信双方用相同的频率来发送和接收信息,且在数据块传送前用同步字符标志数据块而异步通信所传送的每个字符都需要用起始位标志信息的开始,用停止位标识字符的结束所以,在数据块传送时,适宜用同步传送
11.4什么叫波特率因子什么叫波特率设波特率因子为64,波特率为1200,那么时钟频率为多少[解]波特率因子是异步传送中采样信息的时钟频率与信号的波持率之比时钟频率=波特率因子×波特率=64×1200=76800Hz
11.5标准波特率系列指什么[解]标准波特率是指在异步通信中传统上常用的波特率,例如
50、
110、
300、
600、
1200、
2400、
4800、9600等
11.6设异步传输时,每个字符对应1个起始位、7个信息位、1个奇/偶校验位和1个停止位,如果波特率为9600,则每秒钟能传输的最大字符数为多少个[解]波特率是9600,则每位的时间为1/9600=
10.1ms,一个字符是10位,即传送一个字符约为100ms故每秒钟能传送10字符
11.7在RS—232—C标准中,信号电平与TTL电平不兼容,问RS—232—C标准的1和0分别对应什么电平RS—232—C的电平和TTL电平之间通常用什么器件进行转换[解]RS-232-C标准的“1”,为-12V而RS-232-C的“0”,为+12V它们通过芯片“1488”和“1489”与TTL电平相连
11.8从8251A的编程结构中,可以看到825lA有几个寄存器和外部电路有关一共要几个端口地址为什么[解]编程可看到的寄存器有控制字寄存器、命令字寄存器、状态字寄存器、发送器和接收器控制端口(控制字、命令字和状态字)和数据端口(发送器和接收器)是不同的端口地址在控制端口上,方式控制字和状态字是同一端口,由IN和OUT区分控制字和命令字是同一端口,又都是由CPU写入,它们由次序区分,在写入方式控制字后的写至控制端口的是命令字而发送器与接收器由数据端口的读和写区分
11.98251A内部有哪些功能模块其中读/写控制逻辑电路的主要功能是什么[解]整个8251可以分成5个主要部分接收器、发送器,调制控制,读写控制以及I/O缓冲器而I/O缓冲器由状态缓冲器,发送数据/命令缓冲器和接收数据缓冲器三部分组成8251的内部由内部数据总线实现相互之间的通信读/写控制逻辑对CPU输出的控制信号进行译码以实现CPU从8251A读数据和状态;CPU写数据和命令到8251A8251A是以READ#或WRITE#信号中的一个为“0”来实现I/O操作的若两者中无一为“0”,则8251A不执行I/O操作;若两者全为“0”,这是一种无确定结果的非法状态
11.10什么叫异步工作方式画出异步工作方式时8251A的TxD和RxD线上的数据格式[解]异步工作方式用一个起始位表示字符的开始,用停止位表示字符的结束构成一帧如图9所示超始位占用一位,字符编码可为5~8位,下一位为奇、偶校验位,加上这一位使字符中为“1”的位为奇数或偶数,停止位可以是一位,一位半或两位(说明图采用教材中的图11-2)图9异步通信的格式用这样的方式表示字符,则字符可以一个挨着一个传送在RxD线上接收异步数据时要用时钟信号采样,如图10所示(说明图采用教材中的图11-13)图10异步工作时的采样
11.11什么叫同步工作方式什么叫双同步字符方式外同步和内同步有什么区别画出双同步工作时825lA的TxD线和RxD线上的数据格式[解]同步方式时发送与接收方用同步时钟发送和接受信息为表示数据块的开始,用一个或两个(称为双同步字符)同步字符作为标志当接收方接收到规定的同步字符后,就用同步时钟接收数据外同步方式不是以同步字符作为数据块的开始,在外同步方式,在外同步信号有效后就开始接收数据双同步的数据格式如图11所示(说明此处的图用教材中的图11-4)图11双同步数据格式
11.128251A和CPU之间有哪些连接信号其中C/D#和RD#、WR#如何结合起来完成对命令、数据的写入和状态、数据的读出[解]在8251A与CPU中信息的传送如表4所示表48251A与CPU之间传送的信息CEC/D#READ#WRITE#功能000010101×0011×1100×CPU从USART读数据CPU从USART读状态CPU写数据到USARTCPU写命令到USARTUSART总线浮空无操作
11.138086/8088系统中,825lA的C/D#端应当和哪个信号相连,以便实现状态端口、数据端口、控制端口的读/写[解]8251A的C/D#端,通常接80860/8088的地址信号A0,以区分控制端口(A0=1)和数据端口(A0=0)
11.14825lA和外设之间有哪些连接信号[解]8251A与外设之间的接口信号有
①DTR#DataTerminalReady——数据终端准备好这是一个通用的输出信号,低电平有效它能由命令指令的bit1置“1”变为有效,用以表示CPU准备就绪
②DSR#DataSetReady——数据装置准备好这是一个通用的输入信号,低电平有效用以表示调制器或外设已准备好CPU可通过读入状态操作,在状态寄存器的bit7检测这个信号DTR#与DSR#是一组信号,通常用于接收器
③RTS#ReguestToSend——读求传送,这是一个输出信号等效于DTR#这个信号用于通知调制器CPU准备好发送可由命令指令的bit5置1来使其有效低电平有效
④CTS#ClearToSend——准许传送,这是调制器对USART的RTS#信号的响应,当其有效时低电平USART发送数据
⑤RxC#ReceiverClock——接收器时钟这个时钟控制USART接收字符的速度在同步方式,RxC#等于波特率,由调制解调器供给在异步方式,RxC#是波特率的1,16或64倍,由方式控制指令预先选择USART在RxC#的上升沿采样数据
⑥RxD#ReceiverData——接收器数据,字符在这条线上串行地被接收,在USART中转换为并行的字符高电平表示Mark即“1”
⑦TxC#TransmitterClock——发送器时钟,这个时钟控制USART发送字符的速度时钟速度与波特率之间的关系同RxC#数据在TxC#的下降沿由USART移位输出
⑧TxD#TransmitterData——发送器数据由CPU送来的并行的字符在这条线上被串行地发送高电平代表Mark即“1”
11.15为什么8251A要提供DTR#、DSR#、RTS#、和CTS#四个信号作为和外设的联络信号平常使用时是否可以只用其中两个或者全部不用要特别注意什么说明CTS#端的连接方法[解]为保证8251A与外设之间信息的可靠传送,所以提供四个联络信号其中,DTR#和DSR用于接收器的联络信号;RTS#和CTS#是用于发送器的联络信号为了可靠工作,这些信号都要用CTS#是外设做好了接收8251A输出的信号的准备,允许8251A发送的联络信号,由外设输送给8251A,低电平有效
11.168086系统中采取什么措施来实现8位接口芯片和低8位数据线的连接且满足对奇/偶端口地址的读/写这样做的道理是什么?[解]8251A是8位接口芯片,它与CPU之间传送8位数据所以,8251A的8位数据总线连至8086的低8位数据线8251与CPU之间的控制信息(方式字、命令字和状态字)和数据(发送和接收的数据)都是通过这8位数据总线传送的控制信息与数据是通过端口地址区分的信息是从CPU传送至8251还是从8251传送至CPU,是通过读/写信号区分的
11.17对8251A进行编程时,必须遵守哪些约定[解]由于8251A只有一个控制端口地址,方式字、同步方式的同步字和命令字都是写向同一个端口地址它们就用写的次序来区分先写方式字;若是同步方式,接着写一个或两个同步字符;然后(或在异步方式,在方式字之后)是命令字
11.188251A的模式字格式如何参照教材上给定格式编写如下模式字异步方式,1个停止位,偶校验,7个数据位,波特率因子为16[解]8251A的模式字格式如图12所示(此图用教材的图11-23)图128251A模式字按题中要求的模式字为01111010B
11.198251A控制字的格式如何参照教材上列出的格式给出如下控制字发送允许,接收允许,DTR#端输出低电平,TxD端发送空白字符,RTS#端输出低电平,内部不复位,出错标志复位[解]8251A的命令字如图13所示(此图用教材的图11-24)图138251A的命令字按题中要拔的命令字为00110111B
11.208251A的状态字格式如何哪几位和引腿信号有关状态位TxRDY和引腿信号TxRDY有什么区别它们在系统设计中有什么用处[解]8251A的状态字格式如图14所示(此图用教材的图11-25)图148251A的状态字其中的D
7、D
6、D2和D1与管脚同义状态寄存器的TxRDY,只要数据缓冲器一空就置位;而引脚TxRDY只能当条件数据缓冲器空·CTS#·TxEN成立时,才置位状态字的TxRDY用以反映数据缓冲器是否空而引脚TxRDY有效就能用于通知CPU,8251A已准备好接收一个数据当CPU与8251之间用查询方式Polling交换信息时,此信号可作为一个“状态”信号handshake;在用中断方式交换信息时,此信号可作为8251的一个中断请求信号
11.21参考初始化流程,用程序段对8251A进行同步模式设置奇地址端口地址为66H,规定用内同步方式,同步字符为2个,用奇校验,7个数据位[解]按题要求的方式字为00011000B相应的初始化程序段为MOVAL18HOUT67HALMOVALSYNC1OUT67HALMOVALSYNC2OUT67HAL
11.22设计一个采用异步通信方式输出字符的程序段,规定波特率因子为64,7个数据位,1个停止位,用偶校验,端口地址为40H、42H,缓冲区首址为2000H3000H[解]ORG2000HDATA1SEGMENTORG3000HBUFFERDBD1D2…DnDATA1ENDSSTACKSEGMENTPARASTACK’STACK’DB100DUPSTACKENDSCODESEGMENTASSUMECS:CODEDS:DATA1SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX0PUSHAXMOVAXDATAMOVDSAXMOVESAXMOVDX,41H;控制口地址MOVAL,01111011B;方式字异步、1个停止位、字符长度;为7位,偶校验,波特率因子为64OUTDX,ALMOVAL,37H;命令字RTS、RR、RxE、DTR;和TxEN均置1OUTDX,ALMOVCX,2DH;传送字节数MOVSI,3000H;发送区首地址L1MOVDX,309H;状态口地址INAL,DX;输入状态TESTAL,38H;检查三个出错标志位JNZERR;有错,转出错处理ANDAL,01HJZL1;发送未准备好,则等待MOVDX,40H;数据口地址MOVAL,[SI];取发送数据OUTDX,AL;输出INCSIDECCXJNZL1;未发送完,循环ERR略MOVAX,4C0OHINT21H;发送完返回DOSSTARTENDPCODEENDSENDBEGIN第12章数模D/A转换与模数A/D转换接口
12.1D/A转换器接口的任务是什么它和微处理器连接时,一般有哪几种接口形式[解]D/A转换器接口是要把CPU数据总线的输出连到D/A的数字输入上但是,由于CPU要进行各种信息的加工处理,它的数据总线上的数据是不断地改变的,它输给D/A的数据只在输出指令的几个微秒中出现在数据总线上所以,必须有一个锁存器,把CPU输给D/A转换的数据锁存起来,直至输入新的数据为止D/A转换器与CPU连接时有单缓冲器和多缓冲器等不同接口形式
12.2DAC分辨率和微机系统数据总线宽度相同或高于系统数据总线宽度时,其连接方式有何不同[解]当DAC分辨率和微机系统数据总线宽度相同时,通常采用单缓冲器结构就可以把CPU输出的数据可靠地传送给DAC但当CPU的数据总线宽度小于DAC的位数时,数据就要分多次输出这时,若仍采用单缓冲器结构,由于输出时间的不一致,在DAC的输出电平上会产生毛刺因此,至少要采用双缓冲器结构
12.3利用教材中的图12-1电路,编制在输出端得到锯齿波和梯形波的程序[解]锯齿波的产生可用先置AL的值为0,然而增量AL,当其增量至最大值
(255)后再增量就溢出为0,如此循环就形成了锯齿波相应的程序段如下MOVAL0LOP1:OUTP1ALINCALJMPLOP1梯形波是先由线性上升,当达到上限时,延时一段时间;然后线性下降,当它达到下限时又延时一段时间后再上升如此循环就形成了所以,梯形波要指定上下限及延时时间相应的程序段为MOVALL1OUTP1ALLOP1:INCALOUTP1ALCMPALL2JLLOP1CALLDELAYLOP2:DECALOUTP1ALCMPALL1JGLOP2CALLDELAYJMPLOP
112.4用带两级数据缓冲器的D/A转换器时,为什么有时要用3条输出指令才完成16位或12位数据转换[解]第一条输出指令把数据的低8位输出至第一级缓冲器第二条输出指令把数据的高4位或高8位输出至第一级缓冲器第三条输出指令把第一级缓冲器中的12位或16位数据同时输送至第二级缓冲器实现D/A转换
12.5设计一个电路和相应程序完成一个锯齿波发生器的功能,使锯齿波呈负向增长,并且锯齿波周期可调[解]教材中的图12-1就是能实现锯齿波功能的电路锯齿波负向生长,只要从最大值减量就行周期可调就要引入延时电路相应的程序段如下MOVAL0FFHLOP1:OUTP1ALDECALCALLDELAYJMPLOP
112.6A/D转换器接口电路一般应完成哪些任务[解]A/D转换通常是把现场的缓慢变化的模拟量经过采样,转换为电量,再经过A/D转换把模拟量变换为数字量送入至计算机处理由于A/D转换总需要一定时间(转换的方法不同,转换的时机也有较大的差别),所以要转换的模拟量必须通过采样保持电路再送至A/D转换器的输入端
12.7A/D转换器与CPU之间采用查询方式和采用中断方式下,接口电路有什么不同[解]在查询方式,必须有A/D转换器是否完成的状态信步输入至CPU的接口电路程序中读入此状态信息进行查询而中断方式不需要此状态信息的接口电路只需要A/D转换器在转换完成后有一个输出信号,以此信号作为CPU的中断请求信号PAGE1。