宏指令及子程序设计实验.docx

上传人:b****5 文档编号:28142733 上传时间:2023-07-08 格式:DOCX 页数:14 大小:66.33KB
下载 相关 举报
宏指令及子程序设计实验.docx_第1页
第1页 / 共14页
宏指令及子程序设计实验.docx_第2页
第2页 / 共14页
宏指令及子程序设计实验.docx_第3页
第3页 / 共14页
宏指令及子程序设计实验.docx_第4页
第4页 / 共14页
宏指令及子程序设计实验.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

宏指令及子程序设计实验.docx

《宏指令及子程序设计实验.docx》由会员分享,可在线阅读,更多相关《宏指令及子程序设计实验.docx(14页珍藏版)》请在冰豆网上搜索。

宏指令及子程序设计实验.docx

宏指令及子程序设计实验

 

实验五:

宏指令及子程序设计实验

 

院系名称

电子工程学院

学生姓名

李倩(33)

专业名称

电子信息工程

班级

电子0808

 

宏指令及子程序设计实验

5.5.1实验目的

1、熟悉宏指令、宏定义、宏调用以及宏展开的概念;掌握宏指令的定义与调用的方法。

2、掌握子程序的定义、调用以及调用程序与子程序之间参数的传递方法。

3、了解宏指令与子程序的异同以及各自的适用场合。

5.5.2实验预习要求

1、复习宏指令的定义与调用方法。

2、复习过子程序的定义与调用方法。

3、根据“2.5.3实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。

4、从“2.5.4实验习题”中任选一道题目,编写源程序,以便上机调试。

5.5.3实验内容

从键盘输入10个无符号十进制数(小于256),将其转换为二进制数并存放在NUM字节型变量中,找出其中的最大数,并将找出的最大数在屏幕上显示出来。

要求:

在屏幕上显示字符串提示信息的功能由宏指令DSTRING实现;

将键盘输入的十进制数转换成二进制数由子程序DTOB实现;

在N个无符号字节型二进制数中找出最大数的功能由子程序FMAX实现;

将一个无符号字节型二进制数转换为十进制数并在屏幕上显示的功能由子程序BTOAD实现。

程序运行结果如右图所示。

1、编程指导

(1)显示提示信息的宏指令DSTRING的编写

宏指令通常用于在程序中需要反复使用但所需指令条数又不是很多的情形;而对于需要经常使用且需要较多指令才能完成的功能通常通过子程序调用来实现。

这是因为,从执行速度上看,由于子程序调用涉及到保护断点的操作,因此,子程序调用比宏调用执行时间相对要稍长一些;但从生成的可执行文件的大小方面考虑,子程序调用生成的文件要小一些。

读者在进行汇编语言程序设计时,应综合考虑两者的利弊,以便进行合理选择。

下面给出实现提示信息显示的宏指令的定义:

DSTRINGMACROSTRING

PUSHDX

PUSHAX

MOVDX,OFFSETSTRING

MOVAH,09H

INT21H

POPAX

POPDX

ENDM

请读者注意,宏指令应该先定义,后调用。

因此,宏定义通常紧跟在代码段中段寄存器赋值指令之后给出。

(2)将键盘输入的十进制数转换为二进制数的子程序DTOB的编写

子程序的定义方法请参阅教材“5.6.4子程序设计”一节。

将十进制数转换为二进制数的程序代码请参阅本书“2.4.3实验内容”中“编程指导”部分。

(3)在N个无符号字节型二进制数中找出最大数的子程序FMAX的编写

请参阅教材“5.6.3循环程序设计”一节例5.12。

(4)将一个无符号字节型二进制数转换为十进制数并在屏幕上显示的子程序BTOAD的编写

程序代码请参阅本书“2.4.3实验内容”中“编程指导”部分。

2、源程序:

COUNTEQU10

DATASEGMENT

MADB0

NUMDB10DUP(?

IBUFDB7,0,6DUP(?

OBUFDB6DUP(?

INFOR1DB"Pleaseinput10numbers:

(<256)",10,13,'$'

INFOR2DB"THEMAXFOOUNDINTHE10NUMBERSIS"

INFOR3DB10,13,'$'

DATAENDS

STACKSEGMENTSTACK

DATA2DW40DUP(?

TOPEQULENGTHDATA2

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

START:

MOVAX,DATA

MOVDS,AX

MOVAX,STACK

MOVSS,AX

MOVAX,TOP

MOVSP,AX

DSTRINGMACROSTI

PUSHDX

PUSHAX

LEADX,STI

MOVAH,9

INT21H

POPAX

POPDX

ENDM

DSTRINGINFOR1

MOVBX,OFFSETNUM

MOVCX,COUNT

LOOP1:

CALLSTOB

DSTRINGINFOR3

MOV[BX],AL

INCBX

LOOPLOOP1

MOVAX,OFFSETNUM

PUSHAX

MOVCX,COUNT

PUSHCX

CALLFMAX

DSTRINGINFOR2

CALLBTOAD

MOVAH,4CH

INT21H

STOBPROC

PUSHCX

PUSHBX

PUSHDX

MOVDX,OFFSETIBUF

MOVAH,10

INT21H

MOVCL,IBUF[1]

XORCH,CH

MOVDL,0

MOVBL,1

MOVSI,OFFSETIBUF[1]

INCSI

ADDSI,CX

LOP5:

MOVAL,[SI]

SUBAL,30H

MULBL

ADDDL,AL

MOVAL,10

MULBL

MOVBL,AL

DECSI

LOOPLOP5

MOVAL,DL

POPDX

POPBX

POPCX

RET

STOBENDP

;定义在N个无符号字节型二进制数中找出最大数的子程序FMAX

FMAXPROC

MOVBP,SP

MOVSI,[BP+4]

movCX,[BP+2]

DECCX

MOVAL,[SI]

LOP2:

INCSI

MOVAH,[SI]

CMPAH,AL

JBENEXT

XCHGAH,AL

NEXT:

LOOPLOP2

MOVMA,AL

RET

FMAXENDP

BTOADPROC

MOVAL,MA

XORAH,AH

MOVBL,100

MOVCX,3

LOP3:

DIVBL

PUSHAX

MOVDL,AL

ADDDL,30H

MOVAH,2

INT21H

MOVAL,BL

XORAH,AH

MOVBL,10

DIVBL

MOVBL,AL

POPAX

MOVAL,AH

XORAH,AH

LOOPLOP3

RET

BTOADENDP

CODEENDS

ENDSTART

实验结果:

2.5.4实验习题

1、从键盘输入N个十进制数,求它们的和(累加和要求不大于65535),并将累加结果在屏幕上显示出来。

要求给出必要的提示信息(用宏调用完成);累加功能由子程序调用实现;二进制数形式的累加和转换为十进制数并显示由子程序调用实现。

源程序:

COUNTEQU10

DATASEGMENT

NUMDW10DUP(?

IBUFDB6,0,6DUP(?

SUMDW0

INFOR1DB"Pleaseinput10numbers:

",10,13,'$'

INFOR2DB"THESUMIS"

INFOR3DB10,13,'$'

DATAENDS

STACKSEGMENTSTACK

DATA2DW40DUP(?

TOPEQULENGTHDATA2

STACKENDS

CODESEGMENT

assumeCS:

CODE,DS:

DATA,SS:

STACK

START:

MOVAX,DATA

MOVDS,AX

MOVAX,STACK

MOVSS,AX

MOVAX,TOP

MOVSP,AX

DSTRINGMACROSTI;显示字符信息的宏指令

PUSHDX

PUSHAX

PUSHBX

PUSHCX

LEADX,STI

MOVAH,9

INT21H

POPCX

POPBX

POPAX

POPDX

ENDM

DSTRINGINFOR1

MOVBX,OFFSETNUM

MOVCX,COUNT

LOOP1:

CALLSTOB

DSTRINGINFOR3

MOV[BX],AX

INCBX

INCBX

LOOPLOOP1

MOVAX,OFFSETNUM

PUSHAX;通过堆栈向子程序传递参数

MOVCX,COUNT

PUSHCX

CALLGETSUM

DSTRINGINFOR2

DSTRINGINFOR3

CALLBTOAD

MOVAH,4CH

INT21H

STOBPROC

PUSHCX

PUSHBX

PUSHDX

MOVDX,OFFSETIBUF

MOVAH,10

INT21H

MOVCL,IBUF[1]

XORCH,CH

MOVDX,0

MOVBX,1

MOVSI,OFFSETIBUF[1]

ADDSI,CX

LOP5:

MOVAL,[SI]

SUBAL,30H

PUSHDX

XORAH,AH

MULBX

POPDX

ADDDX,AX

PUSHDX

MOVAX,10

MULBX

MOVBX,AX

DECSI

POPDX

LOOPLOP5

MOVAX,DX

POPDX

POPBX

POPCX

RET

STOBENDP

GETSUMPROC

PUSHSI

PUSHBP

PUSHCX

PUSHDX

MOVBP,SP

MOVSI,[BP+12]

movCX,[BP+10]

MOVDX,0

LOP2:

MOVAX,[SI]

ADDDX,AX

ADDSI,2

LOOPLOP2

MOVAX,DX

MOVSUM,DX

POPDX

POPCX

POPBP

POPSI

RET

GETSUMENDP

BTOADPROC

PUSHDX

PUSHCX

PUSHBX

PUSHAX

XORDX,DX

MOVBX,10000

MOVCX,5

LOP3:

DIVBX

PUSHDX

MOVDL,AL

ADDDL,30H

MOVAH,2

INT21H

MOVAX,BX

XORDX,DX

MOVBX,10

DIVBX

MOVBX,AX

POPAX

XORDX,DX

LOOPLOP3

POPAX

POPBX

POPCX

POPDX

RET

BTOADENDP

CODEENDS

ENDSTART

实验结果:

实验心得:

这次试验总体来说较难,调试了很久都没调试出来,最终和同学商量,把书本上有关代码看了好几遍,最终进行调试才得到了正确的程序。

总体来说,经过这次试验,我掌握子程序的定义、调用以及调用程序与子程序之间参数的传递方法,熟悉宏指令、宏定义、宏调用以及宏展开的概念;掌握宏指令的定义与调用的方法,提高了自己的编程能力,通过自己亲手实践学到了更多知识。

 

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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