当前位置:文档之家› 宏指令及子程序的设计实验

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

实验五:宏指令及子程序设计实验院系名称:电子工程学院学生:倩(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的编写宏指令通常用于在程序中需要反复使用但所需指令条数又不是很多的情形;而对于需要经常使用且需要较多指令才能完成的功能通常通过子程序调用来实现。

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

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

下面给出实现提示信息显示的宏指令的定义:DSTRING MACRO STRINGPUSH D XPUSH AXMOV DX,OFFSET STRINGMOV AH,09HINT 21HPOP AXPOP DXENDM请读者注意,宏指令应该先定义,后调用。

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

(2)将键盘输入的十进制数转换为二进制数的子程序DTOB的编写子程序的定义方法请参阅教材“5.6.4 子程序设计”一节。

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

(3)在N个无符号字节型二进制数中找出最大数的子程序FMAX的编写请参阅教材“5.6.3 循环程序设计”一节例5.12。

(4)将一个无符号字节型二进制数转换为十进制数并在屏幕上显示的子程序BTOAD的编写程序代码请参阅本书“2.4.3 实验容”中“编程指导”部分。

2、源程序:COUNT EQU 10DATA SEGMENTMA DB 0NUM DB 10 DUP(?)IBUF DB 7,0,6 DUP(?)OBUF DB 6 DUP(?)INFOR1 DB "Please input 10 numbers:(<256)",10,13,'$'INFOR2 DB "THE MAX FOOUND IN THE 10NUMBERS IS "INFOR3 DB 10,13,'$'DATA ENDSSTACK SEGMENT STACKD ATA2 DW 40 DUP(?)TOP EQU LENGTH DATA2STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKS TART: MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXDSTRING MACRO STIPUSH DXPUSH AXLEA DX,STIMOV AH,9INT 21HPOP AXPOP DXENDMDSTRING INFOR1MOV BX,OFFSET NUMMOV CX,COUNTLOOP1: CALL STOBDSTRING INFOR3MOV [BX],ALINC BXLOOP LOOP1MOV AX,OFFSET NUMPUSH AXMOV CX,COUNTPUSH CXCALL FMAXDSTRING INFOR2CALL BTOADMOV AH,4CHINT 21HSTOB PROCPUSH CXPUSH BXPUSH DXMOV DX,OFFSET IBUFMOV AH,10INT 21HMOV CL,IBUF[1]XOR CH,CHMOV DL,0MOV BL,1MOV SI ,OFFSET IBUF[1]INC SIADD SI,CXLOP5: MOV AL,[SI]SUB AL,30HMUL BLADD DL,ALMOV AL,10MUL BLMOV BL,ALDEC SILOOP LOP5MOV AL,DLPOP DXPOP BXPOP CXR ETSTOB ENDP;定义在N 个无符号字节型二进制数中找出最大数的子程序FMAX FMAX PROCMOV BP,SPMOV SI,[BP+4]mov CX, [BP+2]DEC CXMOV AL,[SI]LOP2: INC SIMOV AH,[SI]CMP AH,ALJBE NEXTXCHG AH,ALNEXT : LOOP LOP2MOV MA,ALRETFMAX ENDPBTOAD PROCMOV AL,MAXOR AH,AHMOV BL,100MOV CX,3LOP3: DIV BLPUSH AXMOV DL,ALADD DL,30HMOV AH,2INT 21HMOV AL,BLXOR AH,AHMOV BL,10DIV BLMOV BL,ALPOP AXMOV AL,AHXOR AH,AHLOOP LOP3RETBTOAD ENDPCODE ENDSEND START实验结果:2.5.4 实验习题1、从键盘输入N个十进制数,求它们的和(累加和要求不大于65535),并将累加结果在屏幕上显示出来。

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

源程序:COUNT EQU 10DATA SEGMENTNUM DW 10 DUP(?)IBUF DB 6,0,6 DUP(?)SUM DW 0INFOR1 DB "Please input 10 numbers:",10,13,'$'INFOR2 DB "THE SUM IS "INFOR3 DB 10,13,'$'DATA ENDSSTACK SEGMENT STACKDATA2 DW 40 DUP(?)TOP EQU LENGTH DATA2STACK ENDSCODE SEGMENTassume CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXDSTRING MACRO STI ;显示字符信息的宏指令 PUSH DXPUSH AXPUSH BXPUSH CXLEA DX,STIMOV AH,9INT 21HPOP CXPOP BXPOP AXPOP DXENDMDSTRING INFOR1MOV BX,OFFSET NUMMOV CX,COUNTLOOP1: CALL STOBDSTRING INFOR3MOV [BX],AXINC BXINC BXLOOP LOOP1MOV AX,OFFSET NUMPUSH AX ;通过堆栈向子程序传递参数 MOV CX,COUNTPUSH CXCALL GETSUMDSTRING INFOR2DSTRING INFOR3CALL BTOADMOV AH,4CHINT 21HSTOB PROCPUSH CXPUSH BXPUSH DXMOV DX,OFFSET IBUFMOV AH,10INT 21HMOV CL,IBUF[1]XOR CH,CHMOV DX,0MOV BX,1MOV SI ,OFFSET IBUF[1]ADD SI,CXLOP5: MOV AL,[SI]SUB AL,30HPUSH DXXOR AH,AHMUL BXPOP DXADD DX,AXPUSH DXMOV AX,10MUL BXMOV BX,AXDEC SIPOP DXLOOP LOP5MOV AX,DXPOP DXPOP BXPOP CXRETSTOB ENDPGETSUM PROCP USH SIPUSH BPPUSH CXPUSH DXMOV BP,SPMOV SI,[BP+12]mov CX, [BP+10]MOV DX,0LOP2: MOV AX,[SI]ADD DX,AXADD SI,2LOOP LOP2MOV AX,DXMOV SUM,DXPOP DXPOP CXPOP BPPOP SIRETGETSUM ENDPBTOAD PROCPUSH DXPUSH CXPUSH BXPUSH AXXOR DX,DXMOV BX,10000MOV CX,5LOP3: DIV BXPUSH DXMOV DL,ALADD DL,30HMOV AH,2INT 21HMOV AX,BXXOR DX,DXMOV BX,10DIV BXMOV BX,AXPOP AXXOR DX,DXLOOP LOP3POP AXPOP BXPOP CXPOP DXRETBTOAD ENDPCODE ENDSEND START实验结果:实验心得:这次试验总体来说较难,调试了很久都没调试出来,最终和同学商量,把书本上有关代码看了好几遍,最终进行调试才得到了正确的程序。

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

相关主题