《新编汇编语言知识程序设计四五章习题集参考总结解答.doc》由会员分享,可在线阅读,更多相关《新编汇编语言知识程序设计四五章习题集参考总结解答.doc(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、#+习题四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, XAND
2、AL, 0000 1010BJZL3CMPAL, 0000 1010BJEL1JMPL24.12 计算分段函数: X的值从键盘输入,Y的值送显示器输出。答:INCLUDEYLIB.HDATASEGEMNTMESS1DB0DH, 0AH, Input value of X please : $MESS2DB0DH, 0AH, Y= : $DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATAMOVDS, AXLEADX, MESS1CALLREADINT;输入X的值CMPAX, -2JGEL2L1:SUBAX, 3;AXX-3JM
3、PDONEL2:CMPAX, 3JGL3MOVBX, AXADDAX, AX;AX2XADDAX, AX;AX4XADDAX, BX;AX5XADDAX, 6;AX5X+6JMPDONEL3:MOVAX, 2;AX2DONE:LEADX, MESS2CALLWRITEINT;输出Y的值CALLCRLFMOVAX, 4C00HINT21HCODEENDSENDSTART4.14 编写程序,求10元素字数组LIST中绝对值最小的数,存入MIN单元。答:DATASEGEMNTLISTDW-56, +12, 88, -126, -5, 16, 32, -99, 72, -18MINDW?MINABSD
4、W?DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATAMOVDS, AXMOVAX, LISTMOVMIN, AX;将数组第一个元素假设为绝对值最小的数MOVMINABS, 32767;最小的绝对值假设为32767LEASI, LISTMOVCX, 10AGAIN:MOVAX, SICMPAX, 0JGESKIP1NEGAX;求绝对值SKIP1:CMPAX, MINABS;绝对值与假设的最小绝对值比较JGESKIP2;假设的绝对值较小,跳过MOVMINABS, AX;保存新的最小绝对值MOVAX, SI;取出新的绝对值最小的
5、数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:MO
6、VAX, DATAMOVDS, AXMOVMIN, 32767;将32767假设为最小的数MOVMAX, -32768;将-32768假设为最大的数MOVAVG, 0;AVG用作累加器,清零LEASI, LISTMOVCX, 0AGAIN:MOVAX, SICMPAX, 0JZDONE;找到零元素,转DONE结束处理INCCX;纪录非零元素个数ADDAVG, AX;累加CMPAX, MINJGESKIP1MOVMIN. AX;比预设最小值还小,保留SKIP1:CMPAX, MAXJLESKIP2 MOVMAX, AX;比预设最大值还大,保留SKIP2:ADDSI, 2JMPAGAINDONE:
7、JCXZNULL;元素个数为零,转NULL处理MOVAX, AVGCWDIDIVCXMOVAVG, AX;计算平均值JMPEXIT NULL:MOVMIN, 0;元素个数为0,将“最大值”、“最小值”MOVMAX, 0;“平均值”清零MOVAVG, 0EXIT:MOVAX, 4C00HINT21HCODEENDSENDSTART4.21编写程序,把一个30个元素的有符号字数组ARRAY按照各元素的正负分别送入数组P和M,正数和零元素送P数组,负数送M数组。答:DATASEGEMNTARRAYDW30 DUP(?);汇编之前置入数据PDW30 DUP(?)MDW30 DUP(?)DATAENDS
8、CODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATAMOVDS, AXLEABX, ARRAY;ARRAY数组指针MOVSI, 0;P数组指针MOVDI, 0 ;M数组指针MOVCX, 30ONE:MOVAX, BX;从ARRAY数组取出一个数据ANDAX, ALJGEPLUS;正数、零转PLUSMINUS:MOVMDI, AX;负数存入M数组ADDDI, 2JMPNEXTPLUS:MOVPSI, AX;正数、零存入P数组ADDSI, 2NEXT:ADDBX, 2 LOOPONEMOVAX, 4C00HINT21HCODEENDSENDSTA
9、RT4.30 编写程序,输入N,计算:S=1*2+2*3+(N-1)*N 答:INCLUDEYLIB.HCODESEGMENTASSUMECS: CODEMESS1DB0DH, 0AH, Input N please: $MESS2DB0DH, 0AH, S= $START:PUSHCSPOPDSLEADX, MESS1CALLREADDEC;输入NMOVCX, AXXORBX, BX;BX用作累加器ONE:MOVAX, CXMOVSI, AXDECSIMULSI;计算J*(J-1)ADDBX, AX;累加LOOPONELEADX, MESS2MOVAX, BXCALLWRITEDEC;输出结
10、果CALLCRLF MOVAX, 4C00HINT21HCODEENDSENDSTART4.31 编写程序,输入N,输出如下矩阵(设N=5)1 1 1 1 12 2 2 2 13 3 3 2 14 4 3 2 15 4 3 2 1答:设I为行(15), J为列(15),则(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-列
11、号JMPOUTPUTUP:MOVAX, SI;上半三角,取行号OUTPUT:MOVDX, -1CALLWRITEDEC;输出一个数据LOOPCOLCALLCRLF;结束本行INCSI;修改行号CMPSI, 5JBEROW;未满5行,继续MOVAX, 4C00HINT21HCODEENDSENDSTART习题五5.4 阅读下面的程序,指出该程序计划完成的功能,同时指出程序中尚存在的错误。CODE SEGMENTASSUME:CS: CODESTART:MOVCX, 20LOOP0:CALLPRINTSPACELOOPLOOP0MOVAH, 4CHINT21HPRINTSPACEPROCNEARM
12、OVCX,40;该行上面添加:PUSH CXPSLOOP:MOVAL, MOVAH, 02HINT21HLOOPPSLOOPMOVAL, 0AHMOVAH, 02HINT21HMOVAL, 0DHMOVAH, 02HINT21H; 该行下面添加:POPCXRETPRINTSPACE ENDPCODE ENDS END START功能:输出20行空行,每行有40个空格。5.6 阅读下面的子程序,叙述它完成的功能,它的入口参数和出口参数各是什么?CLSCREENPROCMOVAX, 0600HMOVCX, 0MOVDH, XMOVDL, YMOVBH, 07HINT10HRETCLSCREENEN
13、DP解:屏幕窗口上卷,左上角为(0,0),右下角为(y, x),卷入行属性为黑底白字。5.7 编写程序,键入一个以$为结束符的数字串,统计其中“0”“9”各个数字出现的次数,分别存放到S0S9这10个单元中去。解:.MODEL SMALL.DATAS0DB0S1DB?S2DB0S3DB0S4DB0S5DB0S6DB0S7DB0S8DB0S9DB0KEYINDB100 DUP(0).CODESTART:MOVAX, DATAMOVDS, AXMOVCX, 0LEABX, KEYINNEXT:MOVAH, 01HINT21HCMPAL, $JZCOUNTINCCXMOVBX, ALINCBXJMP
14、NEXTCOUNT:LEABX, KEYINCOUNT1:LEADI, S0MOVAL, BXSUBAL, 30HMOVAH, 0ADDDI, AXINCBYTE PTRDIINCBXLOOPCOUNT1MOVAX, 4C00HINT21HENDSTART5.8 下面程序求某数据区中无符号数据最大值,观察程序执行中堆栈变化,画出以下5个堆栈状态图。(1)CALLMAX指令执行之前(2)CALLMAX指令执行之后。(3)保护现场之前(4)恢复现场之后(5)执行指令POPSMAX之后程序清单如下:DATASEGMENTBUFDW98, 34, 897, 345, 678, 21345, 67, 2
15、COUNTEQU($-BUF) / 2SMAXDW?DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATAMOVDS, AXLEAAX, BUF; 入口参数进栈PUSHAXMOVAX, COUNTPUSHAXCALLMAXPOPSMAX; 最大值出栈,送SMAXMOVAH, 4CHINT21HMAXPROC PUSHBPMOVBP, SPMOVSI, BP+6; BUF的偏移地址送SIMOVCX, BP+4; COUNT送CXMOVBX, SI; 取第一个数据至BXDECCXMAX1:ADDSI, 2CMPBX, SIJAENE
16、XTMOVAX, SI; 取第二个数至AXNEXT:LOOPMAX1MOVBP+6, BX; 最大值进栈POPBPRET2; 返回后SP指向最大值MAXENDPCODEENDSENDSTARTSP返回偏移地址COUNTBUF的偏移地址CALL MAX执行之后SPCOUNTBUF的偏移地址CALL MAX执行之前 SP返回偏移地址COUNTBUF的偏移地址保护现场之前 BPSP返回偏移地址COUNT最大值恢复现场之后BP返回偏移地址COUNTSP最大值执行RET 2之后5.9 编写求绝对值的子程序,利用它计算三个变量的绝对值之和。解:.MODELSMALL.DATAVALUEDW-5, 5, -
17、10SUMDW0.CODESTART:MOVAX, DATAMOVDS, AXLEABX, VALUEMOVCX, 3MOVSUM, 0ONE:CALLABSADDSUM, AXADDBX, 2LOOPONEMOVAX, 4C00HINT21H; 子程序ABS; 功能:求一个字整数的绝对值; 入口:字整数的偏移地址在BX中; 出口:该字整数的绝对值在AX中ABSPROCMOVSUM, 0AGAIN:MOVAX, BXANDAX, AXJGESKIPNEGAXSKIP:RETABSENDPENDSTART5.10 子程序计算从2开始的N(N=0)。其递归定义如下:0!1N! =N * (N-1)!(N0)解:.DATANDW5MDD?.CODESTART:MOVAX, DATAMOVDS, AXMOVCX, NCALLFACTMOVWORD PTR M, AXMOVWORD PTR M+2, DXMOVAX, 4C00HINT21HFACTPROCNEARCMPCX, 0JZDONEPUSHCXDECCXCALLFACTPOPCXMULCXJMPEXITDONE:MOVAX, 1EXIT:RETFACTENDPENDSTART
限制150内