您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 《汇编语言与接口技术》习题解答(第三章)
1问题:画图说明下列语句分配的存储空间及初始化的数据值解答:(1)byte_varDB'ABC',10,10h,'EF',3DUP(-1,?,3DUP(4))(2)word_varDW10h,-5,3DUP(?)习题3.10‘A’‘B’‘C’1010h‘E’‘F’-1-444...41h42h43h0ah10h45h46hffh-04h04h04h3个10h0FBhFFh------10h-5???3.16解:movah,1;只允许输入小写字母int21hsubal,20h;转换为大写字母movdl,almovah,2int21h;显示3.18解:movax,bufXcmpax,bufYjgedonemovax,bufYdone:movbufZ,ax3.19解:.modelsmall.stack.databufXdw-7signXdb?.code.startupcmpbufX,0;testbufX,80h2jlnext;jnznextmovsignX,0jmpdonenext:movsignX,-1done:.exit0end3.20解:movdl,’2’movax,bufXcmpax,bufYjenext1decdlnext1:cmpax,bufZjenext2decdlnext2:movah,2int21h3.22编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。;wjxt322.asm.modelsmall.stack.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;完了,存结果.exit0end3.30解:lucaseprocpushbxmovbx,offsetstringcmpal,0jecase03cmpal,1jzcase1cmpal,2jzcase2jmpdonecase0:cmpbyteptr[bx],0jedonecmpbyteptr[bx],’A’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],20hjmpnext2next20:cmpbyteptr[bx],’a’jbnext2cmpbyteptr[bx],’z’janext2subbyteptr[bx],20hnext2:incbxjmpcase2done:popbxretlucaseendp4习题3.1解答:参考教材(第60页)习题3.6问题:给出你采用一个源程序格式书写的例题3.1源程序解答:.modelsmall.stack.datastringdb’Hello,Assembly!’,0dh,0ah,’$’.codestart:movax,@datamovds,axmovdx,offsetstringmovah,9int21hmovax,4c00hint21hendstart习题3.12解答:ORG伪指令习题3.13解答:段地址和偏移地址属性,类型属性习题3.26问题:过程定义的一般格式是怎样的?子程序开始为什么常有PUSH指令、返回前为什么常有POP指令?下面完成16位无符号数累加的子程序有什么不妥吗?若有,请改正:解答:crazyPROC;crazyPROCpushax;xorax,ax;xorax,axxordx,dx;xordx,dxagain:addax,[bx];again:addax,[bx]adcdx,0;adcdx,0incbx;incbxincbx;incbx5loopagain;loopagainret;retENDPcrazy;crazyENDP字量求和子程序入口参数:BX=数据首址CX=数据个数出口参数:AX=和的低字DX=和的高字(进位部分)习题3.28问题:请按如下说明编写子程序:;子程序功能:把用ASCII码表示的两位十进制数转换为对应二进制数;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码;出口参数:AL=对应的二进制数解答:asctobprocpushcx;先转换十位数anddh,0fhshldh,1;乘以10movch,dhshldh,1shldh,1adddh,ch;转换个位数anddl,0fh;十位数加个位数adddh,dl;设置出口参数moval,dhpopcxretasctobendp6习题3.34-1问题:编写一个计算字节校验和的子程序。所谓“校验和”是指不记进位的累加,常用于检查信息的正确性。主程序提供入口参数,有数据个数和数据缓冲区的首地址。子程序回送求和结果这个出口参数。传递参数方法自定。解答:;数据段arraydb12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90hcountequ$-array;数组元素个数resultdb?;校验和;代码段(主程序)movbx,offsetarray;BX←数组的偏移地址movcx,count;CX←数组的元素个数callchecksum;调用求和过程movresult,al;处理出口参数习题3.34-2;代码段(子程序);计算字节校验和的通用过程;入口参数:DS:BX=数组的段地址:偏移地址CX=元素个数;出口参数:AL=校验和;说明:除AX/BX/CX外,不影响其他寄存器checksumprocxoral,al;累加器清0sum:addal,[bx];求和incbx;指向下一个字节loopsumretchecksumendp〔习题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显示代码。〔解答〕;数据段LEDtabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hdb80h,90h,88h,83h,0c6h,0clh,86h,8ehlednumdb0ah;代码段7movbx,offsetLEDtablemoval,lednumxlat;al中存有对应的LED显示代码〔习题3.21〕例题3.7中,如果要实现所有为1的位都顺序执行相应的处理程序段(而不是例题中仅执行最低为1位的处理程序段),请写出修改后的代码段。〔解答〕;代码段moval,numbermovbx,0;BX←记录为1的位数restart:cmpal,0;AL=0结束jzdoneagain:shral,1;最低位右移进入CFjcnext;为1,转移incbx;不为1,继续jmpagainnext:pushaxpushbxshlbx,1;位数乘以2(偏移地址要用2个字节单元)jmpaddrs[bx];间接转移:IP←[table+BX];以下是各个处理程序段fun0:movdl,'0'jmpdispfun1:movdl,'1'jmpdispfun2:movdl,'2'jmpdispfun3:movdl,'3'jmpdispfun4:movdl,'4'jmpdispfun5:movdl,'5'jmpdispfun6:movdl,'6'jmpdispfun7:movdl,'7'jmpdispdisp:movah,2;显示一个字符int21hpopbxpopaxjmprestartdone:…8〔习题3.24〕编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘Overflow!’。〔解答〕;数据段countequ100parraydwcountdup(?);假设有100个数据wordsumdw0msgdb‘overflow’,’$’;代码段movcx,countmovax,0movbx,offsetparrayagain:addax,[bx]jncnextmovdx,offsetmsgmovah,9int21h;显示溢出信息jmpdone;然后,跳出循环体next:addbx,2loopagainmovwordsum,axdone:…〔习题3.25〕编程把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以100、10和1,得到“百位”、“十位”和“个位”。〔解答〕;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,余数dx9movdbcd[si],al;商<10,存结果pushdx;暂存余数movax,bx;除数除于10movdx,0divcx;dx.ax除于cx,商ax、余数0存在dxmovbx,ax;bx是除数popdxdecsi;目的数据位移量减1jnzagainmovdbcd,dl;存个位数(10).exit0end〔习题3.27〕编写一个源程序,在键盘上按一个键,将从AL返回的ASCII码值显示出来,如果按下ESC键则程序退出。请调用书中的HTOASC子程序。〔解答〕again:movah,1int21hcmpal,1bh;ESC的ASCII码是1bhjedonecallhtoascmovah,2int21hjmpagaindone:〔习题3.29〕调用HTOASC子程序,编写显示一个字节的16进制数、后跟“H”的子程序。〔解答〕DIPASCproc;入口参数:AL=要显示的一个16进制数pushcxpushdxpushaxmovcl,4;转换高位shral,clcallHTOASCmovdl,al;显示movah,2int21hpopax;转换低位callHTOASCmovdl,al;显示movah,2int21hmovdl,’H’;显示一个字母“H”10movah,2int21hpopdxpopcxretDIPASCendpHTOASCproc;将AL低4位表达的一位16进制数转换为ASCII码andal,0fhcmpal,9jbehtoasc1addal,37h;是0AH~0FH,加37H转换为ASCII码ret;子程序返回htoasc1:addal,30h;是0~9,加30H转换为ASCII码ret;子程序返回HTOASCendp〔习题3.35〕编制3个子程序把一个16位二进制数用4位16进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并配合3个主程序验证它。⑴采用AX寄存器传递这
本文标题:《汇编语言与接口技术》习题解答(第三章)
链接地址:https://www.777doc.com/doc-2841430 .html