汇编语言程序设计(第四版)第4章【课后答案】

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

-1-汇编语言程序设计第四版【课后习题答案】--囮裑為檤第4章基本汇编语言程序设计〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。〔解答〕思路:首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成:.modelsmall.stack256.dataqvardq1234567887654321h.code.startupmovcx,7movsi,1again:moval,byteptrqvar[si]movbyteptrqvar[si-1],alincsiloopagaintestal,80hjzezzmovbl,0ffhjmpdoneezz:movbl,0done:movbyteptrqvar[7],bl.exit0end〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。〔解答〕思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带CF位循环左移一次(内循环共8次),外循环体控制执行7次即可。.modelsmall.stack256.dataqvardq1234567887654321h-2-.code.startupmovdx,7;外循环次数movax,byteptrqvar[0];最低位字节送axlpp:shlax,1;最低位字节左移一次,其d7移入CF位movsi,1movcx,7;内循环次数again:rclbyteptrqvar[si],1;高位字节依次左移P50incsiloopagaindecdxjnzlpp.exit0.end〔习题4.3〕将AX寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL、BL、CL和DL寄存器中。〔解答〕思路:设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。仅列出代码段:movbl,al;将al中的两组分开andal,0fh;屏蔽高四位后送almovcl,4;原al中的数据逻辑右移4次送blshrbl,clmovdl,ah;将ah中的两组分开anddl,0f0h;屏蔽低高四位后送dlmovcl,4;原ah中的数据逻辑右移4次送dlshrdl,clmovcl,ah;屏蔽高四位后送clandcl,0fh〔习题4.4〕编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。〔解答〕getkey:movah,1;从键盘输入,出口:al存键值int21hcmpal,'a';判键值是小写字母?jbgetkaycmpal,'z'jagetkaysubal,20h;是小写字母转换为大写字母movdl,almovah,02h;显示int21h〔习题4.5〕已知用于LED数码管显示的代码表为:-3-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显示代码。〔解答〕.modelsmall.stack256.dataLEDtableDB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB80h,90h,88h,83h,0c6h,0clh、86h,8ehlednumDB?.code.startupmovbx,offsetLEDtablemoval,lednumxlat;al中存有对应的LED显示代码.exit0end〔习题4.6〕编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量存放的是8位无符号数。〔解答〕.modelsmall.stack256.databufxdb?bufYdb?bufzdb?.code.startupmoval,bufXmovbl,bufYcmpal,bljanextmovbufZ,bljmpdonenext:movbufZ,aldone:.exit0end〔习题4.7〕设变量bufX为有符号16位数,请将它的符号状态保存在signX,即:如果X大于等于0,保存0;如果X小于0,保存-1(ffh)。编写该程序。〔解答〕.modelsmall-4-.stack.databufXdw-7signXdb?.code.startupcmpbufX,0;testbufX,80hjlnext;jnznextmovsignX,0jmpdonenext:movsignX,-1done:.exit0end〔习题4.8〕bufX、bufY和bufZ是3个有符号16进制数,编写一个比较相等关系的程序:(1)如果这3个数都不相等,则显示0;(2)如果这3个数中有两个数相等,则显示1;(3)如果这3个数都相等,则显示2。〔解答〕.modelsmall.stack256.databufxdw?bufYdw?bufzdw?.code.startupmovax,bufXmovbx,bufYmovcx,bufZmovdl,'0'cmpax,bxjnznext1incdlnext1:cmpax,cxjnznext2incdlnext2:cmpbx,cxjnznext3incdlnext3:cmpdl,’3’jbnext4movdl,’2’next4:movah,02h;显示-5-int21h.exit0end〔习题4.9〕例题4.8内外循环次数共是多少?如果要求按从大到小排序,程序如何修改?〔解答〕外循环次数是:count-1次(19次)内循环次数是:(count-1)!次(19!次)内外循环次数共是count-1+(count-1)!次,即19+19!次〔习题4.10〕串操作指令常要利用循环结构,现在不用串操作指令实现字符串string1内容传送到字符串string2,字符长度为count。〔解答〕.modelsmall.stack256.datastring1db'goodmorning!'len=$-string1string2dblendup(?).code.startupmovcx,len;字符数movsi,offsetstring1;源指针movdi,offsetstring2;目标指针again:moval,[si];送一个字符mov[di],alincsi;修改指针incdi;修改指针loopagain;cx=cx-1,cx=0时退出循环.exit0end〔习题4.11〕不用串操作指令求主存0040h:0开始的一个64KB物理段中共有多少个空格?〔解答〕这里仅列出主程序段:movax,0040h;送段地址movds,axxorsi,si;偏移量地址xorcx,cx;计数(循环次数)xordx,dx;空格计数器清零again:cmp[si],20h;与空格的ASCII码比较jnenext;不是空格,转incdx;是空格,空格数加1next:incsi;修改地址指针-6-loopagain;cx=cx-1,如cx=0退出循环.exit0end〔习题4.12〕编程实现把键入的一个字符,用二进制形式(0/1)显示出它的ASCII代码值。〔解答〕.modelsmall.stack256.datastri1db'pleaseinput',0dh,0ah,'$'.code.startupmovdx,offsetstri1movah,09hint21hmovah,01hint21hmovcx,8again:xordl,dlshlal,1adcdl,'0'movah,02hint21hloopagain.exit0end〔习题4.13〕编写程序,要求从键盘接收一个数bellN(0~9),然后响铃bellN次。〔解答〕.modelsmall.stack.datastri1db'pleaseinputnumber:1--9',0dh,0ah,'$'.code.startupagain:movdx,offsetstri1;显示stri1,提示输入movah,09hint21hmovah,01h;调用输入一个字符int21h;输入一个字符存在al中cmpal,'1';判该字符,如不在‘1’--‘9’jbagain;重新输入cmpal,'9'-7-jaagainandal,0fh;在‘1’--‘9’,屏蔽高4位movcl,al;振铃次数送cxxorch,chabc:movdl,07h;调用一次振铃movah,02hint21hloopabc.exit0end〔习题4.14〕编写程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:正数数组arrayP和负数数组arrayN,并分别把这两个数组中的数据个数显示出来。〔解答〕.modelsmallincludeio.inc.stack.dataarrayMdb1,2,3,4,5,6,0,-3,-5,-6,0,7,6,90,-18,-23,34,7,9,8;源数组arrayPdb20dup(?);正数数组arrayNdb20dup(?);负数数组dispPdb'PlusNumber:','$'dispNdb0dh,0ah,'NegsNumber:','$'.code.startupmovcx,20;源数组元素数xorbx,bx;设bh为正数个数,bl为负数个数,均清零xorsi,si;源数组地址位移量again:;循环20次movax,arrayM[si];取一个元素cmpax,0;判正数jlNegincbh;是,正数个数加1jmpnextNeg:incbl;否,负数个数加1next:incsi;修改位移量loopagain;循环次数减1movah,09h;调用显示字符串功能movdx,offsetdispP;显示个数int21hmoval,bhcalldispuib;调用I/O子程序库中的子程序movah,09h;调用显示字符串功能movdx,offsetdispN;显示个数-8-int21hmoval,blcalldispuib;调用I/O子程序库中的子程序.exit0end〔习题4.15〕编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。〔解答〕.modelsmall.stack.datanumequ100wlistdwnumdup(?)wordsumdw?errordb'overflow.$'.code.startupmovbx,offsetwlistmovcx,numxorax,axagain:addax,[bx]jcnextincbxincbxloopagainmov[bx],axjmpdonenext:movdx,offseterrormovah,9int21hdone:.exit0end〔习题4.16〕编程判断主存0070h:0开始的1KB中有无字符串‘DEBUG’。这是一个字符串包含的问题,可以采用逐个向后比较的简单算法。〔解答〕.modelsmall.stack.datadisp1db'ThereisDEBUGintheaera!',0dh,0ah,‘$'disp2db'ThereisnoDEBUGintheaera!',0dh,0ah,‘$'.code.startup-9-movax,0070h;送段地址movds,axxorsi,si;地址指针清零movcx,1024cmp[si],'D';与‘D'比较jnenext;不是,转incsi;是,地址增1cmp[si],'E';同上jnenextincsicmp[si],'B'jnenextincsicmp[si],'U'jnenextincsicmp[si],'G'jeyes

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功