该【汇编语言程序设计(第四版)第4章【课后答案】 】是由【青山代下】上传分享,文档一共【42】页,该文档可以免费在线阅读,需要了解更多关于【汇编语言程序设计(第四版)第4章【课后答案】 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..汇编语言程序设计(第四版)第4章【课后答案】:..汇编语言程序设计第四版【课后习题答案】--囮裑為檤第4章基本汇编语言程序设计〔〕,如何修改程序。〔解答〕思路:首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成:.-2-:..movcx,7movsi,1again:moval,byteptrqvar[si]movbyteptrqvar[si-1],alincsiloopagaintestal,80hjzezzmovbl,0ffhjmpdoneezz:movbl,0done:movbyteptrqvar[7],〔〕,如何用移位指令实现。〔解答〕思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带CF位循环左移一次(内循环共8次),外循环体控制执行7次即可。-3-:...,7;外循环次数movax,byteptrqvar[0];最低位字节送axlpp:shlax,1;最低位字节左移一次,其d7移入CF位movsi,1movcx,7;内循环次数again:rclbyteptrqvar[si],1;-4-:..〔〕将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〔〕编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。-5-:..〔解答〕getkey:movah,1;从键盘输入,出口:al存键值int21hcmpal,'a';判键值是小写字母?jbgetkaycmpal,'z'jagetkaysubal,20h;是小写字母转换为大写字母movdl,almovah,02h;显示int21h〔〕已知用于LED数码管显示的代码表为:LEDtableDB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB80h,90h,88h,83h,0c6h,0c1h,86h,8eh它依次表示0~9、A~F这16个数码的显示代码。现编写一个程序实现将lednum中的一个数-6-:..字(0~9、A~F)转换成对应的LED显示代码。〔解答〕.,0f9h,0a4h,0b0h,99h,92h,82h,0f8hDB80h,90h,88h,83h,0c6h,0clh、86h,8ehlednumDB?.,offsetLEDtablemoval,lednumxlat;〔〕编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。假设变量存放的是8位无符号-7-:..数。〔解答〕.?bufYdb?bufzdb?.,bufXmovbl,bufYcmpal,bljanextmovbufZ,bljmpdonenext:movbufZ,aldone:.exit0end〔〕设变量bufX为有符号16位数,请将它的符号状态保存在signX,即:如果X大于-8-:..等于0,保存0;如果X小于0,保存-1(ffh)。编写该程序。〔解答〕.-7signXdb?.,0;testbufX,80hjlnext;jnznextmovsignX,0jmpdonenext:movsignX,-1done:.exit0end〔〕bufX、bufY和bufZ是3个有符号16进制数,编写一个比较相等关系的程序:(1)如果这3个数都不相等,则显示0;(2)如果这3个数中有两个数相等,则显示1;-9-:..()如果这3个数都相等,则显示2。〔解答〕.?bufYdw?bufzdw?.,bufXmovbx,bufYmovcx,bufZmovdl,'0'cmpax,bxjnznext1incdlnext1:cmpax,cxjnznext2incdlnext2:cmpbx,cxjnznext3-10-:..incdlnext3:jbnext4movdl,’2’next4:movah,02h;〔〕?如果要求按从大到小排序,程序如何修改?〔解答〕外循环次数是:count-1次(19次)内循环次数是:(count-1)!次(19!次)内外循环次数共是count-1+(count-1)!次,即19+19!次〔〕串操作指令常要利用循环结构,现在不用串操作指令实现字符串string1内容传送到字符串string2,字符长度为count。〔解答〕.modelsmall-11-:...'goodmorning!'len=$-string1string2dblendup(?).,len;字符数movsi,offsetstring1;源指针movdi,offsetstring2;目标指针again:moval,[si];送一个字符mov[di],alincsi;修改指针incdi;修改指针loopagain;cx=cx-1,cx=〔〕不用串操作指令求主存0040h:0开始的一个64KB物理段中共有多少个空格?〔解答〕-12-:..这里仅列出主程序段:movax,0040h;送段地址movds,axxorsi,si;偏移量地址xorcx,cx;计数(循环次数)xordx,dx;空格计数器清零again:cmp[si],20h;与空格的ASCII码比较jnenext;不是空格,转incdx;是空格,空格数加1next:incsi;修改地址指针loopagain;cx=cx-1,如cx=〔〕编程实现把键入的一个字符,用二进制形式(0/1)显示出它的ASCII代码值。〔解答〕.-13-:..stri1db'pleaseinput',0dh,0ah,'$'.,offsetstri1movah,09hint21hmovah,01hint21hmovcx,8again:xordl,dlshlal,1adcdl,'0'movah,〔〕编写程序,要求从键盘接收一个数bellN(0~9),然后响铃bellN次。〔解答〕.modelsmall-14-:...'pleaseinputnumber:1--9',0dh,0ah,'$'.:movdx,offsetstri1;显示stri1,提示输入movah,09hint21hmovah,01h;调用输入一个字符int21h;输入一个字符存在al中cmpal,'1';判该字符,如不在--‘9’jbagain;重新输入cmpal,'9'jaagainandal,0fh;在‘1’--‘9’,屏蔽高4位movcl,al;振铃次数送cxxorch,ch-15-:..abc:movdl,07h;调用一次振铃movah,〔〕编写程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:正数数组arrayP和负数数组arrayN,并分别把这两个数组中的数据个数显示出来。〔解答〕.,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:','$'-16-:...,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子程序库中的子程序-17-:..movah,09h;调用显示字符串功能movdx,offsetdispN;显示个数int21hmoval,blcalldispuib;调用I/〔〕编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。〔解答〕.(?)wordsumdw?errordb'overflow.$'.code-18-:...startupmovbx,offsetwlistmovcx,numxorax,axagain:addax,[bx]jcnextincbxincbxloopagainmov[bx],axjmpdonenext:movdx,offseterrormovah,9int21hdone:.exit0end〔〕编程判断主存0070h:0开始的1KB中有无字符串‘DEBUG’。这是一个字符串包含的问题,可以采用逐个向后比较的简单算法。〔解答〕.modelsmall-19-:...'ThereisDEBUGintheaera!',0dh,0ah,‘$'disp2db'ThereisnoDEBUGintheaera!',0dh,0ah,‘$'.,0070h;送段地址movds,axxorsi,si;地址指针清零movcx,1024cmp[si],'D';与‘D'比较jnenext;不是,转incsi;是,地址增1cmp[si],'E';同上jnenextincsicmp[si],'B'jnenextincsicmp[si],'U'-20-:..jnenextincsicmp[si],'G'jeyes;是‘DEBUG',转next:incsi;不是,地址增1loopagain;循环no:movdx,offsetdisp2;没找到,显示disp2jmpdspyes:movdx,offsetdisp1;找到,显示disp1dsp:movah,〔〕编程把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以100、10和1,得到“百位”、“十位”和“个位”。〔解答〕-21-:...(?).,varmovbx,10000movcl,10xorsi,sixordx,dxagain:divbxmovdbcd[si],alincsixchgax,bxdivclxchgax,bxcmpsi,-22-:..〔〕没有。。。〔〕--〔〕--〔〕--〔〕过程定义的一般格式是怎样的?子程序入口为什么常有PUSH指令、出口为什么有POP指令?下面的程序段有什么不妥吗?若有,请改正:crazyPROCpushaxxorax,axxordx,dxagain:addax,[bx]adcdx,0incbxincbxloopagainretENDPcrazy〔解答〕crazyPROC;crazyPROCpushax;-23-:..xorax,ax;xorax,axxordx,dx;xordx,dxagain:addax,[bx];again:addax,[bx]adcdx,0;adcdx,0incbx;incbxincbx;incbxloopagain;loopagainret;retENDPcrazy;crazyENDP〔〕子程序的参数传递有哪些方法,请简单比较。〔解答〕寄存器、共享变量(公共存储单元)、堆栈用寄存器传递参数是把参数存于约定的寄存器中,这种方法简单易行,经常采用;用变量传递参数是主程序与被调用过程直接用同一个变量名访问传递的参数,就是利用变量传递参数。如果调用程序与被调用程序在同一个源-24-:..程序文件中,只要设置好数据段寄存器DS,则子程序与主程序访问变量的形式相同,也就是它们共享数据段的变量,调用程序与被调用程序不在同一个源文件中,必须利用public/extern进行声明,才能用变量传递参数,利用变量传递参数,过程的通用性比较差,然而,在多个程序段间,尤其在不同程序的模块间,利用全局变量共享数据也是一种常见的参数传递方法;用堆栈传递参数是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口压入堆栈,主程序弹出堆栈取得它们。〔〕采用堆栈传递参数的一般方法是什么,为什么应该特别注意堆栈平衡问题。〔解答〕采用堆栈传递参数的一般方法是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数子程序将出口参数压入堆栈,主程序弹出堆栈取得它们。因为堆栈采用“先进后出”原则存取,而且返回地址和保护的寄存器等也要存于堆栈,所以要特别注意堆栈平衡问题。-25-:..〔习题〕什么是子程序的嵌套、递归和重入?〔解答〕子程序中又调用子程序就形成子程序嵌套。子程序中直接或间接调用该子程序本身就形成子程序递归。子程序的重入是指子程序被中断后又被中断服务程序所调用,能够重入的子程序称为可重入子程序。〔〕,利用AL作为入口、出口参数完成。〔解答〕.'HeLLOeveRyboDy!',,offsetatringagain:moval,[bx]callchan;调用过程-26-:..mov[bx],alnext:incbxjmpagaindone:.exit0chanproc;大写转换为小写字母的过程oral,aljzdonecmpal,'A'jbnextcmpal,'Z'janextoral,20hretchanendpend〔〕请按如下子程序说明编写过程:;子程序功能:把用ASCII码表示的两位十进制数转换为对应二进制数;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码-27-:..;出口参数:AL=对应的二进制数〔解答〕astobprocanddh,0fh;十位数的ASCII码转为二进制数moval,dhmul10;al=10*dhanddl,0fh;个位数的ASCII码转为二进制数addal,dl;al=10*dh+dlretastobendp〔〕写一个子程序,根据入口参数AL=0/1/2,分别实现对大写字母转换成小写、小写转换成大写或大小写字母互换。欲转换的字符串在string中,用0表示结束。〔解答〕ChangeprocPushbx;保护bxxorbx,bx;位移量清零cmpal,0;根据入口参数-28-:..,分别处理jzchan_0decaljzchan_1decaljzchan_2jmpdonechan_0:moval,string[bx];实现对大写字母转换成小写cmpal,0jzdone;是大写字母jbnext0cmpal,’Z’;是大写字母janext0addal,20h;转换movstring[bx],alnext0:incbx;位移量加1,指向下一字母jmpchan_0chan_1:moval,string[bx];实现对小写字母转换成大写-29-:..cmpal,0jzdone;是大写字母jbnext1cmpal,’z’;是大写字母janext1subal,20h;转换movstring[bx],alnext0:incbx;位移量加1,指向下一字母jmpchan_1chan_2:moval,string[bx];实现对大写字母转换成小写cmpal,0jzdonecmpal,’A’;是大写字母jbnext2cmpal,’Z’;是大写字母janext20addal,20h;转换jmpnext2next20:cmpal,’a’;是大写字母-30-:..jbnext2;是大写字母janext2subal,20h;转换movstring[bx],alnext2:incbx;位移量加1,指向下一字母jmpchan_2done:popbx;恢复bxretchangeendp〔〕编制一个子程序把一个16位二进制数用十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并用一个主程序验证它。(1)采用AX寄存器传递这个16位二进制数(2)采用wordTEMP变量传递这个16位二进制数(3)采用堆栈方法传递这个16位二进制数〔解答〕(1)采用AX寄存器传递这个16位二进制数-31-:...,;dispaprocpushcxpushdxmovcl,4movdl,ahshrdl,clcalldldispmovdl,ahanddl,0fhcalldldispmovdl,alshrdl,cl-32-:..calldldispmovdl,alanddl,0fhcalldldisppopdxpopcxretdispaendp;dldispprocpushaxordl,30hcmpdl,39hjbedldisp1adddl,7dldisp1:movah,2int21hpopaxretdldispendpend(2)采用wordTEMP变量传递这个16位二进-33-:..?.,wdatamovwordtemp,;dispaprocpushcxpushdxmovcl,4movdl,byteptrwordtemp+1shrdl,clcalldldispmovdl,byteptrwordtemp+1anddl,0fh-34-:..calldldispmovdl,byteptrwordtempshrdl,clcalldldispmovdl,byteptrwordtempanddl,0fhcalldldisppopdxpopcxretdispaendp;dldispprocpushaxordl,30hcmpdl,39hjbedldisp1adddl,7dldisp1:movah,2int21hpopaxret-35-:..dldispendpend(3);addsp,;dispaprocpushbpmovbp,sppushaxpushcxpushdxmovax,[bp+4]movcl,4-36-:..movdl,ahshrdl,clcalldldispmovdl,ahanddl,0fhcalldldispmovdl,alshrdl,clcalldldispmovdl,alanddl,0fhcalldldisppopdxpopcxpopaxpopbpretdispaendp;dldispprocpushaxordl,30h-37-:..cmpdl,39hjbedldisp1adddl,7dldisp1:movah,2int21hpopaxretdldispendpend〔〕设有一个数组存放学生的成绩(0~100),编制一个子程序统计0~59分、60~69分、70~79分、80~89分、90~100分的人数,并分别存放到scoreE、scoreD、scoreC、scoreB及scoreA单元中。编写一个主程序与之配合使用。〔解答〕.,86,90,45,60,96,100,0,...;全班成绩数组-38-:..countequ$-score;总人数scoreEdb?;0--59分人数scoreDdb?;60--69分人数scoreCdb?;70--79分人数scoreBdb?;80--89分人数scoreAdb?;90--,scoremovcx,countagain:moval,[bx];取一个成绩calltjrs;调用统计分段人数incbx;调整指针loogagain;cx-cx-1,cx=;统计分段人数cmpal,60jaenext0;al>=60转incscoreE;al<60,0--59分的人数加1jmpnext4-39-:..next0:cmpal,70jaenext1incscoreDjmpnext4next1:cmpal,80jaenext2incscoreCjmpnext4next2:cmpal,90jaenext3incscoreBjmpnext4next3:incscoreAnext4:rettjrsendpend〔〕编写一递归子程序,计算指数函数Xn的值。〔解答〕-40-:...dataxdw5ndw6zishdw?.,xpushbxmovbx,npushbxmovbx,xcallzshhsupopzishaddsp,,spmovax,[bp+8]cmpax,0-41-:..jnezshhsu1incaxjmpzshhsu2zshhsu1:decaxpushbxpushaxcallzshhsupopaxpopbxmulbxzshhsu2:mov[bp+8],axpopbppopaxpopbxretzshhsuendpend-42-
汇编语言程序设计(第四版)第4章【课后答案】 来自淘豆网m.daumloan.com转载请标明出处.