宏指令及子程序设计实验
- 格式:doc
- 大小:350.50 KB
- 文档页数:9
27.编制计算N(N<50)个偶数之和(2+4+6+…)的子程序和接收键入N及将结果显示在主程序。
子程序代码:stack segment stack 'stack';定义堆栈段dw 32 dup(?);堆栈段有32字空间stack endsdata segment;定义数据段input db 'please input N:','$'n db 5,0,5 dup(?);定义变量数据区nobfdb 8 dup(?)data endscode segment;定义代码段start proc far ;定义一个过程startassume ss:stack,cs:code,ds:datapush dssub ax,ax;未通过过程DOS返回做准备push axmovax,datamovds,axmovdx,offset inputmov ah,9;9号功能调用,显示器显示“please input N:”int 21hmovdx,offset nmov ah,10;10号功能调用,键盘输入并显示数据nint 21hmovsi,offset n+2mov cl,n+1mov ch,0call a;调用子程序acall sum;调用子程序sumshl ax,1;乘2movbx,segobfmoves,bxmovdi,offset obf+1call b;调用子程序bcall HH;调用子程序HHmovdx,offsetobfmov ah,9int 21hRETstart endpsum proc;定义子程序sum,sum为自然数相加子程序push cx;保护现场push bxmovcx,axmov bx,0movax,bxsm: adc bx,1;把bx,1和CF相加adcax,bx;把ax,bx和CF相加loop smpop bx;恢复现场pop cxRETsum endpa proc;定义子程序a,a为键盘输入的十进制数转化成16进制子程序mov ax,0c0: push cxmov cx,10mul cx;乘法指令调用and byte ptr[si],0fh;十进制的asc码转换成BCD码add al,[si]adc ah,0incsi;越过负号指向数字pop cxloop c0RETa endpb proc;定义过程c,b为16进制转换成asc码push axpush bxpush cxpush dxpush dior ax,ax;判断数的负号jns plus;为正转到plusmov byte ptres:[di],'-';为负送负号至输出数据区inc di;求负数的绝对值neg axplus: m ov cx,0;将ax中2进制转换成10进制mov bx,10c1: mov dx,0div bxpush dx;余数进栈inc cx;十进制位数加1or ax,ax;商不为0继续除以10jnz c1c2: pop ax;将十进制转换成asc码add al,30hstosbloop c2mov al,'$'stosbpop dipop dxpop cxpop bxpop axRETb endpHH proc;定义过程HHmov dl,0ah;换行mov ah,2int 21hmov dl,0dh;换行mov ah,2int 21hRETHH endpcode endsend start截图如下:宏指令代码:sum macro A;定义宏sum,sum为自然数相加子程序push cx;保护现场push bxmovcx,Amov bx,0movax,bxsm: adc bx,1;把bx,1和CF相加adcax,bx;把ax,bx和CF相加loop smpop bx;恢复现场pop cxendmstack segment stack 'stack';定义堆栈段dw 32 dup(?);堆栈段有32字空间stack endsdata segment;定义数据段input db 'please input N:','$'n db 5,0,5 dup(?);定义变量数据区nobfdb 8 dup(?)data endscode segment;定义代码段start proc far ;定义一个过程startassume ss:stack,cs:code,ds:datapush dssub ax,ax;未通过过程DOS返回做准备push axmovax,datamovds,axmovdx,offset inputmov ah,9;9号功能调用,显示器显示“please input N:”int 21hmovdx,offset nmov ah,10;10号功能调用,键盘输入并显示数据nint 21hmovsi,offset n+2mov cl,n+1mov ch,0call a;调用子程序aSUM ax;宏展开sumshl ax,1;乘2movbx,segobfmoves,bxmovdi,offset obf+1call b;调用子程序bcall HH;调用子程序HHmovdx,offsetobfmov ah,9int 21hretstart endpa proc;定义子程序a,a为键盘输入的十进制数转化成16进制子程序mov ax,0c0: push cxmov cx,10mul cx;乘法指令调用and byte ptr[si],0fh;十进制的asc码转换成BCD码add al,[si]adc ah,0incsi;越过负号指向数字pop cxloop c0reta endpb proc;定义过程c,b为16进制转换成asc码push axpush bxpush cxpush dxpush dior ax,ax;判断数的负号jns plus;为正转到plusmov byte ptres:[di],'-';为负送负号至输出数据区inc di;求负数的绝对值neg axplus: m ov cx,0;将ax中2进制转换成10进制mov bx,10c1: mov dx,0div bxpush dx;余数进栈inc cx;十进制位数加1or ax,ax;商不为0继续除以10jnz c1c2: pop ax;将十进制转换成asc码add al,30hstosbloop c2mov al,'$'stosbpop dipop dxpop cxpop bxpop axRETb endpHH proc;定义过程HHmov dl,0ah;换行mov ah,2int 21hmov dl,0dh;换行mov ah,2int 21hRETHH endp code endsend start 截图如下:。
实验一简单程序编制和上机过程一.实验目的1.掌握计算机常用代码的软件转换技术。
2.熟悉DEBUG软件的使用。
3.掌握简单程序的编程方法。
二.实验内容代码转换是计算机和I/O设备进行信息交换的重要技术之一。
各种I/O设备所提供和接收的数据编码不尽相同。
为了处理这些信息,计算机必须将各种不同编码形式的信息转换成别种适当的数据形式。
例如,键盘输入的数据均为ASC Ⅱ码形式存储在内存中,通常要求将其转换成相应的数据形式。
一般实现代码转换有两种方法:1.软件法利用CPU的算术逻辑运算功能,通过运算或查表实现各种数据代码间的转换。
该方法经济但速度慢。
2.硬件法利用专用代码转换集成电路进行转换。
如74LS74可把BCD码转换为七段代码。
这种方法需要硬件费用,但速度快。
本实验要求掌握软件编码转换技术。
计算机常用的代码有二进制、八进制、十六进制、BCD码、ASCⅡ码、七段码等,它们之间的相互关系如下表所示。
本次试验的内容是ASCⅡ码转换为未组合BCD码设从键盘输入十进制数的ASCⅡ码已存放在起始地址CS :150H的单元中,把它转换成未组合BCD码后,再分别存入起始地址为CS:15AH的单元中。
若输入的不是十进制数的ASCⅡ码,则相应存放结果单元的内容为“FF”。
提示:1.组合BCD码是一位十进制数字占一个字节,高半字节为0,低半字节为该十进制数字的BCD码。
ASCⅡ码转换为未组合BCD码只需减30H。
2.程序框图如下图所示。
3.程序执行前,需要在CS:150H内存缓冲区写入待转换的ASCⅡ码。
方法如下:方法一:用A命令-ACS:150 DB 35,39,30,41,32CS:155 ∧C方法二:用E 命令-ECS:150,35,39,30,41,32方法三:用F命令-FCS:150 L5 35,39,30,41,321.执行程序后检查执行结果可用D命令:-DCS:15ACS:15A 05,09,00,FF,02ASCⅡ码转换为未组合BCD码的程序流程图参考程序如下:ORG 100HMOV CX,0005HMOV DI,150HBB:MOV BL,0FFHMOV A,[DI]CMP AL,3AHJNB DONESUB AL,30HJB DONEMOV BL,ALDONE:MOV AL,BLMOV [DI+0AH],ALINC DILOOP BBINT 20HORG 150HDB 35H,39H,30H,41H,32H实验二顺序结构的程序设计一.实验目的1.掌握计算机常用代码的软件转换技术。
宏指令及子程序设计实验实验目的本实验旨在通过学习宏指令和子程序的设计,加深对宏指令和子程序的理解,并掌握其在程序设计中的应用。
实验要求1.理解宏指令的概念及作用,并能够熟练使用宏指令编写程序;2.熟悉子程序的概念及调用过程,并能够设计和调用子程序。
实验工具1.汇编语言编辑器;2.汇编语言调试工具;3.计算机实验环境。
实验内容一、宏指令设计与应用宏指令是在汇编语言中为了简化重复性工作而设计的一种指令。
通过宏指令,可以将一段相对独立的代码组织成一个宏过程,每次使用时可以直接调用该宏。
在本实验中,我们将通过以下步骤进行宏指令的设计与应用:1.设计一个宏指令,完成对一个给定的数组进行排序的功能;2.将该宏指令应用于一个具体的程序中,验证其效果。
二、子程序设计与调用子程序是一段相对独立的代码段,可以被主程序调用。
子程序的设计和调用能够提高程序的模块化程度,方便代码的组织和维护。
在本实验中,我们将通过以下步骤进行子程序的设计与调用:1.设计一个子程序,实现对一个给定字符串的逆序输出;2.在主程序中调用该子程序,并验证其功能。
实验步骤一、宏指令设计与应用1.根据给定的数组排序算法,设计一个宏指令,命名为SORT_ARRAY;2.在宏指令中,使用适当的寄存器和数据段定义,实现对给定数组的排序;3.在主程序中使用SORT_ARRAY宏指令,对一个给定的数组进行排序,并将结果输出。
二、子程序设计与调用1.设计一个子程序,命名为REVERSE_STRING,实现对一个给定字符串的逆序输出;2.在子程序中,使用适当的寄存器定义和字符串操作指令,实现对给定字符串的逆序输出;3.在主程序中,调用REVERSE_STRING子程序,并将一个给定的字符串作为参数传入;4.将子程序的输出结果输出。
实验结果分析通过以上的实验操作,我们可以得到下面的结果:1.宏指令设计与应用:通过排序数组的实验,我们可以验证宏指令的设计与应用的效果。
昆明理工大学信息工程与自动化学院学生实验报告( 2019 — 2019 学年第 1 学期)课程名称:汇编与微机接口开课实验室:信自楼机房445 2019年10月21日年级、专业、班学号姓名成绩实验项目名称宏指令设计指导教师教师评语该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□该同学的实验能力: A.强□ B.中等□ C.差□该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□实验报告是否规范: A.规范□ B.基本规范□ C.不规范□实验过程是否详细记录: A.详细□ B.一般□ C.没有□教师签名:年月日一、实验目的和内容1. 掌握宏指令库的设计方法,并设计程序来调用其中的宏指令。
2. 编程实现32位二进制数除以16位二进制数,并把结果用十进制数形式显示在屏幕上。
要求采用宏指令库实现。
二、实验原理及基本技术路线图(方框原理图)宏指令是源程序中一段有独立功能的程序代码。
宏指令由宏定义伪指令定义,它只需在源程序中定义一次,便可以多次被调用。
当源程序被汇编时,汇编程序对每个宏调用进行宏扩展。
宏扩展就是用宏定义体替换宏指令名,并用实参数替换形式参数。
宏调用中实参数个数和形式参数个数不等时,若实参数个数大于形式参数个数,在替换时多余的实参数不予考虑;若实参数个数小于形式参数个数,则多余的形式参数作为空(字符)或零(数字)处理。
应保证用实参数替换形式参数后,所展开的是有效的汇编语句,否则汇编程序会提示错误。
为了使宏指令能让多个程序共享,可以把它们组织到一个文件中,并存放在磁盘上,把这种文件称为宏指令库。
可以用EDIT 等任何文本编辑程序创建宏指令库,库名由用户自己起,而且对库的扩展名没有特殊要求。
库中的宏指令以源代码形式出现。
三、所用仪器、材料(设备名称、型号、规格等)1. 操作系统平台:Windows 7。
2. 汇编环境:Microsoft MASM 5.0。
3. 文本编辑器:记事本。
第1篇一、实验目的1. 理解宏的概念及其在编程中的作用。
2. 掌握宏的创建方法,包括条件宏、无参数宏和带参数宏。
3. 熟悉宏的使用技巧,提高编程效率。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验内容1. 宏的概念宏是一种在编译预处理阶段对源代码进行替换的技术。
它可以将一段代码替换为一个简单的标识符,从而提高编程效率。
2. 宏的创建(1)条件宏条件宏允许根据特定的条件编译不同的代码。
其语法如下:```cppifdef 条件标识符// 条件成立时编译的代码else// 条件不成立时编译的代码endif```(2)无参数宏无参数宏是一种简单的宏,它只包含一个标识符。
其语法如下:```cppdefine 宏名替换后的代码```(3)带参数宏带参数宏允许在宏中使用参数,从而实现更灵活的代码替换。
其语法如下:```cppdefine 宏名(参数1, 参数2, ...) 替换后的代码```3. 宏的使用技巧(1)避免使用宏进行复杂的逻辑运算,以免降低代码的可读性。
(2)合理使用条件宏,避免不必要的代码编译。
(3)合理使用带参数宏,提高代码的复用性。
四、实验步骤1. 创建一个名为“MacroTest.cpp”的C++源文件。
2. 在文件中编写以下代码:```cppinclude <iostream>// 条件宏ifdef DEBUGdefine LOG(msg) std::cout << "DEBUG: " << msg << std::endl elsedefine LOG(msg)endif// 无参数宏define PI 3.1415926// 带参数宏define MAX(a, b) ((a) > (b) ? (a) : (b))int main() {// 使用条件宏LOG("This is a debug message");// 使用无参数宏std::cout << "The value of PI is: " << PI << std::endl;// 使用带参数宏std::cout << "The maximum value is: " << MAX(3, 5) << std::endl;return 0;}```3. 在Visual Studio 2019中编译并运行程序,观察输出结果。
实验五子程序结构设计一、实验目的1、加深对子程序的理解,掌握子程序的结构。
2、掌握子程序的设计、编写及调试方法。
3、掌握宏定义及宏调用的方法。
二、实验内容1、已知在内存数据段中GRADE开始单元连续存放着10个学生的成绩,试采用子程序结构编程实现以下功能:(1)找到最高成绩,将其偏移地址存放在内存单元MAX中。
(2)统计不及格的人数,存放在内存单元COUNT中。
(3)计算平均成绩(只取整数部分),并在屏幕上显示。
要求:将以上功能分别写成子程序,数据区定义如下DSEG SEGMENTGRADE DB 76,68,54,80,45,92,63,58,94,85MAX DW ?COUNT DB ?DSEG ENDS源代码:DATAS SEGMENTGRADE DB76,68,54,80,45,92,63,58,94,85MAX DW?COUNT DB?DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,datasMOV DS,AXCALL MAXGRADECALL BUJIGECALL A VGRADERETMAIN ENDPMAXGRADE PROC FARpush axpush cxpush simov cx,10mov ax,0mov si,axstart_loop:mov ax,word ptr grade[si]cmp ax,word ptr grade[si+1]jge bigmov ax,word ptr grade[si+1]big: inc siloop start_loopmov max,axpop sipop cxpop axretMAXGRADE ENDPBUJIGE PROC FARPUSH SIPUSH CXPUSH AXMOV AX,0MOV COUNT,0MOV CX,10LOOP_START2:MOV AX,WORD PTR GRADE[SI]CMP AX,60JG SMALL2INC COUNTSMALL2:INC SILOOP LOOP_START2POP AXPOP CXPOP SIRETBUJIGE ENDPA VGRADE PROC FARpush dssub ax,axpush axmov ax,DATASmov ds,axmov cx,10 ;循环控制mov bx,0mov dx,0 ;暂存总成绩avg_grade_1:mov al,grade[bx]cbwadd dx,axinc bxloop avg_grade_1mov ax,dxmov bl,10div bl ;除第一次sub ah,ah ;清零div bl ;除第二次push axadd al,30hmov dl,almov ah,02int 21hpop axadd ah,30hmov dl,ahmov ah,02int 21hmov ah,4chint 21hretA VGRADE ENDPCODES ENDSEND2、编写程序实现十进制数的加减运算。
昆明理工大学信息工程与自动化学院学生实验报告(2010 —2011 学年第 1 学期)课程名称:汇编语言程序设计开课实验室: 2010年 12 月 14 日年级、专业、班计科083 学号姓名成绩实验项目名称宏汇编指导教师教师评语教师签名:年月日一、实验要求宏指令设计1)掌握宏指令库的设计方法,并设计程序来调用其中的宏指令;2)编程实现32位二进制数除以16位二进制数,并把结果用十进制数形式显示在屏幕上。
要求采用宏指令库实现;3)观察并记录运行结果。
二、实验原理及基本技术路线图(方框原理图)使用debug进行调试。
源程序:INCLUDE MACRO.libPURGE SETMODE,INCHAR,OUTCHAR,WINDOW,MOVE,MULSTACKSG SEGMENT STACK 'S'DW 16 DUP('?')STACKSG ENDSDATA SEGMENTA DD 1234001B DW 1234C DW ?PROMPT DB 'The result is: $'ASCII DB 5 DUP(?),'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSGMAIN PROC FARMOV AX,DATAMOV DS,AXMOV DX,WORD PTR A+2MOV AX,WORD PTR ADIV BBIN_DEC ASCII,AX CLRSCRNDISP PROMPTDISP ASCIIRETURNMAIN ENDPCODE ENDSEND MAIN附:宏库MACRO.libSETMODE MACROPUSH AXMOV AH, 0MOV AL, 3INT 10HPOP AXENDMINCHAR MACROPUSH AXMOV AH,1INT 21HPOP AXENDMOUTCHAR MACRO XPUSH DXPUSH AXMOV DL,XMOV AH,2INT 21HPOP AXPOP DXENDMPUSHREG MACROPUSH DXPUSH CXPUSH BXPUSH AXPUSH DIPUSH SIPUSH BPENDMPOPREG MACROPOP BPPOP SIPOP DIPOP AXPOP BXPOP CXPOP DXENDMWINDOW MACRO Collor,WleftTopRow,WLeftTopCul, WRightBottomRow,WRightBottomCulPUSHREGMOV AH ,6MOV AL ,0MOV BH ,CollorMOV CH ,WleftTopRowMOV CL ,WLeftTopCulMOV DH ,WRightBottomRowMOV DL ,WRightBottomCulINT 10HPOPREGENDMMOVE MACRO X,YPUSH AXMOV AX,XMOV Y,AXPOP AXENDMCLRSCRN MACROPUSHREGMOV AH,6MOV AL,0MOV BH,1FHMOV CX,0MOV DX,184FHINT 10HPOPREGENDMCURSOR MACROPUSH AXPUSH BXMOV AH,2XOR BH,BHINT 10HPOP BXPOP AXENDMMUL MACRO M1,M2PUSH AXPUSH BXPUSH DXMOV AX,M1MOV BX,M2MUL BXPOP DXPOP BXPOP AXENDMRETURN MACROPUSH AXMOV AX, 4C00HINT 21HPOP AXENDMBIN_DEC MACRO ASC,BIN LOCAL LOPLOCAL EXITPUSHREGLEA DI, ASC ADD DI, 5MOV AX, BIN MOV BX, 10 LOP: MOV DX, 0CMP AX, 0JE EXITDIV BXADD DL, 30HDEC DIMOV [DI],DLJMP LOPEXIT: POPREGENDMDISP MACRO ASCPUSH DSPUSH DXPUSH AXLEA DX, ASCMOV AH, 9INT 21HPOP AXPOP DXPOP DSENDM三、所用仪器、材料(设备名称、型号、规格等)Masm 6.0,debug。
实验五:宏指令及子程序设计实验院系名称:电子工程学院学生姓名:李倩(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 DXPUSH 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 10DA TA 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,'$'DA TA ENDSSTACK SEGMENT STACKD A TA2 DW 40 DUP(?)TOP EQU LENGTH DA TA2STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA,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 10DA TA 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,'$'DA TA ENDSSTACK SEGMENT STACKDATA2 DW 40 DUP(?)TOP EQU LENGTH DATA2STACK ENDSCODE SEGMENTassume CS:CODE,DS:DA TA,SS:STACKSTART: MOV AX,DA TAMOV 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 BX PUSH 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实验结果:实验心得:这次试验总体来说较难,调试了很久都没调试出来,最终和同学商量,把书本上有关代码看了好几遍,最终进行调试才得到了正确的程序。
总体来说,经过这次试验,我掌握子程序的定义、调用以及调用程序与子程序之间参数的传递方法,熟悉宏指令、宏定义、宏调用以及宏展开的概念;掌握宏指令的定义与调用的方法,提高了自己的编程能力,通过自己亲手实践学到了更多知识。