• 124.00 KB
  • 2022-04-22 11:25:14 发布

《微机原理及应用》教材课后习题及答案.doc

  • 22页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'《微机原理及应用》习题答案第一章n1.11请完成下列数制转换:(1)将174.66D转换为对应的二进制和十六进制形式。(2)将100011101011.01011B转换为对应的十进制和十六进制形式。(3)将F18A6.6H转换为对应的二进制和十进制形式。答:174.66D=10101110.1010B=AE.AH100011101011.01011B=2283.34375D=8EB.58HF18A6.6H=989350.375Dn1.12请写出与数据+37和-37对应的8位机器数原码、反码和补码,并分别用二进制和十六进制表示出来。答:-37D=(10100101B)原=(11011010B)反=(11011011B)补n1.138位机器数46H,若作为无符号数和补码有符号数,其对应的真值各是什么?若作为BCD码和ASCII码,其对应的又是什么?答:无符号数46H=70,补码46H=+70BCD码46H=46,ASCII码46H=“F”第二章l2.5什么是8088中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?1MB最多能分成多少个逻辑段?请将如下逻辑地址用物理地址表达:(1)FFFFH:0H(2)40H:17H(3)2000H:4500H(4)B821H:4567H答:⑴FFFFH:0H=FFFF0H⑵40H:17H=00417H⑶2000H:4500H=24500H⑷B821H:4567H=BC777Hl2.8已知DS=2000H,BX=0100H,SI=0002,存储单元[20100H]~[20103H]依次存放12H,34H,56H,78H,[21200H]~[21203H]依次存放2AH,4CH,87H,65H,说明下列每条指令执行完后AX寄存器的内容以及源操作数的寻址方式?答:⑴AX=1200H,立即数寻址;⑵AX=0100H,寄存器寻址;⑶AX=4C2AH,直接寻址;⑷AX=3412H,寄存器间接寻址;⑸AX=4C2AH,寄存器相对寻址;⑹AX=7865H,基址变址寻址;⑺AX=65B7H,基址变址相对寻址。l2.9说明下面各条指令的具体错误原因:(1)movcx,dl(2)movip,ax(3)moves,1234h(4)moves,ds(5)moval,300(6)mov[sp],ax(7)movax,bx+di(8)mov20h,ah答:⑴操作数类型不同;⑵不能手工修改IP;⑶不能将立即数直接MOV到段寄存器;⑷不能在段寄存器之间直接MOV数据;⑸300大于AL所能存放的数据的范围; ⑹寄存器间接寻址只能用BX/BP/SI/DI之一;⑺MOVAX,[BX+DI];⑻目的操作数不能是立即数。l2.10已知数字0~9对应的格雷码依次为:18H,34H,05H,06H,09H,0AH,0CH,11H,12H,14H,它存在于以table为首地址(设为200H)的连续区域中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。leabx,tablemoval,8xlat答:leabx,table;bx=0200hmoval,8;al=08hxlat;al=12hl2.11给出下列各条指令执行后的AL值,以及CF,ZF,SF,OF和PF的状态:moval,89haddal,aladdal,9dhcmpal,0bchsubal,aldecalincal答:⑴al=89h⑵al=12h,CF=1,ZF=0,SF=0,OF=1,PF=1,AF=1⑶al=afh,CF=0,ZF=0,SF=1,OF=0,PF=1,AF=0⑷al=afh,CF=1,ZF=0,SF=1,OF=1,PF=1,AF=0⑸al=00h,CF=0,ZF=1,SF=0,OF=0,PF=1,AF=0⑹al=ffh,CF=0,ZF=0,SF=1,OF=0,PF=1,AF=1⑺al=00h,CF=0,ZF=1,SF=0,OF=0,PF=1,AF=1l2.12请分别用一条汇编语言指令完成如下功能:(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加并把结果送到AL中。(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。答:⑴adddx,bx;⑵addal,[bx+si];⑶add[bx+00b2h],cx⑷addwordptr[0520h],3412h⑸addal,0a0hl2.13设X,Y,Z,V均为16位带符号数,分别装在X,Y,Z,V存储器单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。 movax,ximulymovcx,axmoxbx,dxmovax,zcwdaddcx,axadcbx,dxsubcx,540abbbx,0movax,vcwdsubax,cxabbdx,bxidivx答:(V-(X*Y+Z-540))/Xl2.14给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。movax,1470handax,axorax,axxorax,axnotaxtestax,0f0f0h答:⑴ax=1470h⑵ax=1470h,CF=0,ZF=0,SF=0,OF=0,PF=0⑶ax=1470h,CF=0,ZF=0,SF=0,OF=0,PF=0⑷ax=0000h,CF=0,ZF=0,SF=0,OF=1,PF=1⑸ax=0ffffh,CF=0,ZF=0,SF=0,OF=1,PF=1⑹ax=0ffffh,CF=0,ZF=0,SF=1,OF=0,PF=1l2.16假设DS=2000H,BX=1256H,TABLE的偏移地址是20A1H,物理地址232F7H处存放3280H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?答:⑴1256h;⑵3280hl2.17判断下列程序段跳转的条件(1)xorax,lelehjeequal(2)testal,10000001bjnzthere(3)cmpcx,64hjbthere答:⑴ax=1e1eh;⑵al=1******1b;⑶cx<64hl2.18如下是一段软件延时程序,请问NOP指令执行了多少次?xorcx,cxdelay:noploopdelay 答:65536l2.19有一个首地址为array的20个字的数组,说明下列程序段的功能。movcx,20movax,0movsi,axsumlp:addax,array[si]addsi,2loopsumlpmovtotal,ax答:将array数组的20个字(无进位)累加,其和存入total单元。l2.20按照下列要求,编写相应的程序段:(1)由string指示的起始地址的主存单元中存放一个字符串(长度大于6),把该字符串的第1个和第6个字符(字节量)传送给DX寄存器。(2)有两个32位数值,按“小端方式”存放在两个缓冲区buffer1和buffer2中,编写程序段完成DX.AX←buffer1-buffer2功能。(3)编写一个程序段,在DX高4位全为0时,使AX=0;否则,使AX=-1。(4)把DX.AX中的双字右移4位。(5)有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出或借位)存于原处。答:⑴movdl,stringmovdh,string+5⑵movax,wordptrbuffer1subax,wordptrbuffer2movdx,wordptrbuffer1+2sbbdx,buffer2+2⑶testdx,0f0hjet1movax,-1jmpdonet1:movax,0done:…..⑷movax,1234hmovdx,5678hmovcx,4lp1:shrdx,1rcrax,1looplp1⑸leabx,arraymovcx,100lp1:sub[bx],1incbx looplp1l2.25编写一个程序段:先提示输入数字“InputNumber:0~9”,然后在下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误“Error!”,继续等待输入数字。答:.modelsmall.stack100h.datamessagedb“InputNumber:0~9”,0dh,0ah,“$”errordb“Error!”,0dh,0ah,“$”.code.startupmovdx,offsetmessagemovah,09hint21hbegin1:movah,01hint21hcmpal,“0”jberr1cmpal,“9”jaerr1movdl,almovah,02hint21h.exiterr1:movoffseterrormovah,09hint21hjmpbegin1end第三章3.11请设置一个数据段,按照如下要求定义变量:(1)my1b为字符串变量,表示字符串“PersonalComputer”。(2)my2b为用十进制数表示的字节变量,这个数的大小为20。(3)my3b为用十六进制数表示的字节变量,这个数的大小为20。(4)my4b为用二进制数表示的字节变量,这个数的大小为20。(5)my5w为20个未赋值的字变量。(6)my6c为100的符号常量。(7)my7c为字符串常量,代替字符串“PersonalComputer”。答:my1bdb“PersonalComputer”my2bdb20my3bdb14hmy4bdb 00010100bmy5wdw20dup(?)my6cequ100my7cequ3.14设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:;数据段org100hvarwdw1234h,5678hvarbdb3,4varddd12345678hbuffdb10dup(?)messdb‘hello’;代码段movax,offsetmessmovax,typebuff+typemess+typevardmovax,sizeofvarw+sizeofbuff+sizeofmessmovax,lengthofvarw+lengthofvard答:offsetvarb=0104hoffsetmess=0114htypebuff=1;typemess=1;typevard=4sizeofvarw=4;sizeofbuff=10;sizeofmess=5lengthofvarw=2;lengthofvard=13.15假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的具体错误原因。⑴movbyteptr[bx],1000(2)movbx,offsetmyword[si](3)cmpmybyte1,mybyte2(4)movmybyte1,al+1(5)subal,myword(6)jnzmyword答:⑴1000大于字节变量所能表示的范围movbyteptr[BX],5表示的意思是把5以字节的形式传送给DS:BX,1000超过了0ffh,也就是大于1个字节,所以无法传送会出现errorA2050:Valueoutofrange(值超出范围)数据类型不匹配,目的地址单元是字节单元,1000大于255。无法存放。 ⑵OFFSET只能用于简单变量OFFSET后只能跟标识符。⑶双操作数不能同时为存储器操作数CMP的两个操作数不能同时在存储器中。⑷数值表达式应为运算符加常量运算符只能对常数进行操作,不能对变量进行操作。 ⑸两操作数类型不一致数据类型不匹配,AL是8位的,MYWORD是16位变量。⑹条件跳转只能是短跳转MYWORD是变量,其指的单元中存放的是操作数,不能用做跳转入口。3.17已知用于LED数码管的显示代码表为:LEDtabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hdb80h,90h,88h,83h,0c6h,0c1h,86h,8eh它依次表示0~9,A~F这16个数码的显示代码。现编写一个程序实现将lednum中的一个数字(0~9、A~F)转换成对应的LED显示代码。答:stacksegmentstackdb100hdup(?)stackendsdatasegmentledtabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hdb80h,90h,88h,83h,0c6h,0c1h,86h,8ehlednumdb3dataendscodesegment"code"assumecs:code,ss:stack,ds:datastart:movax,datamovds,axleabx,ledtablemoval,lednumxlat movax,4c00hint21hcodeendsendstart解析:stack 段是缺省的堆栈段时写成 stack segment para stack"stack" 比较简单省事儿,因为这样链接程序会自动设置 exe 可执行文件里初始堆栈指针,程序里就不用自己进行设置了。如果没有最后的那个 "stack" 说明项,就需要自己设置 ss:sp 。"stack"是类别名。把我定义的stack segment关联到栈,省去了assume ss:stack对么,所以我可以写成stack segment stack.3.18编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量存放的是8位有符号数。答:datasegmentxdb13ydb-3zdb?dataendsstacksegmentstackdb100dup(?)stackendscodesegment"code"assumecs:code,ds:data,ss:stackstart:movax,datamovds,axmoval,xmovah,ycmpal,ahjbechangemovz,ahjmpdonechange:movz,aldone:movax,4c00hint21hcodeendsendstart 3.19设变量bufX为有符号数16位数,请将它的符号状态保存在signX,即:如果变量值大于等于0,保存0;如果X小于0,保存-1.编写该程序。答:datasegmentbuffxdw13signxdw?dataendsstacksegmentstackdb100dup(?)stackendscodesegment"code"assumecs:code,ds:data,ss:stackstart:movax,datamovds,axmovax,buffx;ax=13cmpax,0jbechangemovsignx,0jmpdonechange:movsignx,-1done:movax,4c00hint21hcodeendsendstart3.20bufX、bufY和bufZ是3个有符号十六进制数,编写一个比较相等关系的程序:(1)如果这3个数都不相等,则显示0。(2)如果这3个数中有两个数相等,则显示1。(3)如果这3个数都相等,则显示2。答:datasegmentbufxdb13bufydb-3bufzdb-3dataendsstacksegmentstackdb100dup(?) stackendscodesegment"code"assumecs:code,ds:data,ss:stackstart:movax,datamovds,axmoval,bufxmovbl,bufymovcl,bufzcmpal,bljecaccmpal,cljeview1cmpbl,cljeview1movdl,"0"jmpviewcac:cmpal,cljeview2view1:movdl,"1"jmpviewview2:movdl,"2"view:movah,02hint21hmovax,4c00hint21hcodeendsendstart3.21例3.7中,如果要实现所有为1的位都顺序执行相应的处理程序段(而不是例题中仅执行最低为1位的处理程序段),请写出修改后的代码段?答: datasegmentnumberdb78haddrsdwoffsetfun0,offsetfun1,offsetfun2,offsetfun3,offsetfun4,offsetfun5,offsetfun6,offsetfun7dataendsstacksegmentstackdb100dup(?)stackendscodesegment"code"assumecs:code,ds:data,ss:stackstart:movax,datamovds,axmovdh,numbermovcx,8movbx,0lp1:shrdh,1jcnextagain:incbxincbxlooplp1jmpdonenext:jmpaddrs[bx]fun0:movdl,"0"jmpviewfun1:movdl,"1"jmpviewfun2:movdl,"2"jmpviewfun3:movdl,"3" jmpviewfun4:movdl,"4"jmpviewfun5:movdl,"5"jmpviewfun6:movdl,"6"jmpviewfun7:movdl,"7"jmpviewview:movah,02hint21hjmpagaindone:movax,4c00hint21hcodeendsendstart3.22编制程序完成12H,45H,F3H,6AH,20H,FEH,90H,C8H,57H和34H共10个无符号字节数据之和,并将结果存入字节变量SUM中(不考虑进位)。答:datasegmentnumdb12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34hsumdb?dataendsstacksegmentstackdb100dup(?)stackendscodesegment"code"assumecs:code,ds:data,ss:stackstart:movax,datamovds,axmovcx,10 leabx,numagain:moval,[bx]addsum,alincbxloopagainmovax,4c00hint21hcodeendsendstart3.23求主存0040H:0开始的一个64KB物理段中共有多少个空格?答:stacksegmentstackdb100dup(?)stackendscodesegment"code"assumecs:code,ss:stackstart:movax,0040hmoves,axmovdi,0movcx,0movbx,0moval,""again:scasbjnenextincbxnext:deccxjneagainmovax,4c00hint21hcodeendsendstart3.24编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow!’。答: datasegmentnumdw100dup(800)sumdw?msgdb"Overflow!",13,10,"$"dataendsstacksegmentstackdb100dup(?)stackendscodesegment"code"assumecs:code,ds:data,ss:stackstart:movax,datamovds,axmovcx,100leabx,nummovax,0again:addax,[bx]incbxincbxjcerrloopagainmovsum,axjmpdoneerr:movdx,offsetmsgmovah,09hint21hdone:movax,4c00hint21hcodeendsendstart3.25编制程序完成将一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;一次用余数除以100、10和1,得到“百位”、“十位”和“个位”。答: datasegmentbnumdw19982dnumdb5dup(?),"$"dataendsstacksegmentstackdb100dup(?)stackendscodesegment"code"assumecs:code,ds:data,ss:stackstart:movax,datamovds,axmovax,bnumleabx,dnummovdl,0cwdmovcx,10000divcxaddal,30hmov[bx],alincbxmovax,dxcwdmovcx,1000divcxaddal,30hmov[bx],alincbxmovax,dxcwdmovcx,100divcxaddal,30hmov[bx],alincbxmovax,dx cwdmovcx,10divcxaddal,30hmov[bx],alincbxadddl,30hmov[bx],dlmovdx,offsetdnummovah,09hint21hmovax,4c00hint21hcodeendsendstart3.27编写一个源程序,在键盘上按一个键,将从AL返回的ASCII码值显示出来,如果按下ESC键则程序退出。答:stacksegmentstackdb100hdup(?)stackendscodesegment"code"assumecs:code,ss:stackstart:movah,07hint21hcmpal,1bhjedonepushaxmovdl,almovcl,4shrdl,clcallhtoascmovah,02hint21h popaxmovdl,alanddl,0fhcallhtoascmovah,02hint21hjmpstartdone:movax,4c00hint21hhtoascprocadddl,30hcmpdl,39hjbehtoendadddl,7htoend:rethtoascendpcodeendsendstart3.28请按如下说明编写子程序:;子程序功能:把用ASCII码表示的两位十进制数转换位对应二进制数;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码;出口参数:AL=对应的二进制数答:stacksegmentstackdb100hdup(?)stackendscodesegment"code"assumecs:code,ss:stackstart:movdx,3932hcallasctohmovax,4c00hint21hasctohprocpushcx subdx,3030hmovcl,10moval,dhmulcladdal,dlpopcxretasctohendpcodeendsendstart3.29调用HTOASC子程序,编写显示一个字节的16进制数、后跟“H”的子程序。答:stacksegmentstackdb100hdup(?)stackendscodesegment"code"assumecs:code,ss:stackstart:movah,07hint21hcmpal,1bhjedonecallhtoahjmpstartdone:movax,4c00hint21hhtoahprocpushaxpushcxpushdxpushaxmovdl,almovcl,4shrdl,clcallhtoasc movah,02hint21hpopaxmovdl,alanddl,0fhcallhtoascmovah,02hint21hmovdl,"H"movah,02hint21hpopdxpopcxpopaxrethtoahendphtoascprocadddl,30hcmpdl,39hjbehtoendadddl,7htoend:rethtoascendpcodeendsendstart3.30写一个子程序,根据入口参数AL=0、1、2,依次实现对大些字母转换成小写、小写转换成大写或大小写字母互换。欲转换的字符串在string中,用0表示结束。答:datasegmentstringdb"abcDEfGh","$"dataendsstacksegmentstackdb100dup(?)stackendscodesegment"code"assumecs:code,ds:data,ss:stackstart: movax,datamovds,axmoval,2callchangemovdx,offsetstringmovah,09hint21hmoval,0callchangemovdx,offsetstringmovah,09hint21hmoval,1callchangemovdx,offsetstringmovah,09hint21hmovax,4c00hint21hchangeprocleabx,stringcmpal,0jecg1cmpal,1jecg2cg3:cmpbyteptr[bx],"$"jedonecmpbyteptr[bx],5ahjaxtodaddbyteptr[bx],20hjmpcg33xtod:subbyteptr[bx],20hcg33: incbxjmpcg3cg2:cmpbyteptr[bx],"$"jedonecmpbyteptr[bx],61hjbcg22subbyteptr[bx],20hcg22:incbxjmpcg2cg1:cmpbyteptr[bx],"$"jedonecmpbyteptr[bx],5ahjacg11addbyteptr[bx],20hcg11:incbxjmpcg1done:retchangeendpcodeendsendstart3.34编写一个计算字节校验和的子程序。所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。主程序提供入口参数,有数据个数和数据缓冲区的首地址。子程序回送求和结果这个出口参数。传递参数方法自定。答:datasegmentcount=10arraydbcountdup(10h)checkdb?dataendsstacksegmentstackdb100dup(?)stackendscodesegment"code" assumecs:code,ds:data,ss:stackstart:movax,datamovds,axmovax,countpushaxmovax,offsetarraypushaxcallsumcheckmovcheck,almovax,4c00hint21hsumcheckprocpushbpmovbp,sppushbxpushcxmovbx,[bp+4]movcx,[bp+6]moval,0sum1:addal,[bx]incbxloopsum1popcxpopbxpopbpret4sumcheckendpcodeendsendstart'