新编汇编语言程序设计四五章习题参考解答Word下载.docx
《新编汇编语言程序设计四五章习题参考解答Word下载.docx》由会员分享,可在线阅读,更多相关《新编汇编语言程序设计四五章习题参考解答Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
AX←5X+6
L3:
MOVAX,2;
AX←2
DONE:
LEADX,MESS2
CALLWRITEINT;
输出Y的值
CALLCRLF
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
4.14编写程序,求10元素字数组LIST中绝对值最小的数,存入MIN单元。
DATASEGEMNT
LISTDW-56,+12,88,-126,-5,16,32,-99,72,-18
MINDW?
MINABSDW?
MOVAX,LIST
MOVMIN,AX;
将数组第一个元素假设为绝对值最小的数
MOVMINABS,32767;
最小的绝对值假设为32767
LEASI,LIST
MOVCX,10
AGAIN:
MOVAX,[SI]
CMPAX,0
JGESKIP1
NEGAX;
求绝对值
SKIP1:
CMPAX,MINABS;
绝对值与假设的最小绝对值比较
JGESKIP2;
假设的绝对值较小,跳过
MOVMINABS,AX;
保存新的最小绝对值
MOVAX,[SI];
取出新的绝对值最小的数
MOVMIN,AX;
保留新的绝对值最小的数
SKIP2:
ADDSI,2
LOOPAGAIN
MOVAX,4C00H
说明:
一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小的数必须来自LIST数组。
4.16一个有符号字数组以0为结束标志,求这个数组的:
最大值、最小值、平均值。
LISTDW-56,+12,88,-126,-5,16,32,-99,72,-18,0
MAXDW?
AVGDW?
MOVMIN,32767;
将32767假设为最小的数
MOVMAX,-32768;
将-32768假设为最大的数
MOVAVG,0;
AVG用作累加器,清零
MOVCX,0
JZDONE;
找到零元素,转DONE结束处理
INCCX;
纪录非零元素个数
ADDAVG,AX;
累加
CMPAX,MIN
MOVMIN.AX;
比预设最小值还小,保留
SKIP1:
CMPAX,MAX
JLESKIP2
MOVMAX,AX;
比预设最大值还大,保留
JMPAGAIN
JCXZNULL;
元素个数为零,转NULL处理
MOVAX,AVG
CWD
IDIVCX
MOVAVG,AX;
计算平均值
JMPEXIT
NULL:
MOVMIN,0;
元素个数为0,将“最大值”、“最小值”
MOVMAX,0;
“平均值”清零
MOVAVG,0
EXIT:
MOVAX,4C00H
4.21编写程序,把一个30个元素的有符号字数组ARRAY按照各元素的正负分别送入数组P和M,正数和零元素送P
数组,负数送M数组。
ARRAYDW30DUP(?
);
汇编之前置入数据
PDW30DUP(?
)
MDW30DUP(?
DATAENDS
LEABX,ARRAY;
ARRAY数组指针
MOVSI,0;
P数组指针
MOVDI,0;
M数组指针
MOVCX,30
ONE:
MOVAX,[BX];
从ARRAY数组取出一个数据
ANDAX,AL
JGEPLUS;
正数、零转PLUS
MINUS:
MOVM[DI],AX;
负数存入M数组
ADDDI,2
JMPNEXT
PLUS:
MOVP[SI],AX;
正数、零存入P数组
ADDSI,2
NEXT:
ADDBX,2
LOOPONE
4.30编写程序,输入N,计算:
S=1*2+2*3+……+(N-1)*N
CODESEGMENT
CODE
MESS1DB0DH,0AH,‘InputNplease:
MESS2DB0DH,0AH,‘S=$’
PUSHCS
POPDS
LEADX,MESS1
CALLREADDEC;
输入N
MOVCX,AX
XORBX,BX;
BX用作累加器
MOVAX,CX
MOVSI,AX
DECSI
MULSI;
计算J*(J-1)
ADDBX,AX;
MOVAX,BX
CALLWRITEDEC;
输出结果
CALLCRLF
4.31编写程序,输入N,输出如下矩阵(设N=5)
11111
22221
33321
44321
54321
设I为行(1~5),J为列(1~5),则(I,J)位置上的数据为:
I>
(6-J)?
I:
6-J。
INCLUDEYLIB.H
MOVSI,1;
SI为行号
ROW:
MOVCX,5;
CX为6-列号
COL:
CMPSI,CX;
判断当前位置
JBUP
DOWN:
MOVAX,CX;
下半三角,取6-列号
JMPOUTPUT
UP:
MOVAX,SI;
上半三角,取行号
OUTPUT:
MOVDX,-1
CALLWRITEDEC;
输出一个数据
LOOPCOL
CALLCRLF;
结束本行
INCSI;
修改行号
CMPSI,5
JBEROW;
未满5行,继续
习题五
5.4阅读下面的程序,指出该程序计划完成的功能,同时指出程序中尚存在的错误。
CODESEGMENT
ASSUME:
CS:
START:
MOVCX,20
LOOP0:
CALLPRINTSPACE
LOOPLOOP0
MOVAH,4CH
INT21H
PRINTSPACEPROCNEAR
MOVCX,40;
该行上面添加:
PUSHCX
PSLOOP:
MOVAL,‘’
MOVAH,02H
LOOPPSLOOP
MOVAL,0AH
MOVAL,0DH
INT21H;
该行下面添加:
POPCX
RET
PRINTSPACEENDP
CODEENDS
ENDSTART
功能:
输出20行空行,每行有40个空格。
5.6阅读下面的子程序,叙述它完成的功能,它的入口参数和出口参数各是什么?
CLSCREENPROC
MOVAX,0600H
MOVCX,0
MOVDH,X
MOVDL,Y
MOVBH,07H
INT10H
RET
CLSCREENENDP
解:
屏幕窗口上卷,左上角为(0,0),右下角为(y,x),卷入行属性为黑底白字。
5.7编写程序,键入一个以$为结束符的数字串,统计其中“0”~“9”各个数字出现的次数,分别存放到S0~S9这10个
单元中去。
.MODELSMALL
.DATA
S0DB0
S1DB?
S2DB0
S3DB0
S4DB0
S5DB0
S6DB0
S7DB0
S8DB0
S9DB0
KEYINDB100DUP(0)
.CODE
MOVAX,@DATA
MOVDS,AX
MOVCX,0
LEABX,KEYIN
NEXT:
MOVAH,01H
CMPAL,'
$'
JZCOUNT
INCCX
MOV[BX],AL
INCBX
JMPNEXT
COUNT:
LEABX,KEYIN
COUNT1:
LEADI,S0
MOVAL,[BX]
SUBAL,30H
MOVAH,0
ADDDI,AX
INCBYTEPTR[DI]
LOOPCOUNT1
MOVAX,4C00H
ENDSTART
5.8下面程序求某数据区中无符号数据最大值,观察程序执行中堆栈变化,画出以下5个堆栈状态图。
(1)CALLMAX指令执行之前
(2)CALLMAX指令执行之后。
(3)保护现场之前
(4)恢复现场之后
(5)执行指令POPSMAX之后
程序清单如下:
DATASEGMENT
BUFDW98,34,897,345,678,21345,67,2
COUNTEQU($-BUF)/2
SMAXDW?
ASSUMECS:
START:
MOVAX,DATA
LEAAX,BUF;
入口参数进栈
PUSHAX
MOVAX,COUNT
CALLMAX
POPSMAX;
最大值出栈,送SMAX
MAXPROC
PUSHBP
MOVBP,SP
MOVSI,[BP+6];
BUF的偏移地址送SI
MOVCX,[BP+4];
COUNT送CX
MOVBX,[SI];
取第一个数据至BX
DECCX
MAX1:
CMPBX,[SI]
JAENEXT
MOVAX,[SI];
取第二个数至AX
NEXT:
LOOPMAX1
MOV[BP+6],BX;
最大值进栈
POPBP
RET2;
返回后SP指向最大值
MAXENDP
SP
返回偏移地址
COUNT
BUF的偏移地址
CALLMAX执行之后
CALLMAX执行之前
保护现场之前
BP
最大值
恢复现场之后
执行RET2之后
5.9编写求绝对值的子程序,利用它计算三个变量的绝对值之和。
.MODELSMALL
.DATA
VALUEDW-5,5,-10
SUMDW0
.CODE
LEABX,VALUE
MOVCX,3
MOVSUM,0
ONE:
CALLABS
ADDSUM,AX
ADDBX,2
LOOPONE
MOVAX,4C00H
;
子程序ABS
功能:
求一个字整数的绝对值
入口:
字整数的偏移地址在BX中
出口:
该字整数的绝对值在AX中
ABSPROC
MOVSUM,0
AGAIN:
MOVAX,[BX]
ANDAX,AX
JGESKIP
NEGAX
SKIP:
RET
ABSENDP
ENDSTART
5.10子程序计算从2开始的N(N<
50)个偶数之和(2+4+6+…),主程序从键盘输入整数N,调用子程序求出N个偶数
之和,并显示结果。
用以下3种方法编写完整程序。
(1)子程序和主程序在同一代码段。
(2)在同一模块(源程序文件),但不在同一代码段。
(3)各自独立成模块,即在不同的源程序文件中。
(1)INCLUDEYLIB.H
SUMDW0
PROMPT1DB0DH,0AH,'
INPUTTHENUMBERN:
PROMPT2DB0DH,0AH,'
THESUMIS:
LEADX,PROMPT1
CALLREADDEC
CMPAX,0
JZEXIT
MOVCX,AX
CALLSUMM
LEADX,PROMPT2
CALLWRITEDEC
CALLCRLF
SUMMPROC
MOVAX,0
MOVBX,CX
ADDBX,BX
ADDAX,BX
LOOPNEXT
RET
SUMMENDP
(2)INCLUDEYLIB.H
SUMDW0
INPUTTHENUMBER:
THESUMIS:
CODE1SEGMENT
ASSUMEDS:
DATA,CS:
CODE1
CALLFARPTRSUMM
MOVAX,4C00H
CODE1ENDS
CODE2SEGMENT
CODE2,DS:
SUMMPROCFAR
MOVAX,0
MOVBX,CX
SUMMENDP
CODE2ENDS
(3)
;
EXEC5103A.ASM
PUBLICSUMM
CODE2
ADDBX,BX
ADDAX,BX
LOOPNEXT
RET
CODE2ENDS
END
EXEC5103B.ASM
EXTRNSUMM
MOVAX,DATA
MOVDS,AX
LEADX,PROMPT1
CALLREADDEC
CMPAX,0
JZEXIT
MOVCX,AX
CALLFARPTRSUMM
LEADX,PROMPT2
CALLWRITEDEC
CALLCRLF
INT21H
ENDSTART
5.19编写排序子程序SORT,以DS、SI和CX作为入口参数,把DS:
SI为起始地址的一个带符号的字数组进行由小到
大排序,参数CX中存放的是数组中元素个数。
DATAREASEGMENT
ARRAYDW1,9,6,8,5,4
CNTDW6
ADDRDW?
DATAREAENDS
CODESEGMENT
DATAREA
MOVAX,DATAREA
MOVDS,AX
LEASI,ARRAY
MOVCX,CNT
CALLSORT
INT21H
SORTPROC
PUSHCX
PUSHAX
PUSHBX
PUSHSI
INIT:
MOVBX,1
DECCX
JZSORTED
CMP[SI+2],AX
JGECONT
XCHG[SI+2],AX
MOV[SI],AX
XORBX,BX;
置交换标志
CONT:
LOOPNEXT
POPSI
POPCX
CMPBX,0
JEINIT
SORTED:
POPSI
POPBX
POPAX
POPCX
RET
SORTENDP
CODE