新编汇编语言程序设计四五章习题参考解答_第1页
新编汇编语言程序设计四五章习题参考解答_第2页
新编汇编语言程序设计四五章习题参考解答_第3页
新编汇编语言程序设计四五章习题参考解答_第4页
新编汇编语言程序设计四五章习题参考解答_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、习题四4.5已知(AX)=836BH, X分别取下列值,执行“CMP AX.X”后,标志位ZF、CF、OF、SF各是什么? (l)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=0001 4.7测试名为X的一个字节,如果X的第1, 3位均为1,转移到L1,如果只有一位为1,转移到L2,如果两位全为0, 转移到L3。写出对应的指令序列。答: MOV AL.XA

2、NDAL,0000 1010BJZL3CMPALOOOO 10I0BJELIJMPL2X-3X<-24.12计算分段函数:Y = <5X+6 -2<X<32X >3X的值从键盘输入,Y的值送显示器输出,答: INCLUDE YLIB.HDATA SEGEMNTMESSI DB ODH OAH. 'Input value ofX please : $MESS2 DB 0DH0AH.'Y=:$'DATA ENDSCODE SEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX. DATAMOVDS, AXLEADX

3、. MESSICALLREADINT:输入X的值CMPAX. -2JGEL2LI:SUBAX. 3:AX-X-3JMPDONEL2:CMPAX, 3JGL3MOVBX. AXADDAX. AX;AX2XADDAX. AX;AX-4XADDAX. BX;AX-5XADDAX. 6:AX-5XYJMPDONEL3:MOVAX. 2:AX-2DONE:LEA DX. MESS2CALL WRITEINT ;输出 Y 的值CALL CRLFMOV AX, 4C00HINT 21HCODE ENDSEND START4.14编写程序,求10元素字数组LIST中绝对值最小的数,存入MIN单元。答: DAT

4、A SEGEMNTLIST DW -56, +12, 88,-126 -5,16, 32, -99. 72, -18MIN DW ?MINABS DW ?DATA ENDSCODE SEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX. DATAMOVDS, AXMOVAX. LISTMOVMIN. AX将数组第一个元素假设为绝对值最小的数MOVMINABS, 32767最小的绝对值假设为32767LEASI, LISTMOVCX. 10AGAIN:MOVAX. SICMPAX.OJGESKIP1NEGAX求绝对值SKIP1:CMPAX. MINABS绝对值与假

5、设的最小绝对值比较JGESKIP2假设的绝对值较小,跳过MOVMINABS. AX保存新的最小绝对值MOVAX. SI取出新的绝对值最小的数MOVMIN. AX保留新的绝对值最小的数SKIP2:ADDSL2LOOPAGAINMOVAX. 4C00HINT21HCODEENDSENDSTART说明:一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小的数必须来自LIST数组04.16 一个有符号字数组以0为结束标志,求这个数组的:最大值、最小值、平均值。答:DATASEGEMNTLISTDW-56, +12, 88, -126, -5, 16. 32,-99, 72,-18,0MINDW9

6、MAXDW?AVGDW9 DATAENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART:MOVAX. DATAMOVDS, AXMOVMIN,32767:将32767假设为最小的数MOVMAX, -32768:将-32768假设为最大的数MOVAVGO:AVG用作累加器,清零LEASL LISTMOVCX.OAGAIN:MOVAX. SICMPAX.OJZDONE:找到零元素,转DONE结束处理INCCX:纪录非零元素个数ADDAVG, AX:累加CMPAX. MINJGESKIP1MOVMIN. AX:比预设最小值还小,保留SKIP1:CMPAX. M

7、AXJLESKIP2MOVMAX. AX:比预设最大值还大,保留SKIP2:ADDSL2JMPAGAINDONE:JCXZNULL:元素个数为零,转NULL处理MOVAX. AVGCWDIDIVCXMOVAVG, AX:计算平均值JMPEXITNULL:MOVMIN, 0:元素个数为0,将“最大值”、“最小值”MOVMAX. 0:“平均值”清零MOVAVGOEXIT:MOVAX. 4C00HINT21HCODEENDSENDSTART4.21编写程序,把一个30个元素的有符号字数组ARRAY按照各元素的正负分别送入数组P和M,正数和零元素送P数组,负数送M数组。答: DATA SEGEMNTA

8、RRAYDWPDWMDWDATA ENDSCODE SEGMENT30 DUP(?)30 DUP(?)30 DUP(?);汇编之前置入数据ASSUMECS: CODE, DS: DATA8 / 15START:MOV AX. DATAMOVDS, AXLEABX, ARRAY: ARRAY 数组指针MOVSI.O: P数组指针MOVDI.0: M数组指针MOVCX, 30ONE: MOVAX. |BX;从ARRAY数组取出一个数据ANDAX. ALJGEPLUS:正数、零转PLUSMINUS: MOVMDI,AX:负数存入M数组ADDDL2JMPNEXTPLUS: MOVP|SI, AX:正数

9、、零存入P数组ADDSL2NEXT: ADDBX,2LOOPONEMOVAX. 4C00HINT21HCODE ENDSENDSTART4.30编写程序,输入N,计算:S=1 *2+2*3+.+(N-1)*N答:INCLUDE YLIB.HCODE SEGMENTMESSIDBODH. 0AH, 'Input N please: $'MESS2DBODH. 0AH/S=S,START:PUSHcsPOPDSLEADX. MESSICALLREADDEC:输入NMOVCX. AXXORBX. BX;BX用作累加器ONE:MOVAX. CXMOVSL AXDECSIMULSI:计算

10、ADDBX. AX:累加LOOPONELEADX. MESS2MOVAX. BXCALLWRITEDEC;输出结果CALLCRLFMOVAX. 4C00HINT21HCODEENDSENDSTARTASSUMECS: CODE4.31编写程序,输入N,输出如下矩阵(设N=5)111112 2 2 2 13 3 3 2 14 4 3 2 15 4 3 2 1答:设I为行(卜5), J为列(15),则(I,J)位置上的数据为:I>(6-J)?I:6-J ,INCLUDE YLIB.HCODE SEGMENTASSUMECS: CODESTART:CALLCRLFMOVSI. 1:SI为行号R

11、OW: MOVCX. 5:CX为6-列号COL: CMPSL CX:判断当前位置JBUPDOWN: MOVAX. CX:下半三角,取6-列号JMPOUTPUTUP:MOVAX. SI:上半三角,取行号OUTPUT:MOVDX.-lCALLWRITEDEC:输出一个数据LOOPCOLCALLCRLF:结束本行INCSI;修改行号CMPSL5JBEROW:未满5行,继续MOVAX. 4C00HINT21HCODE ENDSENDSTART习题五5.4阅读下面的程序,指出该程序计划完成的功能,同时指出程序中尚存在的错误, CODE SEGMENTASSUME: CS: CODESTART: MOV

12、LOOPO: CALLLOOPMOVINT PRINTSPACEMOVCX, 20PRINTSPACELOOPOAH. 4CH21HPROC NEARCX, 40;该行上面添加:PUSHexPSLOOP:MOVALJ 'MOVAH. 02HINT21HLOOPPSLOOPMOVAL, OAHMOVAH. 02HINT21HMOVAL. ODHMOVAH. 02HINT21HRETPRINTSPACE ENDP CODE ENDS END START;该行卜面添加:POP ex功能:输出20行空行,每行有40个空格。5.6阅读下面的子程序,叙述它完成的功能,它的入口参数和出口参数各是什么

13、?CLSCREENMOVMOVMOVMOVMOVINTRETCLSCREENPROCAX. 0600HCX,0 DH,X DL, YBH. 07H 10HENDP解:屏幕窗口上卷,左上角为(0, 0),右下角为(y,x),卷入行属性为黑底白字。5.7 编写程序,键入一个以$为结束符的数字串,统计其中'O'“9”各个数字出现的次数,分别存放到S0S9这1。个 单元中去。解:.MODEL SMALL.DATASO DB 0SI DB ?S2 DB 0S3DB 0S4DB 0S5DB 0S6DB 0S7DB 0S8DB 0S9DB 0KEYINDB 100 DUP(O).CODEST

14、ART:MOVAX, DATAMOVDS. AXMOVCX,0LEABX. KEYINNEXT:MOVAH.01HINT21HCMPAL. $JZCOUNTINCCXMOV|BX.ALINCBXJMPNEXTCOUNT: LEABX. KEYINCOUNT1:LEADL SOMOVAL BXSUBAL. 30HMOVAH,0ADDDL AXINCBYTE PTRDIINCBXLOOPCOUNT 1MOVAX. 4C00HINT21HENDSTART5.8 下而程序求某数据区中无符号数据最大值,观察程序执行中堆栈变化,画出以下5个堆栈状态图。(DCALL MAX指令执行之前(2)CALL MAX

15、指令执行之后。(3)保护现场之前(4)恢复现场之后(5)执行指令POP SMAX之后程序清单如下:DATABUF COUNTSMAXDATACODE ASSUMESEGMENTDWEQU DW98, 34, 897, 345, 678, 21345, 67, 2 ($-BUF)/29ENDSSEGMENTCS: CODE, DS: DATASPCOUNTBUF的偏移地址SP返回偏移地址 COUNT -BUF的偏移地址START:MOVAX. DATAMOVDS, AXLEAAX. BUF;入口参数进栈PUSHAXMOVAX. COUNTPUSHAXCALLMAXPOPSMAX;最大值出栈,送S

16、MAXMOVAH. 4CHINT21HMAXPROCPUSHBPMOVBP, SPMOVSI. BP+6;BUF的偏移地址送SIMOVCX. BP+4;COUNT送 CXMOVBX, SI;取第一个数据至BXDECexMAXI:ADDSL2CMPBX. SIJAENEXTMOVAX. SI;取第二个数至AXNEXT:LOOPMAXIMOVBP+6L BX;最大值进栈POPBPRET2;返回后SP指向最大值MAXENDPCODEENDSENDSTARTCALL MAX执行之前CALL MAX执行之后SP返回偏移地址COUNTBUF的偏移地址保护现场之前SPBP返回偏移地址COUNT 最大值恢复现

17、场之后BP返回偏移地址COUNTSP最大值执行RET 2之后5.9 编写求绝对值的子程序,利用它计算三个变量的绝对值之和。解:.MODEL SMALL.DATAVALUEDW-5, 5,-10SUMDW0.CODESTART:MOVAX. DATAMOVDS. AXLEABX. VALUEMOVCX, 3MOVSUM. 0ONE:CALLABSADDSUM. AXADDBX,2LOOPONEMOVAX. 4C00HINT21H;子程序ABS;功能:求一个字整数的绝对值;入口:字整数的偏移地址在BX中;出口:该字整数的绝对值在AX中ABSPROCMOVSUM, 0AGAIN:MOVAX. BXA

18、NDAX, AXJGESKIPNEGAXSKIP:RETABSENDPENDSTART5.10 子程序计算从2开始的N(N<50)个偶数之和(2+4+6+),主程序从键盘输入整数N,调用子程序求出N个偶数9 / 15之和,并显示结果。用以下3种方法编写完整程序。(1)子程序和主程序在同一代码段。(2)在同一模块(源程序文件),但不在同一代码段。(3)各自独立成模块,即在不同的源程序文件中。解:(l)INCLUDE YLIB.H.MODEL SMALL.DATASUM DW 0PROMPT 1 DB ODH. OAH. INPUT THE NUMBER N$PROMPT? DB ODH.

19、OAH. THE SUM IS $.CODESTART:MOVAX. DATAMOVDS, AXLEADX. PROMPT 1CALLREADDECCMPAX.OJZEXITMOVCX. AXCALLSUMMLEADX. PROMPT2CALLWRITEDECCALLCRLFEXIT:MOVAX. 4C00HINT21HSUMMPROCMOVAX.ONEXT:MOVBX. CXADDBX. BXADDAX. BXLOOPNEXTRETSUMMENDPENDSTART(2)INCLUDE YLIB.H DATA SEGMENTDWODB ODH. OAH. INPUT THE NUMBER*DB

20、 ODH. OAH. 'THE SUM IS:DS: DATA, CS: CODEISUMPROMPT 1PROMPT?DATA ENDSCODEI SEGMENT ASSUME18 / 15START: MOVMOV LEA CALLAX. DATADS. AXDX. PROMPT 1READDECCMPAX.OJZEXITMOVCX, AXCALLFAR PTR SUMMLEADX, PROMPT2CALLWRITEDECCALLCRLFEXIT:MOVAX. 4C00HINT21HCODEIENDSC0DE2 SEGMENTASSUME CS: C0DE2. DS: DATASU

21、MMPROCFARMOVAX.ONEXT:MOVBX, CXADDBX, BXADDAX. BXLOOPNEXTRETSUMMENDPCODE2ENDSENDSTART(3);EXEC51O3A.ASMPUBLICCODE2ASSUMESUMMSUMMSEGMENTCS: CODE2PROC FARMOV AX, 0NEXT:MOVBX, CXADDBX. BXADDAX. BXLOOPNEXTRETSUMMCODE2ENDPENDS END;EXEC51O3B.ASMINCLUDE EXTRN DATA SUM PROMPT 1 PROMPT? DATA CODEIYLIB.HSUMMSEG

22、MENTDW 0DB ODH, OAH. INPUT THE NUMBER*DB ODH, OAH, THE SUM IS$ENDSSEGMENTASSUMEDS: DATA, CS: CODEISTART:MOVAX, DATAMOVDS. AXLEADX, PROMPT 1CALLREADDECCMPAX,0JZEXITMOVCX, AXCALLFAR PTR SUMMLEADX. PROMPT2CALLWRITEDECCALLCRLFEXIT:MOVAX. 4C00HINT21HCODEIENDSENDSTART5.19 编写排序子程序SORT,以DS、SI和CX作为入口参数,把DS:S

23、I为起始地址的一个带符号的字数组进行由小到 大排序,参数CX中存放的是数组中元素个数。解:DATAREASEGMENTARRAYDW 1,9,6, 8,5,4CNTDW6ADDRDW ?DATAREAENDSCODE SEGMENTASSUME CS: CODE. DS: DATAREASTART:MOVAX. DATAREAMOVDS. AXLEASI. ARRAYMOVCX. CNTCALLSORTMOVAX. 4C00HINT21HSORTPROCPUSHCXPUSHAXPUSHBXPUSHSIINIT:MOVBX. 1DECCXJZSORTEDPUSHSIPUSHCXNEXT:MOVAX. SICMPSI+2,AXJGEXCHGCONTSI+2,AXMOVSI, AXXORBX. BXCONT: ADDSL2LOOPNEXTPOPSIPOPCXCMPBX.OJEINITSORTED:POPSIPOPBXPOPAXPOPCXRETSORT ENDPCODE ENDSENDSTART;置交换标志5.20 编写一个子程序,以AX为入口参数,把AX中的各个二进制位颠倒次序后还放回AX中。例如,入口参数AX=11001

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论