版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、汇编语言程序设计第四版【课后习题答案】-翊植第4章基本汇编语言程序设计习题4.1例题4.2如果要求算术右移8位,如何修改程序。解答思路:首先由最高位字节向次低位字节传送次低位字节向最低位字节传送共7次;再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。传送可参考例题4.2,不过应从第一号字节送第零号字节,最高位字节向次低位字节传送;也可以用循环来完成:.modelsmall.stack256.data.code.startupmovcx,7movsi,1again:moval,byteptrqvarsimovbyteptrqvarsi-1,alincsiloop
2、againtestal,80hjzezzmovbl,0ffhjmpdoneezz:movbl,0done:movbyteptrqvar7,bl.exit0end习题4.2例题4.2如果要求算术左移7位,如何用移位指令实现。解答思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带CF位循环左移一次内循环共8次,外循环体控制执行7次即可。.modelsmall.stack256.data.code.startupmovdx,7movax,byteptrqvar0Ipp:shlax,1movsi,1movcx,7again:rclbyteptrqvar
3、si,1incsi;外循环次数;最低位字节送ax;最低位字节左移一次,其d7移入CF位;内循环次数;高位字节依次左移P50loopagaindecdxjnzlpp.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;屏敝低局四位后送dlmo
4、vcl,4;原ah中的数据逻辑右移4次送dlshrdl,clmovcl,ah;屏蔽高四位后送clandcl,0fh习题4.4编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。解答getkey:movah,1int21hcmpal,'a'jbgetkaycmpal,'z'jagetkaysubal,20hmovdl,almovah,02hint21h;从键盘输入,出口:al存键值;判键值是小写字母?;是小写字母转换为大写字母习题4.5已知用于LED数码管显示的代码表为:;显示LEDtableDB0c0h,0f9h,0a4h,0b0h,99h,92h,82
5、h,0f8hDB80h,90h,88h,83h,0c6h,0c1h,86h,8eh它依次表示09、AF这16个数码的显示代码。现编写一个程序实现将lednum中的一个数字09、AF转换成对应的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
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,保存-1ffh。编写该程序。解答.modelsmall.stack
7、.databufXdw-7signXdb?.code.startupcmpbufX,0;testbufX,80hjlnext;jnznextmovsignX,0jmpdonenext:movsignX,-1done:.exit0end习题4.8bufX、bufY和bufZ是3个有符号16进制数,编写一个比较相等关系的程序:1如果这3个数都不相等,则显示0;2如果这3个数中有两个数相等,则显示1;3如果这3个数都相等,则显示2。解答.modelsmall.stack256.databufxdw?bufYdw?bufzdw?.code.startupmovax,bufXmovbx,bufYmovc
8、x,bufZmovdl,'0'cmpax,bxjnznext1incdlnext1:cmpax,cxjnznext2incdlnext2:cmpbx,cxjnznext3incdlnext3:cmpdl,'3'jbnext4movdl,2next4:movah,02h;显示int21h.exit0end习题4.9例题4.8内外循环次数共是多少?如果要求按从大到小排序,程序如何修改?解答外循环次数是:count-1次19次内循环次数是:count-1)!次(19!次)内外循环次数共是count-1+count-1!次,即19+19!次0串操作指令常要利用循环结构,
9、现在不用串操作指令实现字符串string1内容传送到字符串string2,字符长度为count。解答.modelsmall.stack256.datastring1db'goodmorning!len=$-string1;字符数;源指针;目标指针;送一个字符,修改指针;修改指针;cx=cx-1,cx=0时退出循环string2dblendup(?).code.startupmovcx,lenmovsi,offsetstring1movdi,offsetstring2again:moval,simovdi,alincsi;incdiloopagain.exit0end1不用串操作指令求主
10、存解答0040h:0开始的一个64KB物理段中共有多少个空格?这里仅列出主程序段:movax,0040h;送段地址movds,axxorsi,si;偏移量地址xorcx,cx;计数循环次数xordx,dx;空格计数器清零again:cmpsi,20h;与空格的ASCII码比较jnenext;不是空格,转incdx;是空格,空格数加1next:incsi;修改地址指针loopagain;cx=cx-1,如cx=0退出循环.exit0end2编程实现把键入的一个字符,用二进制形式0/1显示出它的ASCII代码值。解答.modelsmall.stack256.datastri1db'plea
11、seinput',0dh,0ah,'$'.code.startupmovdx,offsetstri1movah,09hint21hmovah,01hint21hmovcx,8again:xordl,dlshlal,1adcdl,'0'movah,02hint21hloopagain.exit0end3编写程序,要求从键盘接收一个数bellN09,然后响铃bellN次。解答.modelsmall.stack.datastri1db'pleaseinputnumber:1-9',0dh,0ah,'$'.code.startup
12、again:movdx,offsetstri1;显示stri1,提示输入movah,09hint21hmovah,01h;调用输入一个字符int21h;输入一个字符存在al中cmpal,'1'判该字符,如不在-''9'jbagain;重新输入cmpal,'9'jaagainandal,0fh;在-''9'屏蔽高4位movcl,al;振铃次数送cxxorch,chabc:movdl,07h;调用一次振铃movah,02hint21hloopabc.exit0end4编写程序,将一个包含有20个有符号数据的数组arra
13、yM分成两个数组和负数数组arrayN,并分别把这两个数组中的数据个数显示出来。解答.modelsmall正数数组arrayP.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;设b
14、h为正数个数,bl为负数个数,均清零xorsi,si;源数组地址位移量again:;循环20次movax,arrayMsicmpax,0jlNegincbhjmpnextNeg:incblnext:incsiloopagainmovah,09hmovdx,offsetdispP;取一个元素;判正数1;否,负数个数加1;修改位移量;循环次数减1;调用显示字符串功能;显示个数int21hmoval,bhcalldispuib;调用I/O子程序库中的子程序movah,09h;调用显示字符串功能movdx,offsetdispN;显示个数int21hmoval,blcalldispuib;调用I/O子
15、程序库中的子程序.exit0end65535,则保存其5编写计算100个正整数之和的程序。如果和不超过16位字的范围和到wordsum,如超过则显示overflow。'解答.modelsmall.stack.datanumequ100wlistdwnumdup(?)wordsumdw?errordb'overflow.$'.code.startupmovbx,offsetwlistmovcx,numxorax,axagain:addax,bxjcnextincbxincbxloopagainmovbx,axjmpdonenext:movdx,offseterrormov
16、ah,9int21hdone:.exit0end习题4.16编程判断主存0070h:0开始的1KB中有无字符串DEBUG。这是一个字符串包含的问题,可以采用逐个向后比较的简单算法。解答.modelsmall.stack.datadisp1db'ThereisDEBUGintheaera!',0dh,0ah,'$'disp2db'ThereisnoDEBUGintheaera!',0dh,0ah,'$'.code.startupmovax,0070h;送段地址movds,axxorsi,si;地址指针清零movcx,1024cmps
17、i,'D'与此较jnenext;不是,转incsi;是,地址增1cmpsi,'E'jnenextincsicmpsi,'B'jnenextincsicmpsi,'U'jnenextincsicmpsi,'G'jeyesnext:incsiloopagain是DEBUG'转;不是,地址增1;循环no:yes:dsp:movdx,offsetdisp2;没找到,显示disp2jmpdspmovdx,offsetdisp1;找到,显示disp1movah,09hint21h.exit0end习题4.17编程把一个
18、16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为万位”,再用余数除以1000,得到年位”;依次用余数除以100、10和1,得到百位”、斗位”和个位”。解答.modelsmall.stack256.datavardw3546dbcddb5dup(?).code.startupmovax,varmovbx,10000movcl,10xorsi,sixordx,dxagain:divbxmovdbcdsi,alincsixchgax,bxdivclxchgax,bxcmpsi,5jnzagain.exit0end习题4.18没有。习题4
19、.19-习题4.20-习题4.21-习题4.22过程定义的一般格式是怎样的?子程序入口为什么常有什么有POP指令?下面的程序段有什么不妥吗?假设有,请改正:PUSH指令、出口为crazyPROCpushaxxorax,axxordx,dxagain:addax,bxadcdx,0incbxincbxloopagainretENDPcrazy解答crazyPROCpushaxxorax,axxordx,dxagain:addax,bxadcdx,0incbxincbxloopagainretENDPcrazycrazyPROCxorax,axxordx,dx;again:addax,bxadcd
20、x,0incbxincbxloopagainret;crazyENDP习题4.23子程序的参数传递有哪些方法,请简单比较。解答寄存器、共享变量公共存储单元、堆栈用寄存器传递参数是把参数存于约定的寄存器中,这种方法简单易行,经常采用;用变量传递参数是主程序与被调用过程直接用同一个变量名访问传递的参数,就是利用变量传递参数。如果调用程序与被调用程序在同一个源程序文件中,只要设置好数据段寄存器DS,则子程序与主程序访问变量的形式相同,也就是它们共享数据段的变量,调用程序与被调用程序不在同一个源文件中,必须利用public/extern进行声明,才能用变量传递参数,利用变量传递参数,过程的通用性比较差
21、,然而,在多个程序段间,尤其在不同程序的模块间,利用全局变量共享数据也是一种常见的参数传递方法;用堆栈传递参数是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口压入堆栈,主程序弹出堆栈取得它们。习题4.24采用堆栈传递参数的一般方法是什么,为什么应该特别注意堆栈平衡问题。解答采用堆栈传递参数的一般方法是主程序将子程序的入口参数压入堆栈,子程序从堆栈中取出参数子程序将出口参数压入堆栈,主程序弹出堆栈取得它们。因为堆栈采用先进后出原则存取,而且返回地址和保护的寄存器等也要存于堆栈,所以要特别注意堆栈平衡问题。习题4.25什么是子程序的嵌套、递归和重入?解答子程序中又调用子程序
22、就形成子程序嵌套。子程序中直接或间接调用该子程序本身就形成子程序递归。子程序的重入是指子程序被中断后又被中断服务程序所调用,能够重入的子程序称为可重入子程序。习题4.26将例题4.7的大写转换为小写字母写成过程,利用AL作为入口、出口参数完成。解答.modelsmall.stack256.datastdngdb'HeLLOeveRyboDy!',0.code.startupmovbx,offsetatringagain:moval,bxcallchan;调用过程movbx,alnext:incbxjmpagaindone:.exit0chanproc;大写转换为小写字母的过程o
23、ral,aljzdonecmpal,'A'jbnextcmpal,'Z'janextoral,20hretchanendpend习题4.27请按如下子程序说明编写过程:;子程序功能:把用ASCII码表示的两位十进制数转换为对应二进制数;入口参数:DH=十位数的ASCII码,DL=个位数的ASCII码;出口参数:AL=对应的二进制数解答astobprocanddh,0fh;十位数的ASCII码转为二进制数moval,dhmul10;al=10*dhanddl,0fh;个位数的ASCII码转为二进制数addal,dl;al=10*dh+dlretastobendp习
24、题4.28写一个子程序,根据入口参数AL=0/1/2,分别实现对大写字母转换成小写、小写转换成大写或大小写子母互换。欲转换的子符串在string中,用0表示结束。解答ChangeprocPushbx;保护bxxorbx,bx;位移量清零cmpal,0;根据入口参数AL=0/1/2,分别处理jzchan_0decaljzchan_1decaljzchan_2jmpdone;实现对大写字母转换成小写1,指向下一字母;实现对小写字母转换成大写chan_0:moval,stringbxcmpal,0jzdonecmpal,'A'是大写字母jbnext0cmpal,'Z'
25、是大写字母janext0addal,20h;转换movstringbx,alnext0:incbx;位移量加jmpchan_0chan_1:moval,stringbxcmpal,0jzdonecmpal,'a'是大写字母jbnext1cmpal,'z'是大写字母janextlsubal,20h;转换movstringbx,alnext0:incbx1,指向下一字母;实现对大写字母转换成小写jmpchan_1chan_2:moval,stringbxcmpal,0jzdonecmpal,'A'是大写字母jbnext2cmpal,'Z
26、9;是大写字母janext20addal,20h;转换jmpnext2next20:cmpal,'a'是大写字母jbnext2cmpal,'z'是大写字母janext2subal,20h;转换movstringbx,alnext2:incbx;位移量加1,指向下一字母jmpchan_2done:popbx;恢复bxretchangeendp习题4.29编制一个子程序把一个16位二进制数用十六进制形式在屏幕上显示出来,分别运用如下3种参数传递方法,并用一个主程序验证它。1采用AX寄存器传递这个16位二进制数2采用wordTEMP变量传递这个16位二进制数3采用堆栈
27、方法传递这个16位二进制数解答1采用AX寄存器传递这个16位二进制数.modelsmall.stack.datawdatadw34abh.code.startupmovax,wdatacalldispa.exit0dispaprocpushcxpushdxmovcl,4movdl,ahshrdl,clcalldldispmovdl,ahanddl,0fhcalldldispmovdl,alshrdl,clcalldldispmovdl,alanddl,0fhcalldldisppopdxpopcxretdispaendp;dldispprocpushaxordl,30hcmpdl,39hjbe
28、dldisp1adddl,7dldisp1:movah,2int21hpopaxretdldispendpend2采用wordTEMP变量传递这个16位二进制数.modelsmall.stack.datawdatadw34abhwordtempdw?.code.startupmovax,wdatamovwordtemp,axcalldispa.exit0;dispaprocpushcxpushdxmovcl,4movdl,byteptrwordtemp+1shrdl,clcalldldispmovdl,byteptrwordtemp+1anddl,0fhcalldldispmovdl,byte
29、ptrwordtempshrdl,clcalldldispmovdl,byteptrwordtempanddl,0fhcalldldisppopdxpopcxretdispaendp;dldispprocpushaxordl,30hcmpdl,39hjbedldisp1adddl,7dldisp1:movah,2int21hpopaxretdldispendpend3采用堆栈方法传递这个16位二进制数.modelsmall.stack.datawdatadw34abh.code.startuppushwdatacalldispapopax;addsp,2.exit0;dispaprocpushbpmovbp,sppushaxpushcxpushdxmovax,bp+4movcl,4movdl,ahshrdl,clcalldldispmovdl,ahanddl,0fhcalldldispmovdl,alshrdl,clcalldldispmovdl,alanddl,0fhcalldldisppopdxpopcxpopaxpopbpretdispaendp;dldispprocpushaxordl,30hcmpdl,39hjbedldisp1adddl,7dldisp1:mo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 回迁期房买卖合同范本
- 车辆保险合同纠纷起诉状
- 环卫一体化合同
- 2024年度版权购买合同的版权描述及购买价格
- 2024融资居间合同
- 二零二四年度物业服务合同:某高端住宅小区的物业管理细节
- 2024年度企业培训及人才输出定制合同
- 二零二四年度设备安装调试合同
- 2024年度中国新能源汽车销售代理协议
- 2024年度社交平台与内容提供商版权许可协议
- 2024年山东省公务员录用考试《行测》试题及答案解析
- 降低化学反应活化能的酶课件
- 2024年防汛物资购销合同范本
- DB14-T 1811-2019 旅游景区民俗燃香基本要求
- 中考备考备考生物经验交流-课件
- 2024-2025学年初中生物学七年级下册(2024)北师大版(2024)教学设计合集
- 学校消防系统维保及检测总体服务方案
- 网络安全试题题库及参考答案
- GB/T 13477.25-2024建筑密封材料试验方法第25 部分:耐霉菌性的测定
- 《白描花卉妙笔生》 课件 2024-2025学年岭南美版(2024) 初中美术七年级上册
- 园区出入管理系统施工方案
评论
0/150
提交评论