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

合集下载

宏程序编程实例与技巧方法

宏程序编程实例与技巧方法

宏程序编程实例与技巧方法概述宏程序是一种程序设计技术,它可以帮助程序员更高效地编写代码。

宏程序可以在代码中定义一系列指令,然后在需要的时候通过宏调用来简化代码。

本文将介绍宏程序编程的一些实例以及一些技巧方法,帮助读者更好地理解和应用宏程序。

宏程序的使用场景宏程序常常用于编写重复性高的代码,例如循环结构、条件判断等。

通过宏程序,可以减少代码量,提高代码的可读性和维护性。

同时,宏程序还可以用来定义一些常用的功能模块,如计算、字符串操作等,以便在多个地方复用。

宏的定义和调用在开始介绍宏程序编程的实例之前,我们先来了解一下宏的定义和调用。

在大多数编程语言中,宏的定义是通过使用特定的关键字或语法来定义的。

一旦定义了宏,就可以通过宏调用来使用它。

下面是一个简单的示例,展示了如何定义和调用一个简单的宏:// 定义一个宏#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文档

汇编实验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. 应用与优化:将宏程序应用到实际的实验报告数据处理中,观察处理效率和准确性,并根据实际需求进行优化。

需要注意的是,在使用宏程序编程处理加工实验报告数据时,应确保数据的安全性和保密性,避免泄露个人或机密信息。

同时,应遵守相关法律法规,尊重知识产权,不侵犯他人的合法权益。

宏的创建实验报告(3篇)

宏的创建实验报告(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、编写程序实现十进制数的加减运算。

宏程序编程实例与技巧方法

宏程序编程实例与技巧方法

宏程序编程实例与技巧方法编写宏程序是一种自动化编程技术,它可以帮助程序员简化复杂的任务,提高编程效率。

下面是一些宏程序编程的实例和技巧方法,以帮助您更好地理解和应用宏程序。

1.宏定义和调用:宏定义使用#define关键字,可以将一组代码片段命名为宏,并在程序中多次调用。

例如,我们可以定义一个计算平方的宏,并在程序中反复调用该宏,而不是编写重复的代码。

示例代码如下:```c++#define SQUARE(x) ((x) * (x))int result = SQUARE(5); // result = 25```2.参数传递:宏可以接受参数,以实现更加通用的功能。

例如,我们可以定义一个计算两个数之和的宏,并在程序中传递不同的参数进行计算。

示例代码如下:```c++#define ADD(x, y) ((x) + (y))int result = ADD(10, 20); // result = 30```3.条件编译:宏可以用于条件编译,以根据不同的条件选择性地包含或排除代码片段。

例如,我们可以使用条件编译来定义不同的宏,在不同的操作系统上使用不同的代码逻辑。

示例代码如下:```c++#ifdef WINDOWS// Windows specific code#else// Linux specific code#endif```4.循环展开:宏可以用于循环展开,以避免编写冗长重复的代码。

例如,我们可以使用宏来展开一系列重复的操作,以提高代码的可读性和可维护性。

示例代码如下:```c++#define DO_TEN_TIMES(action) \action; action; action; action; action; action; action; action; action; action;DO_TEN_TIMES(printf("Hello, world!\n"));```5.字符串拼接:宏可以用于字符串的拼接,以生成动态的字符串。

宏指令应用程序设计实验程序设计实验报告 _20141211

宏指令应用程序设计实验程序设计实验报告 _20141211

实验六宏指令运用程序设计实验学号:41210038姓名:罗天继一、实验目的:1、复习掌握:宏定义,宏调用,宏展开概念;2、练习掌握:宏指令在汇编程序中的应用方法;3、学习掌握:宏库的概念,学会制作宏库文件的技术;4、学习掌握:在汇编程序中引用宏库的编程技术;5、学习掌握:宏操作符的概念,在汇编程序中的应用技术;6、讨论掌握:宏在汇编程序设计中的地位与作用。

二、实验内容:实验1:1、编写一个将AX中数据乘以10的宏MULTAX10,并编制一个程序SY6_1.ASM调用MULTAX10,且调试运行,验证其功能的实现情况;源文件SY6_1.asm文件内容:.286 ;保留MULTAX10 MACROPUSH BXSAL AX , 1MOV BX , AXSAL AX , 1SAL AX , 1ADD AX , BXPOP BXENDMDATA SEGMENT ;保留;填入内容DATA ENDS ;保留STACK1 SEGMENT PARA STACK ;保留DW 20H DUP(0) ;保留STACK1 ENDS ;保留CODE SEGMENT ;保留ASSUME CS:CODE,DS:DATA,SS:STACK1 ;保留START: MOV AX,DATA ;保留MOV DS,AX ;保留MOV AX , 01HMULTAX10;填入内容MOV AX,4C00H ;保留INT 21H ;保留CODE ENDS ;保留END START ;保留编译源文件“SY6_1.asm”生成可执行文件“Debug SY6_1.exe”SY6_1.ini文件内容:u 0,1Ed 2867:0,1fg=0,14d 2867:0,1fqSY6_1.bat文件内容:Debug sy6_1.exe < sy6_1.ini> > sy6_1.txt 执行SY6_1.bat文件后可以获得SY6_1.txt文件;SY6_1.txt文件内容:-u 0,1E2867:0000 B86328 MOV AX,28632867:0003 8ED8 MOV DS,AX2867:0005 B80100 MOV AX,00012867:0008 53 PUSH BX2867:0009 D1E0 SHL AX,12867:000B 8BD8 MOV BX,AX2867:000D D1E0 SHL AX,12867:000F D1E0 SHL AX,12867:0011 03C3 ADD AX,BX2867:0013 5B POP BX2867:0014 CD21 INT 212867:0016 22CB AND CL,BL2867:0018 40 INC AX2867:0019 AF SCASW2867:001A 21CB AND BX,CX2867:001C 40 INC AX2867:001D AF SCASW2867:001E 21CB AND BX,CX-d 2867:0,1f2867:0000 B8 63 28 8E D8 B8 01 00-53 D1 E0 8B D8 D1 E0 D1 .c(.....S....... 2867:0010 E0 03 C3 5B CD 21 22 CB-40 AF 21 CB 40 AF 21 CB ...[.!".@.!.@.!.-g=0,14AX=000A BX=0000 CX=0056 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 DS=2863 ES=2853 SS=2863 CS=2867 IP=0014 NV UP EI PL NZ NA PE NC 2867:0014 CD21 INT 21-d 2867:0,1f2867:0000 B8 63 28 8E D8 B8 01 00-53 D1 E0 8B D8 D1 E0 D1 .c(.....S.......2867:0010 E0 03 C3 5B CD 21 22 CB-40 AF 21 CB 40 AF 21 CB ...[.!".@.!.@.!.-q显然,上面忠实地记录了内存的情况并且展示了实验结果。

罗辛汇编实验

罗辛汇编实验

实验六子程序和宏汇编的程序设计一. 实验目的:1、掌握子程序设计和调试方法,包括:1) 掌握主程序与子程序之间的调用关系及其调用方法;2) 掌握子程序调用过程中近程调用与远程调用的区别;2、掌握DOS调用功能的输入输出设计方法3、掌握大小转换的设计方法4、掌握十进制数的计算设计方法二. 实验要求:1、掌握子程序设计方法,包括:1) 子程序间参数简单传递方法2) 利用堆栈传递方法3) 子程序的递归2、基于DOS调用的输入输出方法,包括:1) 单个字符的输出方法2) 字符串的输出方法3) 字符的输入方法三. 实验内容:1.控制台输入输出(1) 字符的输出向显示器输出信息有三种方法:▪通过操作系统的服务程序(INT 21H)输出;▪通过“基本输入输出系统(BIOS)”输出;▪把显示内容(ASCII码)直接写入“显示存储器(Video RAM,VRAM)”,由显示器接口电路转换输出这里实验通过操作系统的服务程序(INT 21H)输出。

①输出单个字符例:下面的程序在显示器上输出数字字符“9”:字符“9”显示在光标(Cursor)位置, 光标向右移动一个字符位置。

问题:X为DB定义的一个变量,下面的程序能够输出X的值吗?MOV AH, 2 ;功能号02H装入AH寄存器MOV DL, X ;变量X的值装入DL寄存器INT 21H ;调用21H号系统服务程序练习1:在显示器上输出文字“Hello !”参考程序:CODE SEGMENTASSUME CS: CODESTART: LEA BX, STRINGMOV CX, 11ONE: MOV DL, CS: [BX] ;取出一个字符的ASCII代码MOV AH, 2 ;单个字符输出的功能号NT 21H ;调用系统服务,输出一个字符INC BX ;修改指针LOOP ONE ;计数与循环控制MOV AX, 4C00HINT 21HSTRING DB 0DH, 0AH, ‘Hello !’, 0DH, 0AHCODE ENDSEND START说明:STRING在代码段里定义,取字符需要增加段跨越前缀“CS: [BX]”,否则会到“DS: [BX]”处取字符,输出不确定的内容。

Ch06 子程序与宏指令设计

Ch06 子程序与宏指令设计

6.1.1 含有子程序的程序结构 在汇编语言中用过程定义伪指令定 义子程序。过程定义伪指令格式: 过程名 PROC 属型 … 过程名 ENDP
1.调用程序和子程序在同一个代码段的程 序结构(子程序类型可缺省,注意END后必须
跟主程序名)
CODE MAIN SEGMENT PROC FAR … CALL SUB1 RET ENDP PROC … RET ENDP ENDS END MAIN
;二→十并显示。
;转换万位数 ;转换千位数
;转换百位数
;转换十位数 ;转换个位数
DEC_DIV
DEC_DIV CODE
PROC ;CX中为十进制的位权 MOV AX,BX MOV DX,0 DIV CX ;商为转换后的一位十进制数 MOV BX,DX MOV DL,AL ADD DL,30H ;转换成ASCII码 MOV AH,2 ;显示 INT 21H RET ENDP ENDS END MAIN
MAIN CODE1 CODE2 SUB1
SUB1 SUB2
SUB2 CODE2
6.1.2 设计子程序时应注意的问题 1.子程序说明 2.寄存器的保存与恢复 3.密切注意堆栈状态
6.2
子程序参数传递
可以通过给子程序传递参数使其更 通用。常用的参数传递方法如下:通过 寄存器传递;若调用程序和子程序在同 模块(源程序)中,子程序可以直接访 问模块中的变量;通过地址表传递参数 地址;通过堆栈传递参数或参数地址。
ADD AX,[SI] ;累加和 ADD SI,TYPE ARY ;修改地址指针 LOOP NEXT MOV SUM,AX ;存和 POP SI ;恢复寄存器 POP CX POP AX RET ENDP ENDS END MAIN

宏程序编程实例与技巧方法

宏程序编程实例与技巧方法

宏程序编程实例与技巧方法宏程序是一种解决重复性工作的自动化工具,通过编写宏代码,可以一次性完成繁琐的操作,提高工作效率。

下面是关于宏程序编程的实例和技巧方法。

一、宏程序编程实例:1.宏程序自动填充表格例如,在Excel中有一个表格需要填写,每一行都有一系列的列需要填写相同的内容。

可以通过编写宏程序来自动填充表格。

首先,录制宏,选择填写表格的第一行,然后在宏中添加循环语句,使其重复执行填写操作,直到填写完所有行。

2.宏程序数据处理例如,有一个包含大量数据的Excel表格,需要进行一系列的数据处理操作,如排序、筛选、转换等。

可以通过编写宏程序来批量执行这些操作。

首先,录制宏,选择第一个数据处理操作,然后在宏中添加其他操作,使其顺序执行。

再将宏应用于需要处理的表格,即可自动进行数据处理。

3.宏程序自动生成报告例如,在Word中需要编写包含大量数据的报告,需要根据数据的不同生成不同的内容。

可以通过编写宏程序来自动生成报告。

首先,录制宏,选择第一个数据生成操作,然后在宏中添加条件语句,根据数据的不同生成不同的内容,最后将宏应用于需要生成报告的位置,即可自动生成报告。

二、宏程序编程技巧方法:1.合理规划宏程序结构在编写宏程序之前,应该先规划好宏程序的结构。

将整个操作分解为多个步骤,然后为每个步骤编写相应的宏代码。

这样可以使代码结构清晰,易于维护和修改。

2.使用合适的循环语句和条件语句在宏程序中,经常需要对一组数据或一系列操作进行重复执行或根据条件进行判断。

因此,在编写宏程序时,应该熟练掌握循环语句(如for循环、while循环)和条件语句(如if语句、switch语句),以便灵活运用。

3.添加错误处理机制在宏程序中,有时会遇到意外情况,如数据不完整、文件不存在等。

为了提高宏程序的健壮性,需要添加错误处理机制。

可以使用Try...Catch语句来捕获异常,并给出相应的错误提示。

4.使用合适的变量和函数命名在宏程序中,合适的变量和函数命名可以使代码更易读、易懂。

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

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

一.实验目的及实验环境实验环境:1、熟悉宏指令、宏定义、宏调用以及宏展开的概念;掌握宏指令的定义与调用的方法。

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

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

实验环境:80x86系列微型计算机一台以及进行汇编语言程序设计所必需的编程工具(文本编辑器、ASM.EXE、LINK.EXE、DEBUG.EXE)二.实验容从键盘输入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 子程序设计”一节。

宏及过程调用实验报告

宏及过程调用实验报告

子程序及宏的使用实验报告一、实验目的1、练习使用子程序和宏;2、练习使用功能调用(INT 21H)中关于字符输入及字符输出部分。

二、实验准备1、事先编写实验内容的汇编源程序2、用ORG确定数据在内存中的偏移地址三、实验内容1、从键盘输入10个一位或两位的十进制数,用压缩BCD码形式存入数据段1000H起的内存单元中,且每个数在屏幕上显示成一行,共10行2、编程从上面十个数中找出最大值,显示在屏幕上。

3、选作内容:将十个数按从大到小的顺序排列在数据区中程序设计如下:NAME EXP ;程序名称DATA SEGMENT ;数据段MESS DB 'INPUT 10 DECIMAL NUMBER:', 0DH,0AH,'$' ;提示输入10个十进制数字ERROR1 DB 0DH,0AH,'NOT DECIMAL NUMBER!',0DH,0AH,'$' ;错误提示一:输入的不是数字ERROR2 DB 0DH,0AH,'TOO LARGE DECIMAL NUMBER!',0DH,0AH,'$' ;错误提示二:输入的数字太大(三位数)MESS1 DB 0DH,0AH,'INPUTED NUMBER:',0DH,0AH,'$' ;输出提示一:输出输入的十个数字MESS2 DB 'THE LARGEST NUMBER:',0DH,0AH,'$' ;输出提示二:输出最大数字MESS3 DB 0DH,0AH,'SORTED NUMBER:',0DH,0AH,'$' ;输出提示三:输出排序后的十个数字ORG 1000H ;将十个数字的开始偏移地址设为1000HNUBLIST DB 10 DUP(?) ;数字列表LARGEST DB ? ;存储最大数字DATA ENDSSTACK SEGMENT STACK ;堆栈段DB 1000 DUP(?)STACK ENDSCODE SEGMENT ;代码段ASSUME DS:DATA,CS:CODE,SS:STACK,ES:DATAEXP PROC FAR ;将程序定义成远过程START: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,NUBLISTCALL MS ;显示输入提示MOV CL,10NEXT: XOR AX,AXCALL INP ;调用接收字符子程序JNZ NEXTMOV AH,9MOV DX,OFFSET MESS1 ;输出提示一:顺序输出输入的十个数字INT 21HLEA SI,NUBLISTMOV CH,10LOK: CALL LOOK ;输出一个数字INC SIDEC CHJNZ LOKMOV AH,9MOV DX,OFFSET MESS2 ;输出提示二:输出最大数字INT 21HCALL MAXMOV AH,9MOV DX,OFFSET MESS3 ;输出提示三:输出排序后的十个数字INT 21HCALL SORT ;进行排序LEA SI,NUBLISTMOV CH,10LOK1: CALL LOOK ;输出INC SIDEC CHJNZ LOK1MOV AH,4CH ;退出程序功能调用INT 21HMS PROC ;显示输入提示MOV AH,9MOV DX,OFFSET MESS ;输出输入提示INT 21HRETMS ENDPINP PROCHC: MOV AH,1 ;接收第一个字符INT 21HCMP AL,0DH ;检查是否直接回车JZ HCCMP AL,39H ;检查是否在数字范围内JA ER1CMP AL,30HJB ER1PUSH AXMOV AH,1 ;接收第二个字符INT 21HCMP AL,0DH ;检查是否回车JZ DEAL1 ;如果是,则进行一位数处理CMP AL,39H ;检查是否在数字范围内JA ER2CMP AL,30HJB ER2PUSH AXMOV AH,1 ;接收第三个字符INT 21HCMP AL,0DH ;检查是否回车JZ DEAL2 ;如果是,则进行两位数处理MOV AH,9 ;否则为三位数,输出错误提示二MOV DX,OFFSET ERROR2INT 21HPOP DXPOP DXJMP HCDEAL1: POP AX ;一位数处理SUB AL,30H ;将ASCII码转换成十进制数MOV [SI],AL ;移入数字列表中INC SIMOV AH,2H ;输出数字MOV DL,0AHINT 21HDEC CLJMP REDEAL2: POP AX ;两位数处理SUB AL,30H ;将个位ASCII码转换成十进制数POP BXSUB BL,30H ;将十位ASCII码转换成十进制数SHL BL,4 ;将十位左移四位ADD AL,BL ;将十位和个位相加MOV [SI],AL ;移入数字列表中INC SIMOV AH,2H ;输出数字MOV DL,0AHINT 21HDEC CLJMP REER1: CALL ERR1JMP HCER2: CALL ERR2JMP HCRE: RETINP ENDPERR1 PROC ;错误提示一:输入不是数字MOV AH,9MOV DX,OFFSET ERROR1INT 21HRETERR1 ENDPERR2 PROC ;错误提示二:输入数字太大MOV AH,9MOV DX,OFFSET ERROR1INT 21HPOP DXRETERR2 ENDPLOOK PROC ;输出一个数字MOV AL,[SI]MOV CL,4SHR AL,CLCALL DSP ;输出十位MOV AL,[SI]AND AL,0FHCALL DSP ;输出个位MOV DL,0DH ;回车MOV AH,2INT 21HMOV DL,0AH ;换行MOV AH,2INT 21HRETLOOK ENDPMAX PROC ;查找最大数字LEA SI,NUBLISTMOV CL,9HMOV AL,[SI] ;将当前最大数字存在AL中COMP: INC SIMOV BL,[SI] ;每次取一个数字,放入BL中CMP AL,BL ;将它和当前最大数字进行比较JA NCHX ;如果它较小,则不交换MOV AL,BL ;否则将它放入AL中成为新的最大数字NCHX: DEC CLJNZ COMPMOV LARGEST,AL ;存入最大数字单元中CALL OUTP ;输出最大数字RETMAX ENDPOUTP PROC ;输出最大数字MOV AL,LARGESTMOV CL,4SHR AL,CLCALL DSP ;输出十位MOV AL,LARGESTAND AL,0FHCALL DSP ;输出个位RETOUTP ENDPDSP PROC ;将十进制转换成ASCII码,以便输出ADD AL,30HMOV DL,ALMOV AH,2INT 21HRETDSP ENDPSORT PROC ;冒泡法排序LEA SI,NUBLISTMOV CL,9 ;总共进行九次大循环,每一次将最小的放到最后CSH: MOV CH,CLGSH: MOV AL,[SI] ;取相邻的两个数MOV BL,[SI+1]CMP AL,BL ;进行比较JA NCH ;如果前一个大,则不交换顺序MOV DL,BL ;否则交换两者的顺序MOV BL,ALMOV AL,DLMOV [SI],AL ;送回内存中MOV [SI+1],BLNCH: INC SIDEC CHJNZ GSHMOV AL,CLXOR AH,AHSUB SI,AX ;第二次大循环要从头开始比较DEC CLJNZ CSHRETSORT ENDPEXP ENDPCODE ENDSEND START反汇编结果(前几行),可以看到输入的十个数据存放的地址为0C28:1000H。

子程序及宏指令在数控铣削手工编程中的应用

子程序及宏指令在数控铣削手工编程中的应用

・ 7・ 6
砣 - +1 - #2 GOT O 1
N2 O M3
WHIE E 3 O ; L 1L 】D I
G01 G4 -5.D#1 2 X- 4 ;
O 4 .Y 4 . 0 G 3 X— 5 0 1 5 J ;
CO1 40 X- 5. G 7 ;
#1 #1 : = +1 END 1 ;
程序 0 02 C采用 1r 00. N 0 m的平底刀 ,通过调用 a 子程序 0 0 7 C实现坐标轴 的连续旋转 ,而子程序 30 . N
0 0 7 C通过调用 0 o 6 C实现 图 4开 口槽加工 , 30 . N 3o . N
主程序及 子程序清单如 图 6所示 。
图 6 主 程 序 O o 2N o 0 .C及其 子 程 序
G5 t 4
图 4 工件 图
G9 G ; 0 40 MO3 8 0; S 0
M9 P 4 3 0 ; 8 0 P 0 7
程 序 0 0 1 C采 用  ̄ 0 m 的 平 底 刀 加 工 00 . N 2m f 0 m和 4 R 5 m的圆弧部分 。 9m - 3m 通过宏指令改变刀
0 0 6 C实现坐标轴 的连续旋转 。而子程序 0 0 6 10 . N 10 . N C通 过调用 0 0 8 C实 现 4 R 5 m 的 圆弧 部分 10 . N - 3m
外形 加工 。主程 序及 子 程 序 清单 如 图 5所 示 。
G9 GO 0 0 X一6 Y0 0. ; Z1 . 0: G0 Z . 0 ; 1 一5F1 0 G0I X一 5. 2 : G0 0; 0 Z1 . M9 ; 9
O0 o 01
G5 ; 4 G9 0 0 G4 ; MO s 0 : 3 5 o CO O X一7 .YO 5 ; Z1 . 0; GO1 -. 0o Z- 5 F1 : 4

宏 实验

宏 实验

实验7 宏的设计【实验目的】1.熟悉Access中宏对象。

2.掌握宏的创建与设计方法。

3.掌握宏运行和调试的方法。

【实验准备】1.了解宏的概念。

2.理解创建宏的不同方法。

3.掌握在事件响应中执行宏。

【实验内容】1.熟悉使用宏设计窗体创建宏。

2.熟悉创建宏组和条件宏。

3.熟悉在建事件驱动中使用宏。

【实验步骤】一、创建宏【例题7-1】创建名为“高级职称教师”的宏,其中只有一个宏操作:打开窗体“自动创建教工情况纵栏式“。

但要求只显示具有教授职称的教师(即技术职称编码末位是1或2)。

操作步骤:①在数据库窗口中,切换至“宏”对象,单击“新建”按钮;②在宏编辑窗口中,在“操作”列第一行中选择“OpenForm”③在操作参数中,指定窗体名称为“自动创建教工情况纵栏式”,Where条件栏中输入“[职称]="教授"”,如图7-1 所示。

图7-1 高级职称教师的宏④保存宏为“高级职称教师”运行宏,查看结果如图7-2 所示。

图7-2“高级职称教师”宏执行的结果二、创建宏组【例题7-2】创建名为“李姓男教工”的宏,其中包括两个宏操作:打开窗体“自动创建教工情况表格式”;显示消息框(宏命令是:Msgbox 消息是:运行成功)。

要求只显示姓李的男教工。

操作步骤①在数据库窗口中,切换至“宏”对象,单击“新建”按钮;②在宏编辑窗口中,在“操作”列第一行中选择“OpenForm”;③设置OpenForm的操作参数,指定窗体名称为“自动创建教工情况表格式”,视图为“窗体”,Where条件栏中输入“[姓名] Like "李*" And [性别]="男"”,如图7-3所示。

图7-3 “李姓男教工”的宏;④在“操作”列第二行中选择“MsgBox”;⑤设置MsgBox的操作参数,在消息栏中输入“运行成功”;如图7-4所示。

图7-4 消息框宏⑥保存宏为“李姓男教工”;运行宏,查看结果如图7-5和7-6所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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实验结果:实验心得:这次试验总体来说较难,调试了很久都没调试出来,最终和同学商量,把书本上有关代码看了好几遍,最终进行调试才得到了正确的程序。

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

相关文档
最新文档