• 242.19 KB
  • 2022-04-22 11:43:46 发布

16 32位微机原理 汇编语言及接口技术 第2版 (钱晓捷 陈涛 著) 机械工业出版社 课后答案

  • 18页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!《16/32位微机原理、汇编语言及接口技术》习题解答第2章微处理器指令系统(习题2)2.20按照下列要求,编写相应的程序段:⑴起始地址为string的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。movdl,string[1]movdh,string[6]⑵有两个32位数值,按“小端方式”存放在两个缓冲区buffer1和buffer2中,编写程序段完成DX.AX←buffer1-buffer2功能。movax,wordptrbuffer1subax,wordptrbuffer2;先减低16位movdx,wordptrbuffer1+2sbbdx,wordptrbuffer2+2;后减高16位,需减低16位的借位⑶编写一个程序段,在DX高4位全为0时,使AX=0;否则使AX=-1。testdx,0f0课后答案网00hjznextmovax,-1www.hackshp.cnjmpdonenext:movax,0done:…⑷把DX.AX中的双字右移4位答:movcx,4again:shrdx,1;右移一位,移出的低位进入CF标志rcrax,1;将CF移进AX高位,同时实现AX右移loopagain;循环4次,实现4位右移⑸有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出或借1 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!位)存于原处。movcx,100movbx,0again:subarray[bx],1incbxloopagain2.21AAD指令是用于除法指令之前,进行非压缩BCD码调整的。实际上,处理器的调整过程是:AL←AH×10+AL,AH←0。如果指令系统没有AAD指令,请用一个子程序完成这个调整工作。aadpprocpushbxshlah,1movbl,ahshlah,1shlah,1addbl,ahaddal,blmovah,0popbxretaadpendp课后答案网2.23答:htoascprocwww.hackshp.cnpushdxandal,0fhaadal,90hdaaadcal,40hdaamovdl,almovah,2int21h;显示个位数popdxrethtoascendp2 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!2.24答:dispascprocpushdxxorah,ahaamaddax,3030hpushaxmovdl,ahmovah,2int21h;显示十位数popaxmovdl,almovah,2int21h;显示个位数popdxretdispascendp2.25编写一个程序段:先提示输入数字“InputNumber:0~9”,然后在下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误“Error!”,继续等待输入数字。答:;数据段inmsgdb‘InputNumber课后答案网:0~9’,0dh,0ah,’$’ermsgdb‘Error!’,’$’;代码段www.hackshp.cnmovdx,offsetinmsgmovah,9int21h;显示输入数字0~9again:movah,1int21h;接受一个字符cmpal,’0’;判断是否输入的是数字0~9jberdispcmpal,’9’jaerdispmovdl,almovah,2int21h;显示输入的数字jmpdone;结束3 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!erdisp:movdx,offsetermsgmovah,9int21h;显示输入错误jmpagain;继续输入done:…第3章汇编语言程序设计(习题3)3.16解:movah,1;只允许输入小写字母int21hsubal,20h;转换为大写字母movdl,almovah,2int21h;显示3.17解:movbx,offsetLEDtablemoval,lednumxlat3.18解:movax,课后答案网bufXcmpax,bufYwww.hackshp.cnjaedonemovax,bufYdone:movbufZ,ax3.19解:.modelsmall.stack.databufXdw-7signXdb?.code.startupcmpbufX,0;testbufX,80h4 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!jlnext;jnznextmovsignX,0jmpdonenext:movsignX,-1done:.exit0end3.20解:movdl,’2’movax,bufXcmpax,bufYjenext1decdlnext1:cmpax,bufZjenext2decdlnext2:movah,2int21h3.21解:;代码段moval,numbermovbx,0;BX课后答案网←记录为1的位数restart:cmpal,0;AL=0结束jzdonewww.hackshp.cnagain:shral,1;最低位右移进入CFjcnext;为1,转移incbx;不为1,继续jmpagainnext:pushaxpushbxshlbx,1;位数乘以2(偏移地址要用2个字节单元)jmpaddrs[bx];间接转移:IP←[table+BX];以下是各个处理程序段fun0:movdl,"0"jmpdispfun1:movdl,"1"jmpdisp5 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!fun2:movdl,"2"jmpdispfun3:movdl,"3"jmpdispfun4:movdl,"4"jmpdispfun5:movdl,"5"jmpdispfun6:movdl,"6"jmpdispfun7:movdl,"7"jmpdisp;disp:movah,2;显示一个字符int21hpopbxpopaxjmprestartdone:…3.22编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。;wjxt322.asm课后答案网.modelsmall.stackwww.hackshp.cn.datab_datadb12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h;原始数据numequ10;数据个数sumdb?;预留结果单元.code.startupxorsi,si;位移量清零xoral,al;取第一个数movcx,num;累加次数again:addal,b_data[si];累加incsi;指向下一个数loopagain;如未完,继续累加movsum,al;完了,存结果6 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!.exit0end3.23求主存0040h:0开始的一个64KB物理段中共有多少个空格?;wjxt323.asm.modelsmall.codestart:movax,0040h;送段地址movds,axmovsi,0;偏移地址movcx,si;计数(循环次数)xorax,ax;空格计数器清零again:cmpbyteptr[si],20h;与空格的ASCII码比较jnenext;不是空格,转incax;是空格,空格数加1next:incsi;修改地址指针loopagain;cx=cx-1,如cx=0退出循环.exit0endstart3.24编写计算100个16位正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。答:课后答案网;数据段countequ100www.hackshp.cnparraydwcountdup(?);假设有100个数据wordsumdw0msgdb‘overflow’,’$’;代码段movcx,countmovax,0movbx,offsetparrayagain:addax,[bx]jncnextmovdx,offsetmsgmovah,9int21h;显示溢出信息jmpdone;然后,跳出循环体7 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!next:addbx,2loopagainmovwordsum,axdone:…3.25编程把—个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以l00、10和l,得到“百位”、“十位”和“个位”。;wjxt325.asm.modelsmall.stack256.dataarraydw?;源字数据dbcddb5dup(?);五位bcd结果,高对高低对低.code.startupmovdx,array;取源数据(余数)movbx,10000;除数movcx,10;除数系数movsi,4;目的数据高位位移量again:movax,dx;dx.ax中存放被除数movdx,0divbx课后答案网;除于bx,商ax,余数dxmovdbcd[si],al;商<10,存结果pushdxwww.hackshp.cn;暂存余数movax,bx;除数除于10movdx,0divcx;dx.ax除于cx,商ax、余数0存在dxmovbx,ax;bx是除数popdxdecsi;目的数据位移量减1jnzagainmovdbcd,dl;存个位数(<10).exit0end3.27解(不需调用HTOASC子程序):again:movah,18 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!int21hcmpal,1bh;ESC的ASCII码是1bhjedonemovdl,almovah,2int21h;是大写字母则转换为小写字母jmpagaindone:…3.28请按如下说明编写子程序:;子程序功能:把用ASCII码表示的两位十进制数转换为对应二进制数;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码;出口参数:AL=对应的二进制数答:asctobprocpushcxanddh,0fh;先转换十位数shldh,1;十位数乘以10(采用移位指令)movch,dhshldh,1shldh,1adddh,chanddl,0fh课后答案网;转换个位数adddh,dl;十位数加个位数moval,dhwww.hackshp.cn;设置出口参数popcxretasctobendp3.29解:DIPASCproc;入口参数:AL=要显示的一个16进制数pushcxpushdxpushaxmovcl,4;转换高位shral,clcallHTOASCmovdl,al;显示9 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!movah,2int21hpopax;转换低位callHTOASCmovdl,al;显示movah,2int21hmovdl,’H’;显示一个字母“H”movah,2int21hpopdxpopcxretDIPASCendpHTOASCproc;将AL低4位表达的一位16进制数转换为ASCII码andal,0fhcmpal,9jbehtoasc1addal,37h;是0AH~0FH,加37H转换为ASCII码ret;子程序返回htoasc1:addal,30h;是0~9,加30H转换为ASCII码ret;子程序返回HTOASCendp课后答案网3.30解:www.hackshp.cnlucaseprocpushbxmovbx,offsetstringcmpal,0jecase0cmpal,1jzcase1cmpal,2jzcase2jmpdonecase0:cmpbyteptr[bx],0jedonecmpbyteptr[bx],’A’10 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!jbnext0cmpbyteptr[bx],’Z’janext0addbyteptr[bx],20hnext0:incbxjmpcase0case1:cmpbyteptr[bx],0jedonecmpbyteptr[bx],’a’jbnext1cmpbyteptr[bx],’z’janext1subbyteptr[bx],20hnext1:incbxjmpcase1case2:cmpbyteptr[bx],0jedonecmpbyteptr[bx],’A’jbnext2cmpbyteptr[bx],’Z’janext20addbyteptr[bx],20hjmpnext2课后答案网next20:cmpbyteptr[bx],’a’jbnext2www.hackshp.cncmpbyteptr[bx],’z’janext2subbyteptr[bx],20hnext2:incbxjmpcase2done:popbxretlucaseendp3.33解:方法1:neg32proc;入口参数:DX.AX=32位有符号数negax;实现0-DX.AX功能11 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!negdxsbbdx,0;这条指令也可以用decdx代替retneg32endp;出口参数:DX.AX=32位有符号数的补码方法2:neg32proc;入口参数:DX.AX=32位有符号数notax;实现DX.AX求反加1notdxaddax,1adcdx,0retneg32endp;出口参数:DX.AX=32位有符号数的补码3.34解:;数据段arraydb12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h;数组countequ$-array;数组元素个数resultdb?;校验和;代码段movbx,offsetarray;BX←数组的偏移地址movcx,count;CX←数组的元素个数callchecksum;调用求和过程movresult,al课后答案网;处理出口参数movax,4c00hint21hwww.hackshp.cn;计算字节校验和的通用过程;入口参数:DS:BX=数组的段地址:偏移地址,CX=元素个数;出口参数:AL=校验和;说明:除AX/BX/CX外,不影响其他寄存器checksumprocxoral,al;累加器清0sum:addal,[bx];求和incbx;指向下一个字节loopsumretchecksumendpend12 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!3.35解:⑴.modelsmall.stack.datawdatadw34abh.code.startupmovax,wdatacalldispa.exit0;dispaprocpushcxpushdxmovcl,4movdl,ahshrdl,clcalldldispmovdl,ahanddl,0fhcalldldispmovdl,al课后答案网shrdl,clcalldldispwww.hackshp.cnmovdl,alanddl,0fhcalldldisppopdxpopcxretdispaendp;dldispprocpushaxordl,30hcmpdl,39hjbedldisp113 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!adddl,7dldisp1:movah,2int21hpopaxretdldispendpend⑵.modelsmall.stack.datawdatadw34abhwordtempdw?.code.startupmovax,wdatamovwordtemp,axcalldispa.exit0;dispaprocpushcxpushdx课后答案网movcl,4movdl,byteptrwordtemp+1www.hackshp.cnshrdl,clcalldldispmovdl,byteptrwordtemp+1anddl,0fhcalldldispmovdl,byteptrwordtempshrdl,clcalldldispmovdl,byteptrwordtempanddl,0fhcalldldisppopdxpopcx14 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!retdispaendp;dldispprocpushaxordl,30hcmpdl,39hjbedldisp1adddl,7dldisp1:movah,2int21hpopaxretdldispendpend⑶.modelsmall.stack.datawdatadw34abh.code.startuppushwdata课后答案网calldispapopaxwww.hackshp.cn;addsp,2.exit0;dispaprocpushbpmovbp,sppushaxpushcxpushdxmovax,[bp+4]movcl,4movdl,ahshrdl,clcalldldisp15 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!movdl,ahanddl,0fhcalldldispmovdl,alshrdl,clcalldldispmovdl,alanddl,0fhcalldldisppopdxpopcxpopaxpopbpretdispaendp;dldispprocpushaxordl,30hcmpdl,39hjbedldisp1adddl,7dldisp1:movah,2课后答案网int21hpopaxwww.hackshp.cnretdldispendpend3.40编写一个宏指令movedoprnd,soprnd,它实现任意寻址方式的字量源操作数soprnd送到目的操作数doprnd,包括存储单元到存储单元的传送功能。答:movemacrodoprnd,soprndmovax,soprndmovdoprnd,axendm3.41定义一个宏logical,用它代表4条逻辑运算指令:and/or/xor/test。注意需要利用316 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!个形式参数,并给出一个宏调用以及对应宏展开的例子。答:logicalmacrolcode,dopd,sopdlcodedopd,sopdendm例如,如果使用“andax,[bx]”指令,可以利用该宏定义,写出宏指令如下:logicaland,ax,[bx]3.42解:utolmacrolocalnextcmpal,’A’;小于“A”不转换jbnextcmpal,’Z’;大于“A”不转换janextaddal,20h;是大写字母则转换为小写字母next:endm3.43定义一个宏movestrstrn,dstr,sstr,它将strn个字符从一个字符区sstr传送到另一个字符区dstr解:(假设它们都在数据段)movestrmacro课后答案网strn,dstr,sstrmovcx,dsmoves,cxwww.hackshp.cnmovcx,strnmovdi,offsetdstrmovsi,offsetsstrcldrepmovsb;;重复传送ES:[DI]←DS:[SI]endm第10章微处理器指令系统(习题10)10.16;LED表tabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h17 课后答案网:www.hackshp.cn若侵犯了您的版权利益,敬请来信告知!;8255A初始化movdx,0fffbhmoval,10001001b;=89houtdx,al;控制程序again0:movdx,0fffahinal,dx;确定哪个开关闭合movcx,8movah,01h;movah,08hagain1:shral,1;shlal,1jncdisp0incah;decahloopagain1jmpdisp1;显示字段disp0:movbx,offsettablemoval,ahxlatmovdx,0fff8houtdx,aldisp1:movcx,8moval,01h课后答案网movdx,0fff9hdisp2:outdx,alwww.hackshp.cncalldelayshlal,1loopdisp2jmpagain018'