新编汇编语言程序设计四五章习题参考解答.docx
- 文档编号:12261640
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:26
- 大小:25.52KB
新编汇编语言程序设计四五章习题参考解答.docx
《新编汇编语言程序设计四五章习题参考解答.docx》由会员分享,可在线阅读,更多相关《新编汇编语言程序设计四五章习题参考解答.docx(26页珍藏版)》请在冰豆网上搜索。
新编汇编语言程序设计四五章习题参考解答
习题四
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=0001
4.7测试名为X的一个字节,如果X的第1,3位均为1,转移到L1,如果只有一位为1,转移到L2,如果两位全为0,
转移到L3。
写出对应的指令序列。
答:
MOVAL,X
ANDAL,00001010B
JZL3
CMPAL,00001010B
JEL1
JMPL2
4.12计算分段函数:
X的值从键盘输入,Y的值送显示器输出。
答:
INCLUDEYLIB.H
DATASEGEMNT
MESS1DB0DH,0AH,‘InputvalueofXplease:
$’
MESS2DB0DH,0AH,‘Y=:
$’
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEADX,MESS1
CALLREADINT;输入X的值
CMPAX,-2
JGEL2
L1:
SUBAX,3;AX←X-3
JMPDONE
L2:
CMPAX,3
JGL3
MOVBX,AX
ADDAX,AX;AX←2X
ADDAX,AX;AX←4X
ADDAX,BX;AX←5X
ADDAX,6;AX←5X+6
JMPDONE
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?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
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
INT21H
CODEENDS
ENDSTART
说明:
一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小的数必须来自LIST数组。
4.16一个有符号字数组以0为结束标志,求这个数组的:
最大值、最小值、平均值。
答:
DATASEGEMNT
LISTDW-56,+12,88,-126,-5,16,32,-99,72,-18,0
MINDW?
MAXDW?
AVGDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVMIN,32767;将32767假设为最小的数
MOVMAX,-32768;将-32768假设为最大的数
MOVAVG,0;AVG用作累加器,清零
LEASI,LIST
MOVCX,0
AGAIN:
MOVAX,[SI]
CMPAX,0
JZDONE;找到零元素,转DONE结束处理
INCCX;纪录非零元素个数
ADDAVG,AX;累加
CMPAX,MIN
JGESKIP1
MOVMIN.AX;比预设最小值还小,保留
SKIP1:
CMPAX,MAX
JLESKIP2
MOVMAX,AX;比预设最大值还大,保留
SKIP2:
ADDSI,2
JMPAGAIN
DONE:
JCXZNULL;元素个数为零,转NULL处理
MOVAX,AVG
CWD
IDIVCX
MOVAVG,AX;计算平均值
JMPEXIT
NULL:
MOVMIN,0;元素个数为0,将“最大值”、“最小值”
MOVMAX,0;“平均值”清零
MOVAVG,0
EXIT:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
4.21编写程序,把一个30个元素的有符号字数组ARRAY按照各元素的正负分别送入数组P和M,正数和零元素送P
数组,负数送M数组。
答:
DATASEGEMNT
ARRAYDW30DUP(?
);汇编之前置入数据
PDW30DUP(?
)
MDW30DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
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
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
4.30编写程序,输入N,计算:
S=1*2+2*3+……+(N-1)*N
答:
INCLUDEYLIB.H
CODESEGMENT
ASSUMECS:
CODE
MESS1DB0DH,0AH,‘InputNplease:
$’
MESS2DB0DH,0AH,‘S=$’
START:
PUSHCS
POPDS
LEADX,MESS1
CALLREADDEC;输入N
MOVCX,AX
XORBX,BX;BX用作累加器
ONE:
MOVAX,CX
MOVSI,AX
DECSI
MULSI;计算J*(J-1)
ADDBX,AX;累加
LOOPONE
LEADX,MESS2
MOVAX,BX
CALLWRITEDEC;输出结果
CALLCRLF
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
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
CODESEGMENT
ASSUMECS:
CODE
START:
CALLCRLF
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行,继续
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
习题五
5.4阅读下面的程序,指出该程序计划完成的功能,同时指出程序中尚存在的错误。
CODESEGMENT
ASSUME:
CS:
CODE
START:
MOVCX,20
LOOP0:
CALLPRINTSPACE
LOOPLOOP0
MOVAH,4CH
INT21H
PRINTSPACEPROCNEAR
MOVCX,40;该行上面添加:
PUSHCX
PSLOOP:
MOVAL,‘’
MOVAH,02H
INT21H
LOOPPSLOOP
MOVAL,0AH
MOVAH,02H
INT21H
MOVAL,0DH
MOVAH,02H
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
START:
MOVAX,@DATA
MOVDS,AX
MOVCX,0
LEABX,KEYIN
NEXT:
MOVAH,01H
INT21H
CMPAL,'$'
JZCOUNT
INCCX
MOV[BX],AL
INCBX
JMPNEXT
COUNT:
LEABX,KEYIN
COUNT1:
LEADI,S0
MOVAL,[BX]
SUBAL,30H
MOVAH,0
ADDDI,AX
INCBYTEPTR[DI]
INCBX
LOOPCOUNT1
MOVAX,4C00H
INT21H
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?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEAAX,BUF;入口参数进栈
PUSHAX
MOVAX,COUNT
PUSHAX
CALLMAX
POPSMAX;最大值出栈,送SMAX
MOVAH,4CH
INT21H
MAXPROC
PUSHBP
MOVBP,SP
MOVSI,[BP+6];BUF的偏移地址送SI
MOVCX,[BP+4];COUNT送CX
MOVBX,[SI];取第一个数据至BX
DECCX
MAX1:
ADDSI,2
CMPBX,[SI]
JAENEXT
MOVAX,[SI];取第二个数至AX
NEXT:
LOOPMAX1
MOV[BP+6],BX;最大值进栈
POPBP
RET2;返回后SP指向最大值
MAXENDP
CODEENDS
ENDSTART
SP
返回偏移地址
COUNT
BUF的偏移地址
CALLMAX执行之后
SP
COUNT
BUF的偏移地址
CALLMAX执行之前
SP
返回偏移地址
COUNT
BUF的偏移地址
保护现场之前
BP
SP
返回偏移地址
COUNT
最大值
恢复现场之后
BP
返回偏移地址
COUNT
SP
最大值
执行RET2之后
5.9编写求绝对值的子程序,利用它计算三个变量的绝对值之和。
解:
.MODELSMALL
.DATA
VALUEDW-5,5,-10
SUMDW0
.CODE
START:
MOVAX,@DATA
MOVDS,AX
LEABX,VALUE
MOVCX,3
MOVSUM,0
ONE:
CALLABS
ADDSUM,AX
ADDBX,2
LOOPONE
MOVAX,4C00H
INT21H
;子程序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
.MODELSMALL
.DATA
SUMDW0
PROMPT1DB0DH,0AH,'INPUTTHENUMBERN:
$'
PROMPT2DB0DH,0AH,'THESUMIS:
$'
.CODE
START:
MOVAX,@DATA
MOVDS,AX
LEADX,PROMPT1
CALLREADDEC
CMPAX,0
JZEXIT
MOVCX,AX
CALLSUMM
LEADX,PROMPT2
CALLWRITEDEC
CALLCRLF
EXIT:
MOVAX,4C00H
INT21H
SUMMPROC
MOVAX,0
NEXT:
MOVBX,CX
ADDBX,BX
ADDAX,BX
LOOPNEXT
RET
SUMMENDP
ENDSTART
(2)INCLUDEYLIB.H
DATASEGMENT
SUMDW0
PROMPT1DB0DH,0AH,'INPUTTHENUMBER:
$'
PROMPT2DB0DH,0AH,'THESUMIS:
$'
DATAENDS
CODE1SEGMENT
ASSUMEDS:
DATA,CS:
CODE1
START:
MOVAX,DATA
MOVDS,AX
LEADX,PROMPT1
CALLREADDEC
CMPAX,0
JZEXIT
MOVCX,AX
CALLFARPTRSUMM
LEADX,PROMPT2
CALLWRITEDEC
CALLCRLF
EXIT:
MOVAX,4C00H
INT21H
CODE1ENDS
CODE2SEGMENT
ASSUMECS:
CODE2,DS:
DATA
SUMMPROCFAR
MOVAX,0
NEXT:
MOVBX,CX
ADDBX,BX
ADDAX,BX
LOOPNEXT
RET
SUMMENDP
CODE2ENDS
ENDSTART
(3)
;EXEC5103A.ASM
PUBLICSUMM
CODE2SEGMENT
ASSUMECS:
CODE2
SUMMPROCFAR
MOVAX,0
NEXT:
MOVBX,CX
ADDBX,BX
ADDAX,BX
LOOPNEXT
RET
SUMMENDP
CODE2ENDS
END
;EXEC5103B.ASM
INCLUDEYLIB.H
EXTRNSUMM
DATASEGMENT
SUMDW0
PROMPT1DB0DH,0AH,'INPUTTHENUMBER:
$'
PROMPT2DB0DH,0AH,'THESUMIS:
$'
DATAENDS
CODE1SEGMENT
ASSUMEDS:
DATA,CS:
CODE1
START:
MOVAX,DATA
MOVDS,AX
LEADX,PROMPT1
CALLREADDEC
CMPAX,0
JZEXIT
MOVCX,AX
CALLFARPTRSUMM
LEADX,PROMPT2
CALLWRITEDEC
CALLCRLF
EXIT:
MOVAX,4C00H
INT21H
CODE1ENDS
ENDSTART
5.19编写排序子程序SORT,以DS、SI和CX作为入口参数,把DS:
SI为起始地址的一个带符号的字数组进行由小到
大排序,参数CX中存放的是数组中元素个数。
解:
DATAREASEGMENT
ARRAYDW1,9,6,8,5,4
CNTDW6
ADDRDW?
DATAREAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATAREA
START:
MOVAX,DATAREA
MOVDS,AX
LEASI,ARRAY
MOVCX,CNT
CALLSORT
MOVAX,4C00H
INT21H
SORTPROC
PUSHCX
PUSHAX
PUSHBX
PUSHSI
INIT:
MOVBX,1
DECCX
JZSORTED
PUSHSI
PUSHCX
NEXT:
MOVAX,[SI]
CMP[SI+2],AX
JGECONT
XCHG[SI+2],AX
MOV[SI],AX
XORBX,BX;置交换标志
CONT:
ADDSI,2
LOOPNEXT
POPSI
POPCX
CMPBX,0
JEINIT
SORTED:
POPSI
POPBX
POPAX
POPCX
RET
SORTENDP
CODEENDS
ENDS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 新编 汇编语言 程序设计 四五 习题 参考 解答