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

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

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

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

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

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

功能:

输出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

ENDSTART

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

ENDS

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

当前位置:首页 > 人文社科 > 视频讲堂

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

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