• 1.15 MB
  • 2022-04-22 11:46:09 发布

微型计算机原理与接口技术 课后答案.pdf

  • 39页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'《微机原理及应用》习题集(含答案)中原工学院电子信息学院微机原理课程组  2006年12月 习题一1.冯.诺依曼计算机由哪几个部分组成?各部分的功能是什么?答:冯.诺依曼在1946年提出了“存储程序”的计算机设计方案,计算机由运算器、控制器、存储器、输入设备和输出设备几个部分组成。输入设备用来向计算机输入程序和原始数据;输出设备用来输出计算机的处理结果及程序;存储器用来存放程序和数据;运算器是对数据进行运算的部件,其主要功能是对二进制数据进行算术运算(加、减、乘、除)和逻辑运算(与、或、非、移位),故又称为算术逻辑单元;控制器是整个计算机的控制中心,其功能是控制计算机各个部件自动协调工作。2.计算机的发展经历了哪几个时代?计算机有哪些方面的应用?答:第一代(1946年~1958年):电子管计算机;第二代(1959年~1964年):晶体管计算机;第三代(1965年~1970年):集成电路(IC)计算机;第四代(1971年以后):大规模/超大规模集成电路(LSIC/VLSIC)计算机。计算机应用主要有:1.科学计算;2.数据处理;3.实时控制;4.计算机辅助系统;5.人工智能;6.远程教育;7.电子商务等。3.微型计算机系统主要由哪些部分组成?各部分的主要功能是什么?答:微型计算机系统主要由:微处理器、主存储器、输入/输出接口、输入/输出设备、系统总线等部分组成。各部分的主要功能是:1.微处理器:它是微型计算机的核心部件,由运算器、控制器、寄存器等组成其主要功能是通过对指令的译码,产生微操作以控制计算机各个部件自动协调工作。2.主存储器:是微型计算机的重要组成部分之一,用于存储指令和数据。3.输入/输出接口:简称I/O接口,是微机与I/O设备进行信息传递的桥梁,即微机通过I/O接口与输入/输出设备进行信息交换。4.输入/输出设备:简称为I/O设备,人们通过I/O设备与微机进行信息交流。5.系统总线(systembus):是用来连接微处理器与其他部件的一束信号线,通过系统总线架起了微处理器与其他部件之间进行信息传递的通道。4.什么是微型计算机的系统总线?简要说明微处理器三总线的作用。答:系统总线是用来连接微处理器与其他部件的一束信号线,根据所传递的信息不同,可以将系统总线分为:地址总线(AB),用于传送存储器或I/O接口的地址;数据总线(DB),用于微处理器与其他部件的信息传递;控制总线(CB),用于传送各类控制信号,使外设和其它的部件在微处理器的控制下完成控制操作。5.解释下面术语的含义。(1)微处理器、微型计算机、微型计算机系统答:微处理器:它是微型计算机的核心部件,由运算器、控制器、寄存器等组成;微型计算机:体积小、重量轻,采用超大规模集成电路VLSIC,器件数量少,便于携带(笔记本),规模化生产、产量大、价格低廉、普及面大,结构配置灵活、可靠性高;微型计算机系统:由微型计算机构成的计算机系统。 (2)字节、字、字长答:字节:是计算机中比较通用的基本单位,一个字节由8位二进制数位组成。字:是计算机内部处理数据的基本单位。字长:是是指机器一次所能处理的数据位数。(3)主存、内存、高速缓冲存储器答:主存:是微型计算机的重要组成部分之一,按读写性能可以分为随机存储器(简RAM)和只读存储器(简称ROM)。内存:通常说内存容量,指的是随机存储器,并不包括只读存储器。高速缓冲存储器:在慢速的DRAM和快速CPU之间插入一速度较快、容量较小的SRAM,起到缓冲作用,使CPU可以以较快速度存取SRAM中的数据。(4)RAM、ROM答:RAM:随机存储器;ROM;只读存储器。(5)硬件、软件答:硬件:组成计算机的物理实体;软件:操作计算机运行的程序。 习题二1.数制转换(1)12=(1100)B=(0C)H(2)(0F89)H=(111110001001)B=(3977)D(3)(67.75)D=(1000011.11)B=(43.B)H(4)96.25=(1100000.01)B=(60.4)H(5)10111011B=(187)D=(0BB)H(6)(000110000010.0101)B=(386.3125)D=(182.5)H2.写出下列二进制数的原码、反码和补码。(1)+1111000B[X]原=01111000[X]反=00000111[X]补=01111000(2)-1000000B[X]原=11000000[X]反=10111111[X]补=11000000(3)-0000001B[X]原=10000001[X]反=11111110[X]补=11111111(4)-0101100B[X]原=10101100[X]反=11010011[X]补=110101003.求下列数的补码(用一个字节表示),如果用一个字表示结果如何?(1)-9[X]补=11110111(字节)[X]补=1111111111110111(字)(2)23[X]补=00010111(字节)[X]补=0000000000010111(字)(3)-65[X]补=10111111(字节)[X]补=1111111110111111(字)(4)-128[X]补=10000000(字节)[X]补=1111111110000000(字)4.已知[X]补,求X的真值。(1)[X]补=01111111BX=+127(2)[X]补=10000001BX=-127(3)[X]补=10000000BX=-128(4)[X]补=01111000BX=+1205.试将二进制数10000100B和00001110B相加,试说明不管把这两个数看作是无符号数还是有符号数,结果都正确(看作有符号数时采用补码表示)。10000100B答:当作为无符号数相加时和为146,小于255结果正确,+00001110B当作为有符号数,正数和负数相加,结果不会溢出。10010010B6.将有符号数10000100B和11100110B相加,判断结果是否溢出,为什么?答:用进位位法判别溢出:CY=1,CD=0,OF=CY⊕CD=1,10000100B产生溢出。因为两负数相加,其和大于-128,超出了表示的范围。+11100110B101101010B7.数值型数据,在加减运算中为什么采用补码表示?答:对数值型数据,有正数也有负数,采用补码表示时,可以将符号和数值位一起进行编码,并可将减运算转化成加运算。8.完成下列8421BCD码与其它数制/码制的转换。(1)(10010011)BCD=(93)D=(01011101)B (2)(10000010.0101)BCD=(82.5)D=(01010010.1)B(3)(001101110110.0111)BCD=(376.7)D=(101111000.1011001)B(4)(11010001)B=(001000001001)BCD(5)(000110000010.0101)B=(001110000110.0011000100100101)BCD(6)(58.5)D==(111010.1)B=(01011000.0101)BCD9.计算下列BCD码的和,并按规则进行十进制调整。(1)98+87(2)48+68(3)59+84(4)456+989答:(1)98+87=18510011000个位相加和大于9,加6调整,+10000111十位相加和产生进位,加60H调整100011111结果为:185+01100110000110000101BCD答:(2)48+68=11601001000个位相加产生进位加6调整+01101000十位相加和大于9加60H调整10110000结果为:116+01100110000100010110BCD01011001答:(3)59+84=143+10000100个位相加和大于9,加6调整11011101十位相加和大于9,加60H调整+01100110结果为:143000101000011BCD答(4):456+989=1445010001010110个位、十位、百位相加和均大于9+100110001001个位、十位、百位均加加6调整110111011111结果为:1445+0110011001100001010001000101BCD10.A~Z、a~z、0~9的ASCII码分别是什么?空格、回车、换行、$、?、+、-的ASCII码是什么?答:ASCII码用16进制表示A~Z的ASCII码为:41H-5AH;a~z的ASCII码为:61H-7AH;0~9的ASCII码为:30H-39H;空格的ASCII码为:20H;回车的ASCII码为:0DH;换行的ASCII码为:0AH;“$”的ASCII码为:24H;“?”的ASCII码为:3FH;“+”的ASCII码为:2BH; “-”的ASCII码为:2DH。11.什么是组合的BCD码?什么是非组合的BCD码?答:组合的BCD码是用一个字节表示2位BCD码;非组合的BCD码一个字节仅在低四位表示1位BCD码。12.简述汉字的编码规则。答:GB2312国标字符集呈二维表,分成94行×94列,行号称为区号,列号称为位号。每一个汉字或符号在码表中都有各自一个惟一的位置编码,该编码就是字符所在的区号(行号)及位号(列号)的二进制代码(7位区号在左、7位位号在右,共14位),也称为汉字的区位码。因此,字符集中的任何一个图形、符号及汉字都用唯一的区位码表示。为了不影响已经约定好的数据通信规程,将区位码的区号和位号都加32(即100000),变换成对应的国标码。 习题三1.8086CPU由哪两部分组成?他们的主要功能各是什么?8086CPU与8088CPU的主要区别是什么?答:由指令部件EU和总线接口部件BIU组成。EU功能:EU只负责执行指令。其中的算术逻辑单元(ALU)完成16位或8位的二进制运算,运算结果可通过内部总线送到通用寄存器组或BIU的内部寄存器中等待写入存储器。16位暂存器用来暂存参加运算的操作数。经ALU运算后的结果特征送入标志寄存器FR中保存;EU中的控制器负责从BIU的指令队列中取指令,并对指令进行译码,根据指令要求向EU内部各部件发出控制命令以完成各条指令的功能。BIU功能:总线接口单元BIU负责与存储器或I/O端口打交道,正常情况下,BIU通过地址加法器形成指令所在存储器中的物理地址后,启动存储器,从给定地址的存储器中取出指令代码送指令队列中等待执行,一旦指令队列中空出2个字节,BIU将自动进人读指令操作以填满指令队列。只要收到EU送来的操作数地址,BIU将立即形成操作数的物理地址,完成读/写操作数或运算结果的功能。答:8086CPU与8088CPU的主要区别:①8088BIU中指令队列长度仅有4个字节;②8088BIU通过总线控制电路与外部交换数据的总线宽度是8位,总线控制电路与专用寄存器组之间的数据总线宽度也是8位,而EU内部总线仍是16位,所以把8088CPU称之为准16位微处理器。2.8086内部的并行操作体现在哪里?答:EU执行指令时,不必访问存储器去取指令,而是直接从指令队列中取得指令代码,并分析执行它。BIU通过地址加法器形成指令所在存储器中的物理地址后,启动存储器,从给定地址的存储器中取出指令代码送入指令队列中等待执行。这两个过程是并行进行的。3.8086CPU中有哪些寄存器?各有什么用途?答:①通用寄存器组:4个16位通用寄存器,AX、BX、CX、DX,称作通用数据寄存器。可用来存放16位的数据或地址,另有隐含的专门用法;2个指针寄存器:SP和BP。它们均用来存放段内偏移地址;2个变址寄存器:SI和DI。这两个寄存器常用在字符串操作中,并分别用来存放源操作数的段内偏移量和目标操作数的段内偏移量。②段寄存器组:CS:代码段寄存器,存放代码段的基地址,要执行的指令代码均存放在代码段中;DS:数据段寄存器,存放数据段的基地址,指令中所需操作数常存放于数据段中;SS:堆栈段寄存器,存放堆栈段的基地址,堆栈操作所需的数据存放于堆栈段中;ES:附加段寄存器,存放附加段的基地址,附加段也是用来存放存储器操作数的。③标志寄存器FR:表示运算的特征或控制CPU的操作。④指令指针寄存器IP:用来存放将要执行的下一条指令代码在代码段中的偏移地址,在程序运行过程中,BIU可修改IP中的内容,使它始终指向将要执行的下一条指令4.标志寄存器FR中有哪些标志位?它们的含义和作用是什么?答:标志寄存器FR ①进位标志位CF:运算结果最高位若产生进位或借位,该标志置1,否则置0。②奇偶标志位PF:运算结果中1的个数为偶数,该标志置1,否则置0。③辅助进位标志位AF:加法/减运算中,若第3位有进/借位,AF=1,否则AF=1。④零标志位ZF:运算指令执行之后,若结果为0,则ZF=1,否则ZF=0。⑤符号标志位SF:它和运算结果的最高位相同。有符号运算时最高位表示符号,SF=1为负,SF=0为正。⑥溢出标志OF:若本次运算结果有溢出,则OF=1,否则OF=1。⑦中断标志位IF:该标志用于控制可屏蔽的硬件中断。IF=0,可接受中断;IF=0中断被屏蔽,不能接受中断。该标志可用指令置1或置0(复位)。⑧方向标志位DF:该标志位用于指定字符串处理指令的步进方向。当DF=1时,字符串处理指令以递减方式由高地址向低地址方向进行;当DF=0时,字符串处理指令以递增方式,由低地址向高地址方向进行。该标志可用指令置位或清零。⑨单步标志位TF:TF=1,表示控制CPU进人单步工作方式,此时,CPU每执行完一条指令就自动产生一次内部中断。单步中断用于程序调试过程中。5.为达到下述目的,各应判定哪个标志位并说明其状态。(1)两数相减后比较大小;答:无符号数A-B,判CF。A≥B时CF=0;A≤B时CF=1。有符号数A-B,判SF和OF。A≥B时SF⊕OF=0;A<B时:SF⊕OF=1。(2)比较两数是否相等;答:判ZF。当A=B时,ZF=1。(3)两数运算后是正数还是负数?答:对有符号数,判SF。当SF=1时,结果为负数;当SF=0时,结果为正数。(4)两数相加后是否产生溢出?答:对有符号数,判OF。当OF=1时,结果产生溢出;当OF=0,结果无溢出。6.什么是逻辑地址?它由哪两部分组成?答:在8086系统中,16位的地址称为逻辑地址。包括了段内“偏移地址”和“段基址”。7.8086系统的存储器的逻辑地址和物理地址之间有什么关系?答:物理地址为20位,是由“段基址”和“偏移地址”组成,其关系为:物理地址=段基址×16+偏移地址8.“最小模式”和“最大模式”系统的主要区别是什么?各有什么主要特点?答:最小模式是指单机系统,即系统中只有8086/8088一个微处理器。在这种系统中,8086/8088CPU直接产生所有的总统控制信号。最大模式系统中包含有两个或多个处理器,可构成多机系统,其中一个为主处理器8086/8088CPU。其它处理器称为协处理器,它们是协助主处理器进行工作的。在最大模式系统中,系统所需控制信号由总线控制器8288提供。两种模式的最主要区别体现在8086CPU的部分管脚(24~31引脚)具有不同的功能。9.8086系统中存储器为什么要分段?各逻辑段之间的关系如何?答:8086/8088系统中,可寻址的存储器空间达1M字节,要对整个存储器空间寻址,需要20位长的地址码,而CPU内部可以提供地址的寄存器及算术逻辑运算单元都是16位, 其寻址范围为64K字节(16位地址)。因此在8086/8088系统中,把整个存储空间分成许多逻辑段,这些逻辑段容量不能超过64K字节。对任何一个存储单元,只要能得到它所在段的首地址和段内的相对地址(16位),就可对它进行访问。逻辑段的首地址可在整个存储空间内进行设置,各个逻辑段之间可以紧密相连,也可以相互重叠(完全重叠或部分重叠)。10.在8086CPU中堆栈操作是字操作还是字节操作?已知SS=1050H,SP=0006H,AX=1234。若执行对AX的压栈操作后,则AX中的数据存放在何处?SP为什么值?答:堆栈操作是字操作。对AX压栈后,AX中的数据在10504H,10505H单元中,其中(10504H)=34H,(10505H)=12H,SP=0004H。11.已知当前数据段位于存储器的A1000H到B0FFFH范围内,DS段寄存器的内容是多少?答:DS=A100H,为数据段的“段基址”。12.若CS=234EH时,已知某一存储单元的物理地址为25432H。问若CS的内容被指定成1A31H时,该存储单元的物理地址应为什么?答:因为存储单元的物理地址是唯一的,当CS内容改变后,并不影响该存储单元的物理地址,故仍为:25432H。13.在8086系统中为什么用地址锁存器?答:因8086CPU的引脚采用了分时复用的地址/数据和地址/状态总线,为保证形成稳定的系统地址总线,故需采用地址锁存器以产生系统地址总线。14.8086CPU读/写总线周期各包含多少个时钟周期?什么情况下需要插入TW等待周期?应插入多少个TW,取决于什么因素?什么情况下会出现空闲状态TI?答:读写总线周期最少各包含了四个时钟周期,如果配合工作的存储器或I/O端口由于本身速度或其它原因来不及在T3时钟周期送出所需信息,则插入TW。否则不需插入等待周期TW。在T3周期结束后可立即进入T4周期;当检测到READY引脚为低电平,则在T3周期结后不进入T4周期,而应插入一个TW周期。以后在每一个TW周期的上升沿都要检测READY引脚电平,只有检则到5CE5AH34HREADY为高电平时,才在这个TW周期5CE5BH12H后进入T4周期。当BIU不访问存储器和外设时,总线时序出现空闲状态TI15.某程序数据段中存有两个数据字5DC45H6BH1234H和5A6BH,若已知DS=5AA0H,它们5DC46H5AH的偏移地址分别为245AH和3245H,试画出它们在储存器中的存放情况。答:它们在储存器中的存放情况见图: 16.80286CPU的结构中比8086CPU增加的部分有哪些?其主要用途是什么?答:8086CPU内部有BIU和EU两个独立部件并行工作,而80286CPU内部有4个部件BU(总线单元)、IU(指令单元)、EU(执行单元)和AU(地址单元)并行工作,提高了吞吐量,加快了处理速度。其中IU是增加的部分,该单元取出BU的预取代码队列中的指令进行译码并放入已被译码的指令队列中,这就加快了指令的执行过程。 习题四1.8086语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快?答:数据操作数的寻址方式有七种,分别为:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对基址变址和相对基址变址寻址。其中寄存器寻址的指令执行速度最快。2.若DS=6000H,SS=5000H,ES=4000H,SI=0100H,BX=0300H,BP=0400H,D=1200H,数据段中变量名NUM的偏移地址为0050H,试指出下列源操作数的寻址方式和物理地址是多少?(1)MOVAX,[64H]答:寻址方式为直接寻址;PA=60064H(2)MOVAX,NUM答:寻址方式为直接寻址;PA=60005H(3)MOVAX,[SI]答:寻址方式为寄存器间接寻址;PA=60100H(4)MOVAX,[BX]答:寻址方式为寄存器间接寻址;PA=60300H(5)MOVAX,[BP]答:寻址方式为寄存器间接寻址;PA=50400H(6)MOVAL,[DI]答:寻址方式为寄存器间接寻址;PA=61200H(7)MOVAL,[BX+1110H]答:寻址方式为寄存器相对寻址;PA=61410H(8)MOVAX,NUM[BX]答:寻址方式为寄存器相对寻址;PA=60305H(9)MOVAX,[BX+SI]答:寻址方式为基址变址寻址;PA=60400H(10)MOVAX,NUM[BX][DI]答:寻址方式为相对基址变址寻址;PA=61505H3.设BX=637DH,SI=2A9BH,位移量为C237H,试确定由这些寄存器和下列寻址方式产生的有效地址。(1)直接寻址答:有效地址为EA=C237H(2)用BX的寄存器间接寻址答:有效地址为EA=637DH(3)用BX的相对寄存器间接寻址答:有效地址为EA=125B4H(4)基址加变址寻址答:有效地址为EA=8E18H(5)相对基址变址寻址答:有效地址为EA=1504FH其中,(3)和(5)中产生进位,要把最高位1舍去。4.指出下列指令是否正确,若不正确情说明原因。(1)MOVDS,2010H;立即数不能传送到DS(2)PUSHAL;栈操作,操作数类型必须为WORD类型(3)MOVDX,[SP];SP寄存器不能做间址寄存器(4)INAL,0A00H;I/O指令的直接寻址,地址只能为8位(5)XCHGCL,CH;正确(6)SHRAX,3;移位超过一位时,应采用CL寄存器间址(7)AAACX;非组合的BCD码加法调整AAA指令应为隐含操作数(8)ADD[BP+DI];加法指令ADD,缺少源操作数(9)OUTDX,CL;I/O指令操作数只能用AX、AL提供,端口地址可以是8位的直接地址或用DX间址(10)CBWBH;符号扩展指令为隐含操作数(11)ADD03ECH;加法指令应为双操作数指令,立即数不能做目的操作数(12)MOVBX,[SI+DI];源操作数形式错误,SI和DI不能同时做为间址寄存器(13)MOVDI,[AX];AX不能做为间址寄存器 (14)OUT258H,BX;I/O指令格式错误,见(9)题的解释(15)SHLAX,3;移位指令,位移位数大于1时,应用CL来指明(16)MOV64H,AL;立即数不能做为目的操作数(17)ADDAL,6600H;源、目的操作数的类型不一致(18)MOV[BX],[SI];传送指令中,两个操作数不能同时为存储器操作数(19)XCHGAX,8800H;交换指令的操作数不能使用立即数(20)MOVAX,[BX+DX];传送指令的源操作数,不能使用立即数(21)LEABX,1000H;有效地址传送指令的源操作数不能为立即数,必须是存储器操作数(22)DIV0010H;正确(23)LEADX,DI;同(21)题,源操作数不能为寄存器操作数(24)MULAX,200H;乘法指令的目的操作数是隐含的,不能出现在指令中(25)MOVAX,[BX+BP];传送指令中源操作数格式错,BX和BP不能同时为间址寄存器(26)CMP[BX],[SI];比较指令的两个操作数不能同时为存储器操作数(27)OUTDX,BX;I/O指令中,源操作数只能使用AL或AX寄存器(28)ANDOFH,AL;“与”指令中,目的操作数不能使用立即数(29)SAL[BX],CX;移位指令,移位位移不能用CX寄存器指明(30)JMPFAR[BX+SI];转移指令中转移的目标地址表达方式错误;如果是段内间接转移,应为:JMPWORDPTR[BX+SI];如果是段间间接转移,应为:JMPDWORDPTR[BX+SI](31)JNZAAA;不相等转移指令中,符号地址(标识符)不能使用系统中的保留字(32)JMPNEXT;正确(33)SBCAX,[DX];指令助记符错,源操作数表示方式错(34)MOVCS,DS;段寄存器之间不能传送数据,CS寄存器也不能做为目的操作数(35)ADDDS,AX;加法指令中段寄存器不能做为操作数(36)MOVAL,CX;源、目的操作数的类型不一致,见(17)题(37)INC[BX];没有指定存储器操作数类型(38)MOVCL,A8H;源操作数为16进制的立即数,16进制数以字母开头时应在前面加“0”(39)MOVES,DS;错同(34)题(40)INAL,BX;I/O指令端口地址表示错误,只能用8位立即数或DX间址5.设一个字节数据X存放AL寄存器中,试说明下列程序的功能:XORAH,AH;AH清零SALAX,1;AX左移一位,相当于2XMOVBX,AX;2X送BX暂存MOVCL,2SALAX,CL;AX左移二位,2X×4=8XADDAX,BX;2X+8X=10X该段程序实现了字节数据X乘10,结果在AX中。6.试编程实现: (1)AL寄存器的低4位清0(2)BL寄存器的低4位置1(3)CL寄存器的低4位取反(4)测试DL寄存器的最低2位是否同时为0,若是,将0送入BL寄存器;否则将1送入BL寄存器。答:程序段如下ANDAL,0F0H;①AL寄存器的低4位清0ORBL,0FH;②BL寄存器的低4位置1XORCL,0FH;③CL寄存器的低4位取反TESTDL,03H;④测试DL寄存器JZNEXTMOVBL,1JMPNEXT1NEXT:MOVBL,0NEXT1:HLT7.若有两个4字节的无符号数相加,这两个数分别存放在2000H和3000H开始的存储单元中,得到的和存放在2000H开始的内存单元。试编程完成。答:程序段如下MOVAX,[3000H]ADD[2000H],AXMOVAX,[3002H]ADC[2002H],AX8.设从2000H为首址的内存中,存放着10个带符号的字节数据,试编程完成:找出其中最大的数,并存入2000H单元。答:程序段如下MOVBX,2000HMOVCX,9MOVAL,[BX]N2:INCBXCMPAL,[BX]JGEN1MOVAL,[BX]N1:LOOPN2MOV[2000H],ALHLT9.用寄存器间接寻址方式时,BX、BP、SI、DI分别针对什么情况来使用?用这4个寄存器分别组合间接寻址时,物理地址是怎样计算的?举例说明。答:BX、SI、DI用于在数据段寻址,BP用于在堆栈段寻址。在数据段物理地址为:PA=DS×10H+BX/SI/DI或者为:PA=DS×10H+BX+SI或(BX+DI)在堆栈段物理地址为:PA=SS×10H+BP 或者为:PA=SS×10H+BP+SI或(BP+DI)举例如下:MOVAX,[BX+SI];在数据段寻址,PA=DS×10H+BX+SIMOVAX,[BP+DI];在堆栈段寻址,PA=SS×10H+BP+DI10.已知:DS=2000H,BX=0300H,SI=0002H,(20300H)=12H,(20301)=34H,(20302H)=56H,(20303H)=78H,(21400H)=2AH,(21401H)=4CH,(21402H)=B7H,(21403H)=65H试说明下列各条指令执行完后AX寄存器的内容。(1)MOVAX,1400H;答:执行完该条指令后AX=1400H(2)MOVAX,BX;答:执行完该条指令后AX=0300H(3)MOVAX,[1400H];答:执行完该条指令后AX=4C2AH(4)MOVAX,[BX];答:执行完该条指令后AX=3412H11.根据以下要求,试写出相应的汇编语言指令。(1)把BX寄存器和DX寄存器的内容相加,结果存入BX寄存器中。答:指令为ADDBX,DX(2)用寄存器BX和SI的基址变址寻址方式把存储器中的一个字节与AL寄存器的内容相加,并把结果送到AL寄存器中。答:指令为ADDAL,[BX+SI](3)用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX相加,并把结果存回存储器中。答:指令为ADD[BX+0B2H],CX(4)用位移量为0524H的直接寻址方式把存储器中的一个字与立即数3C5AH相加,并把结果送回该存储单元。答:指令为ADD[0524H],3C5AH12.已知堆栈段寄存器SS的内容是0FF0AH,堆栈指针寄存器SP的内容是0008H,先执行两条把8057H和0F7CH分别进栈的PUSH指令,再执行一条POPBX指令。试画出堆栈区和SP的内容过程变化示意图(标出存储单元的物理地址)。答:将8057H和0F7CH分别进栈后,SP=0004H,再执行一条POPBX指令后,SP=0006H,BX=0F7CH。堆栈区和SP的内容过程变化示意图如下:SP=0008HSP=0004HSP=0006HSS=0FF0AH0FF0A0H0FF0A1H0FF0A2H0FF0A3H0FF0A4HSP→7CH7CH0FF0A5H0FH0FH0FF0A6H57HSP→57H0FF0A7H80H80H0FF0A8H××H××H××HSP→0FF0A9H××H××H××H0FF0AAH××H××H××H 13.字节扩展指令和字扩展指令用在什么场合?举例说明。答:用在除法运算中,对带符号数的被除数进行扩展;例如:当被除数在AX中,除数在BX中时CDWIDIVBX14.写出执行以下计算的指令系列。其中X、Y、Z、R、W均为存放16位带符号数单元的地址。(1)Z←W+(Z-X)答:指令系列如下MOVAX,ZSUBAX,XADDAX,WMOVZ,AX(2)Z←W-(X+6)-(R-9)答:指令系列如下ADDX,6SUBR,9MOVAX,WSUBAX,XSUBAX,RMOVZ,AX(3)Z←(W×X)/(Y+6),R←余数答:指令系列如下MOVAX,WIMULXMOVBX,YADDBX,6IDIVBXMOVR,DX(4)Z←((W-X)/5×Y)×2答:指令系列如下MOVAX,WSUBAX,XCDWIDIV5IMULYIMUL2ADDDX,CFMOVZ,AX15.写出完成以下操作的程序段。假设各变量的值均为用压缩BCD码表示的二位十进制数(1)U←V+(S-6)答:程序如下 MOVAL,SSUBAL,6DASADDAL,VDAAMOVU,AL(2)U←(X+W)-(Z-V)答:程序如下MOVAL,ZSUBAL,VDASMOVBL,ALMOVAL,XADDAL,WDAASUBAL,BLDASMOVU,AL16.移位指令和循环移位指令在执行操作时,有什么差别?在编制乘除法程序中,为什么常用移位指令来代替乘除法指令?试编制一个程序段,实现CX中的数除以4,结果仍放在CX中。答:逻辑移位指令用于无符号数的移位,左移时,最低位补0,右移时,最高位补0。算术移位指令用于对带符号数的移位,左移时,最低位补0,右移时,最高位的符号在右移的同时,且保持。小循环移位指令ROL、ROR是只对目标操作数进行循环,即不含CF的左、右移循环移位。大循环移位指令RCL、RCR是把标志位CF也包含在循环中的左、右移循环移位。对于二进制数,左移一位相当于乘二,右移一位相当于除二,所以可以用移位指令来代替乘除法指令。SARCX,1;CX算术右移一位,除二SARCX,1;CX算术右移一位,除二17.在0628H单元处有一条二字节指令JMPSHORTOBJ,如果其中位移量为:①27H;②6BH;③0C6H,试问转向地址处的值为多少?答:段内短转移的把当前的IP值(即JMP指令的下一条指令的地址)与指令指定的8位偏移量之和送到IP,使程序运行发生转移。指令中的OBJ是一个带符号的八位偏移量。当OBJ=27H时,转移的目标地址值为:0651H当OBJ=6BH时,转移的目标地址值为:0692H当OBJ=0C6H时,转移的目标地址值为:05F0H18.带参数的返回指令用在什么场合?设栈顶地址为4000H,当执行RET0008H后,SP指针的值是多少?答:当调用程序为子程序提供一定的参数或参数的地址,这些参数是通过堆栈传递给子程序时;在子程序运行结束返回时,这些参数或参数地址已经没有在堆栈中保留的必要。因此,使用带参数的返回指令RETn,以便废弃一些CALL指令执行前入栈的参数。 设栈顶地址为4000H,当执行RET0008H后,执行SP←SP+n的操作,SP=4008H。19.假定AX和BX中内容为带符号数,CX和DX中的内容为无符号数。请用比较指令和条件转移指令实现以下判断。(1)若DX的内容高于CX的内容,转去执行EXCEED。(2)若BX的内容大于AX的内容,转去执行EXCEED。(3)若CX的内容等于零,转去执行ZERO。(4)若BX的内容小于等于AX的内容,转去执行EXCEED。(5)若DX的内容低于等于CX的内容,转去执行EXCEED。答:①CMPDX,CXJAEXCEED②CMPBX,AXJGEXCEED③CMPCX,0JZZERO④CMPBX,AXJLEEXCEED⑤CMPDX,CXJBEEXCEED20.分析下列程序段:ADDAX,BXJNOL1JNCL2SUBAX,BXJNCL3JNOL4JMPSHORTL5如果AX和BX的内容(带符号数)给定如下:AXBX(1)B568H54B7H(2)147BH80DCH(3)D023H9FD0H(4)42C8H608DH(5)B568H94B7H问该程序执行完后,程序转向哪里?答:①AX+BX没有产生溢出,程序转向L1②AX+BX没有产生溢出,程序转向L1③AX+BX产生溢出,产生进位,执行减运算,产生借位,产生溢出,程序转向L5④AX+BX产生溢出,无进位,程序转向L2⑤AX+BX产生溢出,产生进位,执行减运算,产生借位,产生溢出,程序转向L521.8086/8088用什么途径来更新CS和IP的值?答:出栈;转移;过程调用;中断。 22.设IP=3D8FH,CS=4050H,SP=0F17CH。当执行CALL2000:0094H后,试指出IP、CS、SP、(SP-1)、(SP-2)、(SP-3)和(SP-4)的值。答:CS=2000H,IP=0094H;SP=0F78H,(SP-1)=3DH,(SP-2)=8FH,(SP-3)=40H,(SP-3)=50H23.编写一段程序,比较两个5字节的字符串OLDS和NEWS,如果OLDS字符串不同于NEWS字符串,则执行NEW_LESS,否则顺序执行。答:设字符串OLDS位于数据段,字符串NEWS位于扩展段,程序段如下:LEASI,OLDS;取源串首址送SILEADI,NEWS;取目的串首址送DICLD;增址比较MOVCX,5;串长度为5REPECMPSB;相等重复串比较JNENEW_LESS;不相等转移HLT;暂停 习题五1.汇编程序和汇编语言源程序有什么区别?两者的作用是什么?答:汇编程序是对汇编源程序进行编译的系统程序;汇编源程序是编程人员利用汇编语言为解决某些问题而编写的程序。汇编程序用来对汇编源程序进行编译,从而产生目标代码的;而汇编源程序是用来执行程序动作的语句。2.汇编语言源程序的语句有哪几种?各自的作用是什么?答:汇编语言源程序是由指令语句、伪指令语句、宏指令语句组成。指令语句:产生目标代码,是CPU可以执行的能够完成特定功能的语句。伪指令语句:在汇编程序对源程序汇编期间由汇编程序处理的操作,它可以完成如处理器选择、定义数据、分配存储区、指示程序结束等功能,但不产生目标代码。宏指令语句:宏指令语句的目的在于简化汇编语言源程序的书写,不能缩小目标代码文件。3.标号和变量都有什么属性?各属性的作用是什么?答:有段属性、偏移地址属性和类型属性。①段属性:段属性定义了标号和变量的段起始地址,其值是在某一段寄存器中。②偏移地址属性:该属性表示标号和变量相距段起始地址的字节数,是一个16位无符号数。③类型属性:对于标号而言:用于指出该标号是在本段内引用还是在其它段中引用。标号的类型有NEAR(段内引用)和FAR(段间引用)两种;对变量而言:其类型属性由定义变量的伪指令DB(定义字节型)、DW(定义字型)、DD(定义双字型)等确定。4.试叙述汇编语言源程序的上机过程。答:分四步进行①编辑、②汇编、③连接、④调试。编辑:用编辑程序(例如EDIT.COM)建立扩展名为.ASM的汇编语言源程序文件。汇编:用汇编程序(例如MASM.EXE)将汇编语言源程序文件汇编成目标程序文件,其扩展名为.OBJ。如果在汇编过程中出现语法错误,根据错误信息提示(如错误位置、错误类型、错误说明),用编辑软件重新调入源程序文件进行修改,直至没有出现语法错误,再进行连接程序。连接:用连接程序(例如LINK.EXE)把目标程序文件转化成可执行文件,其扩展名为.EXE。调试:用调试程(例如DEBUG.EXE)序对可执行文件进行调试,直到无错误为止。此时的可执行文件在DOS命令下直接执行。5.已知数据段DATA从存储器02000H单元开始,DATA段的定义如下:DATASEGMENTVAR1DB2DUP(0,1,?)VAR2DW50DUP(?)VAR3DB10DUP(0,1,2DUP(3),4)DATAENDS试求出三个变量经SEG、OFFSET、TYPE、LENGTH、SIZE运算的结果。答:运算结果如下表所示: 回送符SEGOFFSETTYPELENGTHSIZE变量VAR10200H0000H1H2H2HVAR20200H0006H2H32H64HVAR30200H006AH1H0AH0AH6.已知数据段定义如下,试采用图示说明各变量在内存的分配情况以及数据的预置情况。DATASEGMENTA1DB50,100,2DUP(0,1)A2DB2DUP(2,3DUP(?),10H)A3DB‘happynewyear!’A4DW0,2000HA5DW?,‘AB’DATAENDS答:A10000HA30010HA4001FH32H68H00H64H61H00H00H70H00H01H70H20H79HA500H××H01H20H××HA202H6EH42H××H65H41H××H77H××H20H79H10H02H65H61H××H72H××H21H××H10H7.试采用图示说明各变量在内存的分配情况以及数据的预置情况。DATASEGMENTB10100H××HB2ORG0100H64H00HB1DB?B300HB2DW10000HB3DW2DUP(0)00H00HCOUNTEQU5B400HB4DBCOUNTDUP(0,1)01H00HB5DW‘12’,‘34’,‘56’01HDATAENDS00H01H答:内存的分配情况以及数据的预置情况见右图00H01H00H01HB532H31H34H33H36H35H 8.已知变量VAR1、VAR2、VAR3定义如下,试分析下面的指令是否正确,若有错误,请进行改正。DATASEGMENTVAR1DB?VAR2DB10VAR3EQU100DATAENDS(1)MOVVAR1,AX(2)MOVVAR3,AX(3)MOVBX,VAR1MOV[BX],10(4)CMPVAR1,VAR2(5)VAR3EQU50答:(1)类型不匹配,该为:MOVVAR1,AL(2)立即数不能作为目的操作数,该为:MOVAX,VAR3(3)第一句类型不匹配,改为:MOVBL,VAR1第二句未指明存储器操作数的类型,改为:MOVBYTEPTR[BX],10(4)两个存储器操作数之间不能直接作比较,改为:MOVAL,VAR1CMPAL,VAR2(5)符号VAR3已被定义,不能重复定义,应去掉。9.假设VAR1和VAR2为字变量,LAB为标号,试指出下面指令的错误之处,并加以改正。(1)ADDVAR1,VAR2答:两存储器操作数之间不能直接相加,改为:MOVAX,VAR1ADDAX,VAR2(2)SUBAL,VAR2答:两操作数类型不匹配,改为:SUBAX,VAR2(3)MOVCL,VAR1答:两操作数类型不匹配,改为:MOVCX,VAR1(4)JMPLAB[SI]答:相对寄存器寻址,相对位移量不能为标号,因为数据值。改为:JMP5[SI](5)JNZVAR1答:条件转移指令转移的目标地址,只能是标号或8位位移量。改为:JNZLAB10.试说明下面指令中哪些需要进行PTR说明。VAR1DB10H,100VAR2DW1000(1)MOVAL,VAR1(2)MOVDH,[BX](3)ADD[BX],2(4)MOVCL,VAR2(5)SUBAL,VAR1+1答:(3)、(4)条指令需要进行PTR说明 11.选择题(1)在顺序结构的流程图中,不包含有(C)。A)起始框B)终止框C)判断框D)处理框(2)设AL=0A8H,CX=2,CF=1,执行RCLAL,CL指令后,AL=(无正确选项)。A)51HB)46HC)47HD)0C5H注:正确的结果为:AL=0A3H(3)下述指令的执行结果是(C)MOVAL,0FFHXORAL,3FHA)AL=40HB)AL=20HC)AL=0C0HD)AL=0E0H12.在AX和DX中存有一个32位带符号数(DX中存放高16位),试编写程序求出它的相反数。答:程序设计如下:CODESEGMENTASSUMECS:CODESTART:MOVCX,0CLCSBBCX,AXMOVAX,CXMOVCX,0SBBCX,DXMOVDX,CXMOVAH,4CHINT21HCODEENDSENDSTART2213.编程实现求S=(X+Y)/Z的值,并将结果放入RESULT单元。(设:X、Y、Z均为字节数,且Z为无符号数)答:程序设计如下:DATASEGMENTXDB20HYDB35HZDB12HRESULTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XMULAL MOVDX,AXMOVAL,YMULALADDAX,DXMOVDX,0MOVBL,ZMOVBX,0DIVBXMOVRESULT,AXMOVAH,4CHINT21HCODEENDSENDSTART14.试编程实现将键盘输入的小写字母用大写字母显示出来。答:程序设计如下:CLRFMACRO;宏汇编命令,定义宏MOVDL,0DHMOVAH,02HINT21H;回车,使光标回到起始位置MOVDL,0AHMOVAH,02HINT21H;光标换行ENDM;宏定义结束DATASEGMENTSTRINGDB50,?,50DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEADX,STRINGMOVAH,0AHINT21HCLRF;宏指令MOVBL,STRING+1MOVBH,0LEASI,STRING+2ADDBX,SIMOVBYTEPTR[BX],‘$’NEXT:MOVDL,[SI]CMPDL,‘a’JBNEXT1CMPDL,‘z’ JANEXT1SUBDL,20HMOV[SI],DLNEXT1:INCSIDECBLJNZNEXTLEADX,STRING+2MOVAH,09HINT21HMOVAH,4CHINT21HCODEENDSENDSTART15.若在数组字变量SQTAB平方表中有十进制数0~100的平方值,用查表法找出35这个数的平方值放入字变量NUM中,写出程序段和有关的伪指令。答:程序设计如下DATASEGMENTSQTABDW0,1,4,9,16,25,36,……10000TABDB35NUMDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETSQTABMOVAL,TABSALAL,1MOVAH,0ADDBX,AXMOVAX,WORDPTR[BX]MOVNUM,AXMOVAH,4CHINT21HCODEENDSENDSTART16.试指出下列无条件转移指令的转移地址中的转移地址?(1)JMPBX答:转移地址为BX寄存器中的值。属段内间接转移,IP←BX(2)JMPWORDPTR[BX]答:转移地址为BX中的值指明的存储器字单元中的值。属段内间接转移,IP←(MEM)(3)JMPNEARPTRFOR 答:转移地址为当前IP+16位位移量。标号FOR表示16位位移量,属段内近转移。(4)JMPFARPTRFAR_PRO答:转移地址为标号FAR_PRO表示的16位段基址和16位偏移量。属段间直接转移。(5)JMPSHORTAGAIN答:转移地址为当前IP+8位位移量。标号AGAIN表示8位位移量,属段内短转移。(6)JMPDWORDPTR[BX][DI]答:转移地址为由基址变址寻址方式提供的存储器操作数(两个字)17.试分析下列程序段,如果AX和BX的内容分别给出如下5种情况,试问程序分别转向何处?(1)AX=1478H,BX=80DCH(2)AX=0B568H,BX=54B5H(3)AX=42C8H,BX=608DH(4)AX=0D023H,BX=9FD0H(5)AX=94B7H,BX=0B568HADDAX,BXJNOL1JNCL2SUBAX,BXJNCL3JNOL4JMPL5答:(1)转向L1(2)转向L1(3)转向L2(4)转向L5(5)转向L518.编写程序,计算下面函数的值。2X(X<0)S=3X(0≤X≤10)4X(X>10)答:程序设计如下DATASEGMENTXDB-17SDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XCMPAL,0JGELOOP1 ADDAL,ALMOVS,ALMOVAH,4CHINT21HLOOP1:CMPAL,0AHJGLOOP2MUL3MOVS,ALMOVAH,4CHINT21HLOOP2:MUL4MOVWORDPTRS,AXMOVAH,4CHINT21HCODEENDSENDSTART19.设内存中有三个互不相等的无符号字数据X、Y和Z,存放在X开始的字单元中,编程实现将三个数据从小到大排序后放到X、Y和Z中。答:程序设计如下DATASEGMENTXDW25H,27H,18HYDW?ZDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,XCMPAX,X+2JBELOOP1XCHGAX,X+2LOOP1:CMPAX,X+4JBELOOP2XCHGAX,X+4LOOP2:MOVX,AXMOVAX,X+2CMPAX,X+4JBELOOP3MOVZ,AXMOVAX,X+4MOVY,AXJMPLOOP4 LOOP3:MOVY,AXMOVAX,X+4MOVZ,AXLOOP4:MOVAH,4CHINT21HCODEENDSENDSTART20.分析下面程序功能,并指出程序执行后,DAT2数据区中的内容是什么?DAT1DB0,1,2,3,4,5,6,7,8,9DAT2DB5DUP(?)︰MOVCX,5MOVBX,5MOVSI,0MOVDI,0NEXT:MOVAL,DAT1[BX+SI]MOVDAT2[DI],ALINCSIINCDILOOPNEXTHLT答:DAT2数据区中的内容为:5,6,7,8,921.编写程序求出首地址为DAT的100个有符号字数据中的最小偶数,并将这个数存放到DAT1字单元中。答:程序设计如下(提示:偶数的最末为是零)DATASEGMENTDATDB02H,0A8H,34H,23H,23H,34H,26H,0A2H……NUMEQU64HDAT1DB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,DATMOVCX,NUMMOVAL,0NEXT:MOVDL,[SI]SHRDL,1JNCNNINCSIDECCX JNZNEXTJMPMMNN:MOVAL,[SI]NN1:INCSIDECCXJZMMMOVBL,[SI]SHRBL,1JCNN1MOVBL,[SI]CMPAL,BLJLENN1MOVAL,BLJMPNN1MM:MOVDATI,ALMOVAH,4CHINT21HCODEENDSENDSTART22.试编写一个程序段,要求比较两个字符串STR1和STR2是否完全相等。若完全相等,则置AL=1;若不完全相等,则置AL=-1。答:程序设计如下DATASEGMENTSTR1DB‘FDASFDFDSA’,‘$’NUM1EQU$-STR1STR2DB‘FDASFDFDSA’,‘$’NUM2EQU$-STR2DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,NUM1MOVBX,NUM2CMPAX,BXJNELOOP1MOVCX,NUM1LEASI,STR1LEADI,STR2CLDREPECMPSBJCXZLOOP2 LOOP1:MOVAL,0FFHJMPEXITLOOP2:MOVAL,01HEXIT:MOVAH,4CHINT21HCODEENDSENDSTART23.按子程序说明信息编写子程序;子程序名:STRINGS_CMP;子程序功能:比较两个长度相同的字符串STR1和STR2;入口参数:STR1、STR2的首地址分别放在SI和DI中,长度在CX中;出口参数:STR1>STR2时,CF=0;STR1