还剩20页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
《微机原理及应用》习题答案第一章
1.11请完成下列数制转换
(1)将
174.66D转换为对应的二进制和十六进制形式
(2)将转换为对应的十进制和十六进制形式
(3)将F18A
6.6H转换为对应的二进制和十进制形式答
174.66D=
10101110.1010B=AE.AH18A
6.6H=
989350.375D
1.12请写出与数据+37和-37对应的8位机器数原码、反码和补码,并分别用二进制和十六进制表示出来答-37D=10100101B原=11011010B反=11011011B补
1.138位机器数46H,若作为无符号数和补码有符号数,其对应的真值各是什么?若作为BCD码和ASCII码,其对应的又是什么?答无符号数46H=70,补码46H=+70BCD码46H=46,ASCII码46H=“F”第二章
2.5什么是8088中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?1MB最多能分成多少个逻辑段?请将如下逻辑地址用物理地址表达
(1)FFFFH:0H240H:17H32000H:4500H4B821H:4567H答⑴FFFFH:0H=FFFF0H⑵40H:17H=00417H⑶2000H:4500H=24500H⑷B821H:4567H=BC777H
2.8已知DS=2000HBX=0100HSI=0002存储单元[20100H]~[20103H]依次存放12H34H56H78H[21200H]~[21203H]依次存放2AH4CH87H65H说明下列每条指令执行完后AX寄存器的内容以及源操作数的寻址方式?答⑴AX=1200H,立即数寻址;⑵AX=0100H,寄存器寻址;⑶AX=4C2AH,直接寻址;⑷AX=3412H,寄存器间接寻址;⑸AX=4C2AH,寄存器相对寻址;⑹AX=7865H,基址变址寻址;⑺AX=65B7H,基址变址相对寻址
2.9说明下面各条指令的具体错误原因
(1)movcxdl2movipax3moves1234h4movesds5moval3006mov[sp]ax7movaxbx+di8mov20hah答⑴操作数类型不同;⑵不能手工修改IP;⑶不能将立即数直接MOV到段寄存器;⑷不能在段寄存器之间直接MOV数据;⑸300大于AL所能存放的数据的范围;⑹寄存器间接寻址只能用BX/BP/SI/DI之一;⑺MOVAX,[BX+DI];⑻目的操作数不能是立即数
2.10已知数字0~9对应的格雷码依次为18H34H05H06H09H0AH0CH11H12H14H它存在于以table为首地址(设为200H)的连续区域中请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果leabx,tablemoval,8xlat答leabx,table;bx=0200hmoval,8;al=08hxlat;al=12h
2.11给出下列各条指令执行后的AL值,以及CFZFSFOF和PF的状态moval89haddalaladdal9dhcmpal0bchsubalaldecalincal答⑴al=89h⑵al=12h,CF=1ZF=0SF=0OF=1PF=1AF=1⑶al=afh,CF=0ZF=0SF=1OF=0PF=1AF=0⑷al=afh,CF=1ZF=0SF=1OF=1PF=1AF=0⑸al=00h,CF=0ZF=1SF=0OF=0PF=1AF=0⑹al=ffh,CF=0ZF=0SF=1OF=0PF=1AF=1⑺al=00h,CF=0ZF=1SF=0OF=0PF=1AF=
12.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,0a0h
2.13设XYZV均为16位带符号数,分别装在XYZV存储器单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处movaxximulymovcxaxmoxbxdxmovaxzcwdaddcxaxadcbxdxsubcx540abbbx0movaxvcwdsubaxcxabbdxbxidivx答V-X*Y+Z-540/X
2.14给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态movax1470handaxaxoraxaxxoraxaxnotaxtestax0f0f0h答⑴ax=1470h⑵ax=1470h,CF=0ZF=0SF=0OF=0PF=0⑶ax=1470h,CF=0ZF=0SF=0OF=0PF=0⑷ax=0000h,CF=0ZF=0SF=0OF=1PF=1⑸ax=0ffffh,CF=0ZF=0SF=0OF=1PF=1⑹ax=0ffffh,CF=0ZF=0SF=1OF=0PF=
12.16假设DS=2000HBX=1256H,TABLE的偏移地址是20A1H,物理地址232F7H处存放3280H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?答⑴1256h;⑵3280h
2.17判断下列程序段跳转的条件
(1)xoraxlelehjeequal2testal10000001bjnzthere3cmpcx64hjbthere答⑴ax=1e1eh;⑵al=1******1b;⑶cx64h
2.18如下是一段软件延时程序,请问NOP指令执行了多少次?xorcxcxdelay:noploopdelay答
655362.19有一个首地址为array的20个字的数组,说明下列程序段的功能movcx20movax0movsiaxsumlp:addaxarray[si]addsi2loopsumlpmovtotalax答将array数组的20个字无进位累加,其和存入total单元
2.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],1incbxlooplp
12.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”my2bdb20my3bdb14hmy4bdb00010100bmy5wdw20dupmy6cequ100my7cequPersonalComputer3.14设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容;数据段org100hvarwdw1234h5678hvarbdb34varddd12345678hbuffdb10dupmessdb‘hello’;代码段movaxoffsetmessmovaxtypebuff+typemess+typevardmovaxsizeofvarw+sizeofbuff+sizeofmessmovaxlengthofvarw+lengthofvard答offsetvarb=0104hoffsetmess=0114htypebuff=1;typemess=1;typevard=4sizeofvarw=4;sizeofbuff=10;sizeofmess=5lengthofvarw=2;lengthofvard=13.15假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的具体错误原因⑴movbyteptr[bx]10002movbxoffsetmyword[si]3cmpmybyte1mybyte24movmybyte1al+15subalmyword6jnzmyword答⑴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数码管的显示代码表为LEDtabledb0c0h0f9h0a4h0b0h99h92h82h0f8hdb80h90h88h83h0c6h0c1h86h8eh它依次表示0~9,A~F这16个数码的显示代码现编写一个程序实现将lednum中的一个数字(0~
9、A~F)转换成对应的LED显示代码答stacksegmentstackdb100hdupstackendsdatasegmentledtabledb0c0h0f9h0a4h0b0h99h92h82h0f8hdb80h90h88h83h0c6h0c1h86h8ehlednumdb3dataendscodesegmentcodeassumecs:codess:stackds:datastart:movaxdatamovdsaxleabxledtablemovallednumxlatmovax4c00hint21hcodeendsendstart解析stack 段是缺省的堆栈段时写成 stack segment para stackstack 比较简单省事儿,因为这样链接程序会自动设置 exe 可执行文件里初始堆栈指针,程序里就不用自己进行设置了如果没有最后的那个 stack 说明项,就需要自己设置 ss:sp stack是类别名把我定义的stack segment关联到栈,省去了assume ss:stack对么,所以我可以写成stack segment stack.3.18编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中假设变量存放的是8位有符号数答datasegmentxdb13ydb-3zdbdataendsstacksegmentstackdb100dupstackendscodesegmentcodeassumecs:codeds:datass:stackstart:movaxdatamovdsaxmovalxmovahycmpalahjbechangemovzahjmpdonechange:movzaldone:movax4c00hint21hcodeendsendstart3.19设变量bufX为有符号数16位数,请将它的符号状态保存在signX即如果变量值大于等于0,保存0;如果X小于0,保存-
1.编写该程序答datasegmentbuffxdw13signxdwdataendsstacksegmentstackdb100dupstackendscodesegmentcodeassumecs:codeds:datass:stackstart:movaxdatamovdsaxmovaxbuffx;ax=13cmpax0jbechangemovsignx0jmpdonechange:movsignx-1done:movax4c00hint21hcodeendsendstart3.20bufX、bufY和bufZ是3个有符号十六进制数,编写一个比较相等关系的程序
(1)如果这3个数都不相等,则显示0
(2)如果这3个数中有两个数相等,则显示1
(3)如果这3个数都相等,则显示2答datasegmentbufxdb13bufydb-3bufzdb-3dataendsstacksegmentstackdb100dupstackendscodesegmentcodeassumecs:codeds:datass:stackstart:movaxdatamovdsaxmovalbufxmovblbufymovclbufzcmpalbljecaccmpalcljeview1cmpblcljeview1movdl0jmpviewcac:cmpalcljeview2view1:movdl1jmpviewview2:movdl2view:movah02hint21hmovax4c00hint21hcodeendsendstart3.21例
3.7中,如果要实现所有为1的位都顺序执行相应的处理程序段(而不是例题中仅执行最低为1位的处理程序段),请写出修改后的代码段?答datasegmentnumberdb78haddrsdwoffsetfun0offsetfun1offsetfun2offsetfun3offsetfun4offsetfun5offsetfun6offsetfun7dataendsstacksegmentstackdb100dupstackendscodesegmentcodeassumecs:codeds:datass:stackstart:movaxdatamovdsaxmovdhnumbermovcx8movbx0lp1:shrdh1jcnextagain:incbxincbxlooplp1jmpdonenext:jmpaddrs[bx]fun0:movdl0jmpviewfun1:movdl1jmpviewfun2:movdl2jmpviewfun3:movdl3jmpviewfun4:movdl4jmpviewfun5:movdl5jmpviewfun6:movdl6jmpviewfun7:movdl7jmpviewview:movah02hint21hjmpagaindone:movax4c00hint21hcodeendsendstart3.22编制程序完成12H45HF3H6AH20HFEH90HC8H57H和34H共10个无符号字节数据之和,并将结果存入字节变量SUM中(不考虑进位)答datasegmentnumdb12h45h0f3h6ah20h0feh90h0c8h57h34hsumdbdataendsstacksegmentstackdb100dupstackendscodesegmentcodeassumecs:codeds:datass:stackstart:movaxdatamovdsaxmovcx10leabxnumagain:moval[bx]addsumalincbxloopagainmovax4c00hint21hcodeendsendstart3.23求主存0040H0开始的一个64KB物理段中共有多少个空格?答stacksegmentstackdb100dupstackendscodesegmentcodeassumecs:codess:stackstart:movax0040hmovesaxmovdi0movcx0movbx0movalagain:scasbjnenextincbxnext:deccxjneagainmovax4c00hint21hcodeendsendstart3.24编写计算100个正整数之和的程序如果和不超过16位字的范围
(65535),则保存其和到wordsum,如超过则显示‘overflow!’答datasegmentnumdw100dup800sumdwmsgdbOverflow!1310$dataendsstacksegmentstackdb100dupstackendscodesegmentcodeassumecs:codeds:datass:stackstart:movaxdatamovdsaxmovcx100leabxnummovax0again:addax[bx]incbxincbxjcerrloopagainmovsumaxjmpdoneerr:movdxoffsetmsgmovah09hint21hdone:movax4c00hint21hcodeendsendstart3.25编制程序完成将一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数转换算法可以是用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;一次用余数除以
100、10和1,得到“百位”、“十位”和“个位”答datasegmentbnumdw19982dnumdb5dup$dataendsstacksegmentstackdb100dupstackendscodesegmentcodeassumecs:codeds:datass:stackstart:movaxdatamovdsaxmovaxbnumleabxdnummovdl0cwdmovcx10000divcxaddal30hmov[bx]alincbxmovaxdxcwdmovcx1000divcxaddal30hmov[bx]alincbxmovaxdxcwdmovcx100divcxaddal30hmov[bx]alincbxmovaxdxcwdmovcx10divcxaddal30hmov[bx]alincbxadddl30hmov[bx]dlmovdxoffsetdnummovah09hint21hmovax4c00hint21hcodeendsendstart3.27编写一个源程序,在键盘上按一个键,将从AL返回的ASCII码值显示出来,如果按下ESC键则程序退出答stacksegmentstackdb100hdupstackendscodesegmentcodeassumecs:codess:stackstart:movah07hint21hcmpal1bhjedonepushaxmovdlalmovcl4shrdlclcallhtoascmovah02hint21hpopaxmovdlalanddl0fhcallhtoascmovah02hint21hjmpstartdone:movax4c00hint21hhtoascprocadddl30hcmpdl39hjbehtoendadddl7htoend:rethtoascendpcodeendsendstart3.28请按如下说明编写子程序;子程序功能把用ASCII码表示的两位十进制数转换位对应二进制数;入口参数DH=十位数的ASCII码,DL=个位数的ASCII码;出口参数AL=对应的二进制数答stacksegmentstackdb100hdupstackendscodesegmentcodeassumecs:codess:stackstart:movdx3932hcallasctohmovax4c00hint21hasctohprocpushcxsubdx3030hmovcl10movaldhmulcladdaldlpopcxretasctohendpcodeendsendstart3.29调用HTOASC子程序,编写显示一个字节的16进制数、后跟“H”的子程序答stacksegmentstackdb100hdupstackendscodesegmentcodeassumecs:codess:stackstart:movah07hint21hcmpal1bhjedonecallhtoahjmpstartdone:movax4c00hint21hhtoahprocpushaxpushcxpushdxpushaxmovdlalmovcl4shrdlclcallhtoascmovah02hint21hpopaxmovdlalanddl0fhcallhtoascmovah02hint21hmovdlHmovah02hint21hpopdxpopcxpopaxrethtoahendphtoascprocadddl30hcmpdl39hjbehtoendadddl7htoend:rethtoascendpcodeendsendstart3.30写一个子程序,根据入口参数AL=
0、
1、2,依次实现对大些字母转换成小写、小写转换成大写或大小写字母互换欲转换的字符串在string中,用0表示结束答datasegmentstringdbabcDEfGh$dataendsstacksegmentstackdb100dupstackendscodesegmentcodeassumecs:codeds:datass:stackstart:movaxdatamovdsaxmoval2callchangemovdxoffsetstringmovah09hint21hmoval0callchangemovdxoffsetstringmovah09hint21hmoval1callchangemovdxoffsetstringmovah09hint21hmovax4c00hint21hchangeprocleabxstringcmpal0jecg1cmpal1jecg2cg3: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=10arraydbcountdup10hcheckdbdataendsstacksegmentstackdb100dupstackendscodesegmentcodeassumecs:codeds:datass:stackstart:movaxdatamovdsaxmovaxcountpushaxmovaxoffsetarraypushaxcallsumcheckmovcheckalmovax4c00hint21hsumcheckprocpushbpmovbpsppushbxpushcxmovbx[bp+4]movcx[bp+6]moval0sum1:addal[bx]incbxloopsum1popcxpopbxpopbpret4sumcheckendpcodeendsendstart。