宏指令及子程序的设计实验
宏程序编程实例与技巧方法

宏程序编程实例与技巧方法概述宏程序是一种程序设计技术,它可以帮助程序员更高效地编写代码。
宏程序可以在代码中定义一系列指令,然后在需要的时候通过宏调用来简化代码。
本文将介绍宏程序编程的一些实例以及一些技巧方法,帮助读者更好地理解和应用宏程序。
宏程序的使用场景宏程序常常用于编写重复性高的代码,例如循环结构、条件判断等。
通过宏程序,可以减少代码量,提高代码的可读性和维护性。
同时,宏程序还可以用来定义一些常用的功能模块,如计算、字符串操作等,以便在多个地方复用。
宏的定义和调用在开始介绍宏程序编程的实例之前,我们先来了解一下宏的定义和调用。
在大多数编程语言中,宏的定义是通过使用特定的关键字或语法来定义的。
一旦定义了宏,就可以通过宏调用来使用它。
下面是一个简单的示例,展示了如何定义和调用一个简单的宏:// 定义一个宏#define MAX(a, b) ((a) > (b) ? (a) : (b))// 使用宏int maxNum = MAX(10, 20);在上面的示例中,我们定义了一个名为MAX的宏。
这个宏接受两个参数a和b,并返回它们中较大的一个。
在使用宏的时候,我们直接使用MAX(10, 20)来调用它。
宏编程的实例实例一:计算平方有时候,我们需要计算一个数的平方。
下面是一个使用宏实现计算平方的例子:// 定义一个宏#define SQUARE(x) ((x) * (x))// 使用宏int squareNum = SQUARE(5); // squareNum 的值为25在上面的例子中,我们定义了一个名为SQUARE 的宏,它接受一个参数x,并返回x的平方。
在使用宏的时候,我们直接使用SQUARE(5)来调用它,得到结果25。
实例二:计算阶乘下面是一个使用宏实现计算阶乘的例子:// 定义一个宏#define FACTORIAL(n) ((n == 0) ? 1 : (n * FACTORIAL(n - 1)))// 使用宏int factorialNum = FACTORIAL(5); // factorialNum的值为120在上面的例子中,我们定义了一个名为FACTORIAL的宏,它接受一个参数n,并返回n的阶乘。
实验六宏汇编的程序设计

本例中的 ABSOL 宏定义在考虑有多次调用可能性的情况下,应定义为:
宏调用:
ABSOL NEXT:
MACRO LOCAL CMP JGE NEG
OPER NEXT OPER,0 NEXT OPER
ENDM
宏展开:
... ABSOL
... ABSOL
...
VAR BX
...
+
CMP VAR,0
+
JGE
子程序的不同调用,其局部 在每次宏引用的扩展
调用或引用
变量名保存不变
时,将会自动产生出一
个唯一的局部标号
宏定义中允许使用宏调用,其限制条件是:必须先定义后调用
宏定义:
DIF MACRO X,Y
MOV
AX,X
SUB
AX,Y
ENDM
DIFSQR 宏调用:
MACRO PUSH PUSH DIF IMUL MOV POP POP ENDM
宏定义:
LEAP MACRO COND,LAB J&COND LAB ENDM
宏调用:
...
LEAP
Z,THERE
...
LEAP
NZ,HERE
... 宏展开:
...
+
JZ
THERE
...
+
JNZ
...
HERE
“&”符号是一个操作符,它在宏定义体中可以作为哑元的前缀,展开时可以把&前后 个符号合并而形成一个符号,这个符号可以是操作码,操作数或是一个字符串。
AX,Y
MOV
Z,AX
POP
AX
ENDM 形成加法宏定义 ADDITION.同样,宏调用
宏调用实验报告

一、实验目的1. 理解宏调用的概念及其在程序设计中的应用。
2. 掌握宏调用的基本语法和调用方式。
3. 通过实际操作,提高对宏调用功能的理解和运用能力。
二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C++三、实验内容本次实验主要围绕宏调用的概念、语法、调用方式等方面展开,具体内容包括:1. 宏调用的基本概念2. 宏定义的语法和调用方式3. 宏参数的使用4. 宏的嵌套与展开5. 宏的预定义与自定义6. 宏的优缺点分析四、实验步骤1. 创建一个新的C++项目,命名为“宏调用实验”。
2. 在项目中创建一个名为“main.cpp”的源文件。
3. 在“main.cpp”文件中编写以下代码:```cpp#include <iostream>using namespace std;// 宏定义#define PI 3.1415926#define MAX(a, b) ((a) > (b) ? (a) : (b))// 函数定义int add(int a, int b) {return a + b;}// 宏调用int main() {int x = 5, y = 10;int max_value = MAX(x, y);cout << "Max value: " << max_value << endl;int sum = add(x, y);cout << "Sum: " << sum << endl;return 0;}```4. 编译并运行程序,观察输出结果。
五、实验结果与分析1. 宏定义的语法和调用方式在上述代码中,我们定义了一个名为“PI”的宏,用于表示圆周率。
在main函数中,我们直接使用宏名PI来获取圆周率的值。
微机原理实验--子程序与宏指令

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.熟悉子程序的概念及调用过程,并能够设计和调用子程序。
实验工具1.汇编语言编辑器;2.汇编语言调试工具;3.计算机实验环境。
实验内容一、宏指令设计与应用宏指令是在汇编语言中为了简化重复性工作而设计的一种指令。
通过宏指令,可以将一段相对独立的代码组织成一个宏过程,每次使用时可以直接调用该宏。
在本实验中,我们将通过以下步骤进行宏指令的设计与应用:1.设计一个宏指令,完成对一个给定的数组进行排序的功能;2.将该宏指令应用于一个具体的程序中,验证其效果。
二、子程序设计与调用子程序是一段相对独立的代码段,可以被主程序调用。
子程序的设计和调用能够提高程序的模块化程度,方便代码的组织和维护。
在本实验中,我们将通过以下步骤进行子程序的设计与调用:1.设计一个子程序,实现对一个给定字符串的逆序输出;2.在主程序中调用该子程序,并验证其功能。
实验步骤一、宏指令设计与应用1.根据给定的数组排序算法,设计一个宏指令,命名为SORT_ARRAY;2.在宏指令中,使用适当的寄存器和数据段定义,实现对给定数组的排序;3.在主程序中使用SORT_ARRAY宏指令,对一个给定的数组进行排序,并将结果输出。
二、子程序设计与调用1.设计一个子程序,命名为REVERSE_STRING,实现对一个给定字符串的逆序输出;2.在子程序中,使用适当的寄存器定义和字符串操作指令,实现对给定字符串的逆序输出;3.在主程序中,调用REVERSE_STRING子程序,并将一个给定的字符串作为参数传入;4.将子程序的输出结果输出。
实验结果分析通过以上的实验操作,我们可以得到下面的结果:1.宏指令设计与应用:通过排序数组的实验,我们可以验证宏指令的设计与应用的效果。
实验的四子程序设计

实验四子程序设计一.实验目的:1.进一步掌握子程序设计方法;2.进一步掌握基本的DOS 功能调用.二.实验内容:1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.2.统计检查每个学生的名次.3.将统计结果在屏幕上显示.4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.5.输入要有检错手段.三、创新功能:1、监测不合法输入,当输入字符不为数字时,报错'Input illegal!'。
且允许用户从将当前错误数据重新输入,不必整体重新输入。
2、根据实际情况按百分制换算,当输入为3位数时自动结束读取,且最高分可限定为100分,例如输入999,排名时按照100分计算。
3、允许相同成绩的同学存在,不会影响排名。
4、允许输入的学生数任意,只要不超过堆栈空间均可。
5、输入输出界面友好,用户可以直观地看到名次表,对应学生学号和成绩。
6、利用堆栈空间,存储结构优越7、程序采用模块化设计,将实现相同功能的代码聚为宏块或子函数四.预习题:1.如何确定一个学生在这门科目中的名次?答:对成绩降序排序,同时记录学号2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:每次查找出当前最小成绩和其所对应学号入栈,这样形成的栈栈顶为最高分,弹栈时可依次降序输出成绩和对应学号,即为名次表。
3.准备好模块层次图.答:见下面流程图4.给出输出显示的形式.按顺序输入12个学生成绩:100、67、88、89、93、50、6、21、77、77、56、95,按ctrl+z 输入结束运行结果为:五、代码分析CHG MACRO X;将数字转换成ASCII码的宏块PUSH AXPUSH BXMOV AX,XMOV BL,10DIV BLADD AL,'0'ADD AH,'0'MOV BH,ALMOV BL,AHMOV X,BXPOP BXPOP AXENDMPRESENT MACRO X;显示单个字符的宏块MOV AH,02HMOV DL,XINT 21HENDMSTR MACRO STRING;显示字符串宏块MOV AH,09HMOV DX,SEG STRINGMOV DS,DXLEA DX,STRINGINT 21HENDMINPUT MACRO;输入单个字符宏块MOV AH,01HINT 21HENDMDATA SEGMENTBUFF DB 100 DUP(0);存入输入数据STRING1 DB 0DH,'Input illegal!','$' STRING2 DB 'score of stu ','$'STRING3 DB '100','$'STRING4 DB 'NO.','$'STRING5 DB 'The final rank is:','$' STRING6 DB ' STU:','$'STRING7 DB ' SCORE:','$'NUM DW 1;存入学生人数NUM2 DW 1P DW 1COUNT DB 0;计数成绩位数COUNT1 DW 1DATA ENDSSTACK SEGMENT 'STACK'DB 300 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK START: MOV DX,SEG DATAMOV DS,DXLEA SI,BUFF;输入模块LOOP1: MOV BH,'0'MOV BL,'0'STR STRING2MOV CX,NUM;移入CX进行转换显示CHG CX;将当前学号变为ASCIIPRESENT CHPRESENT CLPRESENT ':'L3: INPUTCMP AL,26;输入是否结束JZ EXICMP AL,0DHJNZ L1L2: INC NUM;输入结束CMP COUNT,1JZ Y1MOV [SI],BH;存成绩!!!!!!!!!MOV [SI+1],BLJMP Y2Y1: MOV BYTE PTR [SI],'0';当输入为一位数时,高位写0 MOV [SI+1],BHY2: INC SIINC SIMOV COUNT,0;计数变量清零PRESENT 0DHPRESENT 0AHJMP LOOP1L1: CALL JUDGECMP DL,0JNZ LOOP1;不合法重新输入INC COUNT;合法代表已经输入了一位数CMP COUNT,1JNZ CNT2MOV BH,AL;输入第一位数JMP L3CNT2: CMP COUNT,2;输入第二位数JNZ CNT3MOV BL,ALJMP L3CNT3: MOV BH,40HMOV BL,40HJMP L2;输入三位数代表当前输入结束;排序模块EXI: DEC NUMMOV AX,NUMMOV NUM2,AX;存起来NUM输入的个数LEA SI,BUFFMOV BH,40H;最小数MOV BL,40HMOV DX,NUM;待比较的数的个数LOOP2: CMP NUM,0JZ WALILOOP3: MOV CL,[SI];当前待比较单元送人SICMP CL,'!';是否为空单元JZ PLUSS;是则判断下一个CMP CL,BH;判断高位JA PLUSS;大于最小数,跳转判断下一个JB IMOV CL,[SI+1];判断低位CMP CL,BLJA PLUSS;大于最小数,跳转判断下一个I: MOV BH,[SI];更新最小值MOV BL,[SI+1]MOV DI,SI;存最小值的指针PLUSS: INC SI;判断下一个数INC SIDEC DX;还剩DX个数需要比较CMP DX,0JNZ LOOP3PUSH BX;跳出循环一轮比较完毕LEA SI,BUFF;SI重新指向待比较的数组首位PUSH CXMOV CX,DISUB DI,SI;记录最小值是第几个学生MOV AX,DI;存下二者差值MOV BL,2DIV BL;得到实际的学号偏移MOV DI,CXPOP CXMOV P,AXINC PCHG P;将学号转换为ASCII码入栈PUSH P;学号入栈MOV BYTE PTR [DI],'!';入栈后相应位置置入特殊符号,下次读取到此符号可不进行判断MOV BYTE PTR [DI+1],'!'DEC NUM;待入栈的变量-1MOV DX,NUM2MOV BH,40H;保证每次寻找最小值前BH、BL中内容为最大值MOV BL,40HJMP LOOP2;显示模块WALI: PRESENT 0DHSTR STRING5PRESENT 0DHPRESENT 0AHAGAIN: MOV CX,NUM2CMP CX,0;是否栈空JNZ GOONENDD: MOV AX,4C00HINT 21HGOON: STR STRING4MOV CX,COUNT1CHG CXPRESENT CHPRESENT CLPRESENT ':'POP CX;学号弹栈STR STRING6PRESENT CH;输出学号PRESENT CLPRESENT 20HSTR STRING6POP CX;成绩弹栈STR STRING7CMP CH,40H;是否是满分JZ NEAR PTR FULPRESENT CH;非满分显示分数的高低位PRESENT CLLINE: PRESENT 0DHPRESENT 0AHDEC NUM2INC COUNT1JMP AGAINFUL: PRESENT '1';满分直接显示100PRESENT '0'PRESENT '0'JMP LINEJUDGE PROC;判断输入是否合法,合法则DL=0不合法修改DL=1且输出字符串提示MOV DL,0CMP AL,'0'JNB NEXT1W1: STR STRING1MOV DL,1JMP OVNEXT1: CMP AL,'9'JA W1OV: RETJUDGE ENDPCODE ENDSEND START23、输出模块流程图:七、程序设计思路与总结本实验主要联系了宏块和子程序调用,属于排序问题。
汇编实验4-宏指令设计-实验报告10页word文档

昆明理工大学信息工程与自动化学院学生实验报告( 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. 确定数据处理的需求:分析实验报告中需要提取、计算或分析的数据内容和操作步骤。
2. 编写宏程序代码:根据需求,使用合适的编程语言(如VBA、Python等)编写宏程序代码,实现对数据的自动处理。
例如,可以使用循环结构遍历报告中的数据、使用条件语句进行判断、使用函数完成计算或转换等操作。
3. 数据输入与输出:根据实验报告的数据格式,将数据导入到宏程序中进行处理。
可以使用文件读取、数据库查询等方式获取数据,并将处理后的结果输出到文件或其他适合的形式供进一步分析使用。
4. 测试与调试:在程序编写完成后,进行测试并逐步调试,确保程序能够正确处理数据。
可以使用一组已知的测试数据进行验证,并进行边界值检查等测试。
5. 应用与优化:将宏程序应用到实际的实验报告数据处理中,观察处理效率和准确性,并根据实际需求进行优化。
需要注意的是,在使用宏程序编程处理加工实验报告数据时,应确保数据的安全性和保密性,避免泄露个人或机密信息。
同时,应遵守相关法律法规,尊重知识产权,不侵犯他人的合法权益。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五:宏指令及子程序设计实验院系名称:电子工程学院学生:倩(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实验结果:实验心得:这次试验总体来说较难,调试了很久都没调试出来,最终和同学商量,把书本上有关代码看了好几遍,最终进行调试才得到了正确的程序。
总体来说,经过这次试验,我掌握子程序的定义、调用以及调用程序与子程序之间参数的传递方法,熟悉宏指令、宏定义、宏调用以及宏展开的概念;掌握宏指令的定义与调用的方法,提高了自己的编程能力,通过自己亲手实践学到了更多知识。