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

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

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

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

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

5宏指令及子程序设计实验

西安邮电学院

微机原理实验报告

题 目:

    宏指令及子程序设计实验

院系名称:

      计算机学院

专业名称:

      计算机科学与技术

班  级:

       0901

学生姓名:

        马庆祥

学号(8位):

     04091009

指导教师:

     王忠民

2.5 宏令及子程序设计实验

2.5.1 实验目的

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

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

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

2.5.2 实验预习要求

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

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

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

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

2.5.3 实验内容

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

要求:

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

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

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

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

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

1、编程指导

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

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

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

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

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

DSTRING  MACRO  STRING

PUSH  DX

PUSH AX

MOV   DX,OFFSETSTRING

MOV   AH,09H

INT   21H

POP   AX

POP   DX

ENDM

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

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

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

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

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

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

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

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

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

2、程序框架

COUNT EQU  10

DATA  SEGMENT

NUM  DB10DUP(?

IBUF   DB7,0,6DUP(?

OBUF  DB6 DUP(?

INFOR1  DB"Pleaseinput10numbers:

",0AH,0DH,'$'

INFOR2  DB"Themax foundinthe10numbersis$"

INFOR3  DB0AH,0DH,'$'

DATA  ENDS

STACK  SEGMENTstack

DATA2 DW 40 DUP(?

TOP    EQU LENGTHDATA2

STACKENDS

CODE  SEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

start:

   MOV  AX,DATA

MOV   DS,AX

MOV   AX,STACK

MOV   SS,AX

MOV   AX,TOP

 

;定义显示字符串信息的宏指令DSTRING

DSTRINGMACROSTRING

PUSHDX

PUSHAX

MOVDX,OFFSETSTRING

MOVAH,09H

INT21H

POPAX

POPDX

ENDM

MOV   SP,AX

DSTRINGINFOR1

MOV   BX,OFFSETNUM

MOV   CX,COUNT

LOOP1:

  CALL DTOB

DSTRINGINFOR3

MOV   [BX],AL

INC    BX

LOOP   LOOP1

MOV   AX,OFFSETNUM

MOV   CX,COUNT

CALL   FMAX

DSTRINGINFOR2

CALL   BTOAD

MOV   AH,4CH

 

;定义将键盘输入的十进制数转换为二进制数的子程序DTOB

DTOB:

MOVDX,OFFSETIBUF;键入一个十进制数(<65535)

MOVAH,0AH

INT21H

MOVCL,IBUF+1;十进制数的位数送CX

MOVCH,0

MOVSI,OFFSETIBUF+2;指向输入的第一个字符(最高位)

MOVAX,0;开始将十进制数转换为二进制数

AGAIN:

MOVDX,10;((0?

10+a4)?

10+…)?

10+a0,将数存到AL中

MULDX

ANDBYTEPTR[SI],0FH

ADDAL,[SI]

ADCAH,0

INCSI

LOOPAGAIN

RET

INT   21H

 

;定义将一个无符号字节型二进制数转换为十进制数并在屏幕上显示的子程序BTOAD

BTOAD:

MOVBX,OFFSETOBUF+5

MOVBYTEPTR[BX],'$'

MOVCX,10;做(DX):

(AX)/10运算

LOOP2:

MOVDX,0;被除数高16位清0

DIVCX

ADDDL,30H;将DL中的一位十进制数转换为ASCII码

DECBX

MOV[BX],DL

ORAX,AX

JNZLOOP2;判断商是否为0,不为0继续

MOVDX,BX

MOVAH,09H

INT21H;显示转换得到的十进制数

RET

 

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

FMAX:

DECCX

MOVAL,[SI]

T1:

INCSI

CMPAL,[SI]

JAET2

XCHGAL,[SI]

T2:

DECCX

JNZT1;最后最大的数存在AL中

RET

CODE  ENDS

END  start    

2.5.4 实验习题

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

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

程序代码:

DATA  SEGMENT

NUM  DB10DUP(?

)    ;用来存N个数(二进制)小于一个字节

N    DB?

      ;用来存N的值

IBUF   DB7,0,6DUP(?

)    ;用来将十进制转换为二进制

OBUF  DB6 DUP(?

)    ;用来将二进制转换为十进制

INFOR1  DB"PleaseinputtheN:

$"

INFOR2  DB0AH,0DH,"Pleaseinputthenumbers:

",0AH,0DH,'$'

INFOR3  DB0AH,0DH,"Thesumis:

$"

INFOR4  DB0AH,0DH,'$'

DATA  ENDS

CODE  SEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

  MOV  AX,DATA

MOV  DS,AX

DSTRING  MACRO  STRING      ;宏定义

PUSH  DX

PUSH  AX

MOV   DX,OFFSETSTRING

MOV   AH,09H

INT   21H

POP   AX

POP   DX

ENDM

DSTRINGINFOR1

MOV  AH,01H

INT  21H

SUB  AL,30H

MOV  N,AL

DSTRINGINFOR2

MOV  BX,OFFSETNUM

MOV  CL,N

MOV  CH,0

LOOP1:

PUSH  CX

CALL  DTOB

DSTRINGINFOR4

MOV   [BX],AL

INC    BX

POP  CX

LOOP   LOOP1

MOV  SI,OFFSETNUM

MOV  CL,N

CALL  XADD

DSTRING  INFOR3

CALL   BTOAD

JMP  T2

DTOB:

MOV   DX,OFFSETIBUF    ;键入一个十进制数(<65535)

MOV   AH,0AH

INT   21H

MOV   CL,IBUF+1    ;十进制数的位数送CX

MOV   CH,0

MOV   SI,OFFSETIBUF+2  ;指向输入的第一个字符(最高位)

MOV   AX,0      ;开始将十进制数转换为二进制数

AGAIN:

MOV  DX,10      ;((0?

10+a4)?

10+…)?

10+a0,将数存到AL中

MUL   DX

AND   BYTEPTR[SI],0FH

ADD   AL,[SI]

ADC   AH,0

INC   SI

LOOP  AGAIN

RET

XADD:

MOV  AX,0

T1:

MOV  BL,[SI]    ;使程序可以算出大于一个字节的数

MOV  BH,0

ADD  AX,BX

INC  SI

LOOP  T1

RET

BTOAD:

MOV   BX,OFFSETOBUF+5

MOV   BYTEPTR[BX],'$'

MOV   CX,10      ;做(DX):

(AX)/10运算

LOOP2:

MOV  DX,0      ;被除数高16位清0

DIV   CX

ADD   DL,30H      ;将DL中的一位十进制数转换为ASCII码

DEC   BX

MOV   [BX],DL

OR   AX,AX

JNZ   LOOP2      ;判断商是否为0,不为0继续

MOV   DX,BX

MOV   AH,09H

INT   21H      ;显示转换得到的十进制数

RET

T2:

MOV  AH,4CH

INT  21H

CODE  ENDS

END  START

程序流程图:

实验中遇到的问题:

1,当相加结果大于一个字节所能表示的范围时,输出结果错误

2,不同字长的数相加结果不一样,容易混淆

解决方法:

用更多的字节来存储结果,相加是让两个数的字长一致

2.5.5 实验报告总结

1、补全“2.5.3实验内容”中源程序框架内未写出的程序代码,并说明你在调试该程序过程中遇到了哪些问题,是如何处理的?

若允许输入大于255小于65536的十进制数,程序应如何修改?

答:

修改存储数据的字节数,使其能存储大于255的数值,如DW。

2、写出实验小结,内容包括实验心得(收获)、不足之处或今后应注意的问题等。

掌握宏指令的定义和使用方法。

学会根据不同的数值选用不同大小的空间来存储。

掌握数值的输入和输出,以及不同大小的数值怎样存储,怎样运算

 

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

当前位置:首页 > 总结汇报 > 学习总结

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

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