新编汇编语言程序设计四五章习题参考解答.docx

上传人:b****5 文档编号:5350744 上传时间:2022-12-15 格式:DOCX 页数:23 大小:25.60KB
下载 相关 举报
新编汇编语言程序设计四五章习题参考解答.docx_第1页
第1页 / 共23页
新编汇编语言程序设计四五章习题参考解答.docx_第2页
第2页 / 共23页
新编汇编语言程序设计四五章习题参考解答.docx_第3页
第3页 / 共23页
新编汇编语言程序设计四五章习题参考解答.docx_第4页
第4页 / 共23页
新编汇编语言程序设计四五章习题参考解答.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

新编汇编语言程序设计四五章习题参考解答.docx

《新编汇编语言程序设计四五章习题参考解答.docx》由会员分享,可在线阅读,更多相关《新编汇编语言程序设计四五章习题参考解答.docx(23页珍藏版)》请在冰豆网上搜索。

新编汇编语言程序设计四五章习题参考解答.docx

新编汇编语言程序设计四五章习题参考解答

习题四

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

CODE

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1