您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 新编汇编语言程序设计四五章习题参考解答
习题四4.5已知(AX)=836BH,X分别取下列值,执行“CMPAX,X”后,标志位ZF、CF、OF、SF各是什么?(1)X=3000H(2)X=8000H(3)X=7FFFFH(4)X=0FFFFH(5)X=0答:上述指令执行后,标志位ZF、CF、OF、SF的状态分别是:(1)ZCOS=0010(2)ZCOS=0000(3)ZCOS=0010(4)ZCOS=0101(5)ZCOS=00014.7测试名为X的一个字节,如果X的第1,3位均为1,转移到L1,如果只有一位为1,转移到L2,如果两位全为0,转移到L3。写出对应的指令序列。答:MOVAL,XANDAL,00001010BJZL3CMPAL,00001010BJEL1JMPL24.12计算分段函数:2653XXY3322XXXX的值从键盘输入,Y的值送显示器输出。答:INCLUDEYLIB.HDATASEGEMNTMESS1DB0DH,0AH,‘InputvalueofXplease:$’MESS2DB0DH,0AH,‘Y=:$’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEADX,MESS1CALLREADINT;输入X的值CMPAX,-2JGEL2L1:SUBAX,3;AX←X-3JMPDONEL2:CMPAX,3JGL3MOVBX,AXADDAX,AX;AX←2XADDAX,AX;AX←4XADDAX,BX;AX←5XADDAX,6;AX←5X+6JMPDONEL3:MOVAX,2;AX←2DONE:LEADX,MESS2CALLWRITEINT;输出Y的值CALLCRLFMOVAX,4C00HINT21HCODEENDSENDSTART4.14编写程序,求10元素字数组LIST中绝对值最小的数,存入MIN单元。答:DATASEGEMNTLISTDW-56,+12,88,-126,-5,16,32,-99,72,-18MINDW?MINABSDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,LISTMOVMIN,AX;将数组第一个元素假设为绝对值最小的数MOVMINABS,32767;最小的绝对值假设为32767LEASI,LISTMOVCX,10AGAIN:MOVAX,[SI]CMPAX,0JGESKIP1NEGAX;求绝对值SKIP1:CMPAX,MINABS;绝对值与假设的最小绝对值比较JGESKIP2;假设的绝对值较小,跳过MOVMINABS,AX;保存新的最小绝对值MOVAX,[SI];取出新的绝对值最小的数MOVMIN,AX;保留新的绝对值最小的数SKIP2:ADDSI,2LOOPAGAINMOVAX,4C00HINT21HCODEENDSENDSTART说明:一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小的数必须来自LIST数组。4.16一个有符号字数组以0为结束标志,求这个数组的:最大值、最小值、平均值。答:DATASEGEMNTLISTDW-56,+12,88,-126,-5,16,32,-99,72,-18,0MINDW?MAXDW?AVGDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVMIN,32767;将32767假设为最小的数MOVMAX,-32768;将-32768假设为最大的数MOVAVG,0;AVG用作累加器,清零LEASI,LISTMOVCX,0AGAIN:MOVAX,[SI]CMPAX,0JZDONE;找到零元素,转DONE结束处理INCCX;纪录非零元素个数ADDAVG,AX;累加CMPAX,MINJGESKIP1MOVMIN.AX;比预设最小值还小,保留SKIP1:CMPAX,MAXJLESKIP2MOVMAX,AX;比预设最大值还大,保留SKIP2:ADDSI,2JMPAGAINDONE:JCXZNULL;元素个数为零,转NULL处理MOVAX,AVGCWDIDIVCXMOVAVG,AX;计算平均值JMPEXITNULL:MOVMIN,0;元素个数为0,将“最大值”、“最小值”MOVMAX,0;“平均值”清零MOVAVG,0EXIT:MOVAX,4C00HINT21HCODEENDSENDSTART4.21编写程序,把一个30个元素的有符号字数组ARRAY按照各元素的正负分别送入数组P和M,正数和零元素送P数组,负数送M数组。答:DATASEGEMNTARRAYDW30DUP(?);汇编之前置入数据PDW30DUP(?)MDW30DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEABX,ARRAY;ARRAY数组指针MOVSI,0;P数组指针MOVDI,0;M数组指针MOVCX,30ONE:MOVAX,[BX];从ARRAY数组取出一个数据ANDAX,ALJGEPLUS;正数、零转PLUSMINUS:MOVM[DI],AX;负数存入M数组ADDDI,2JMPNEXTPLUS:MOVP[SI],AX;正数、零存入P数组ADDSI,2NEXT:ADDBX,2LOOPONEMOVAX,4C00HINT21HCODEENDSENDSTART4.30编写程序,输入N,计算:S=1*2+2*3+……+(N-1)*N答:INCLUDEYLIB.HCODESEGMENTASSUMECS:CODEMESS1DB0DH,0AH,‘InputNplease:$’MESS2DB0DH,0AH,‘S=$’START:PUSHCSPOPDSLEADX,MESS1CALLREADDEC;输入NMOVCX,AXXORBX,BX;BX用作累加器ONE:MOVAX,CXMOVSI,AXDECSIMULSI;计算J*(J-1)ADDBX,AX;累加LOOPONELEADX,MESS2MOVAX,BXCALLWRITEDEC;输出结果CALLCRLFMOVAX,4C00HINT21HCODEENDSENDSTART4.31编写程序,输入N,输出如下矩阵(设N=5)1111122221333214432154321答:设I为行(1~5),J为列(1~5),则(I,J)位置上的数据为:I(6-J)?I:6-J。INCLUDEYLIB.HCODESEGMENTASSUMECS:CODESTART:CALLCRLFMOVSI,1;SI为行号ROW:MOVCX,5;CX为6-列号COL:CMPSI,CX;判断当前位置JBUPDOWN:MOVAX,CX;下半三角,取6-列号JMPOUTPUTUP:MOVAX,SI;上半三角,取行号OUTPUT:MOVDX,-1CALLWRITEDEC;输出一个数据LOOPCOLCALLCRLF;结束本行INCSI;修改行号CMPSI,5JBEROW;未满5行,继续MOVAX,4C00HINT21HCODEENDSENDSTART习题五5.4阅读下面的程序,指出该程序计划完成的功能,同时指出程序中尚存在的错误。CODESEGMENTASSUME:CS:CODESTART:MOVCX,20LOOP0:CALLPRINTSPACELOOPLOOP0MOVAH,4CHINT21HPRINTSPACEPROCNEARMOVCX,40;该行上面添加:PUSHCXPSLOOP:MOVAL,‘’MOVAH,02HINT21HLOOPPSLOOPMOVAL,0AHMOVAH,02HINT21HMOVAL,0DHMOVAH,02HINT21H;该行下面添加:POPCXRETPRINTSPACEENDPCODEENDSENDSTART功能:输出20行空行,每行有40个空格。5.6阅读下面的子程序,叙述它完成的功能,它的入口参数和出口参数各是什么?CLSCREENPROCMOVAX,0600HMOVCX,0MOVDH,XMOVDL,YMOVBH,07HINT10HRETCLSCREENENDP解:屏幕窗口上卷,左上角为(0,0),右下角为(y,x),卷入行属性为黑底白字。5.7编写程序,键入一个以$为结束符的数字串,统计其中“0”~“9”各个数字出现的次数,分别存放到S0~S9这10个单元中去。解:.MODELSMALL.DATAS0DB0S1DB?S2DB0S3DB0S4DB0S5DB0S6DB0S7DB0S8DB0S9DB0KEYINDB100DUP(0).CODESTART:MOVAX,@DATAMOVDS,AXMOVCX,0LEABX,KEYINNEXT:MOVAH,01HINT21HCMPAL,'$'JZCOUNTINCCXMOV[BX],ALINCBXJMPNEXTCOUNT:LEABX,KEYINCOUNT1:LEADI,S0MOVAL,[BX]SUBAL,30HMOVAH,0ADDDI,AXINCBYTEPTR[DI]INCBXLOOPCOUNT1MOVAX,4C00HINT21HENDSTART5.8下面程序求某数据区中无符号数据最大值,观察程序执行中堆栈变化,画出以下5个堆栈状态图。(1)CALLMAX指令执行之前(2)CALLMAX指令执行之后。(3)保护现场之前(4)恢复现场之后(5)执行指令POPSMAX之后程序清单如下:DATASEGMENTBUFDW98,34,897,345,678,21345,67,2COUNTEQU($-BUF)/2SMAXDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEAAX,BUF;入口参数进栈PUSHAXMOVAX,COUNTPUSHAXCALLMAXPOPSMAX;最大值出栈,送SMAXMOVAH,4CHINT21HMAXPROCPUSHBPMOVBP,SPMOVSI,[BP+6];BUF的偏移地址送SIMOVCX,[BP+4];COUNT送CXMOVBX,[SI];取第一个数据至BXDECCXMAX1:ADDSI,2CMPBX,[SI]JAENEXTMOVAX,[SI];取第二个数至AXNEXT:LOOPMAX1MOV[BP+6],BX;最大值进栈POPBPRET2;返回后SP指向最大值MAXENDPCODEENDSENDSTARTSPCOUNTBUF的偏移地址CALLMAX执行之前SP返回偏移地址COUNTBUF的偏移地址CALLMAX执行之后SP返回偏移地址COUNTBUF的偏移地址保护现场之前BPSP返回偏移地址COUNT最大值恢复现场之后5.9编写求绝对值的子程序,利用它计算三个变量的绝对值之和。解:.MODELSMALL.DATAVALUEDW-5,5,-10SUMDW0.CODESTART:MOVAX,@DATAMOVDS,AXLEABX,VALUEMOVCX,3MOVSUM,0ONE:CALLABSADDSUM,AXADDBX,2LOOPONEMOVAX,4C00HINT21H;子程序ABS;功能:求一个字整数的绝对值;入口:字整数的偏移地址在BX中;出口:该字整数的绝对值在AX中ABSPROCMOVSUM,0AGAIN:MOVAX,[BX]ANDAX,AXJGESKIPNEGAXSKIP:RETABSENDPENDSTART5.10子程序计算从2开始的N(N50)个偶数之和(2+4+6+…),主程序从键盘输入整数N,调用子程序求出N个偶数BP返回偏移地址COUNTSP最大值执行RET2之后之和,并显示结果。用以下3种方法编写完整程序。(1)子程序和主程序在同一代码段。(2)在同一模块(源程序文件),但不在同一代码段。(3)各自独立成模块,即在不同的源程序文件中。解:(1)IN
本文标题:新编汇编语言程序设计四五章习题参考解答
链接地址:https://www.777doc.com/doc-6494468 .html