首页 理论教育 宏与子程序的区别

宏与子程序的区别

时间:2022-02-28 理论教育 版权反馈
【摘要】:宏指令是用一条宏指令来代替一段程序,以简化书写源程序。子程序也有类似的功能,那么两者之间有什么区别呢?子程序或过程是在执行时,由CPU处理的。用子程序的方法,汇编后产生的目标代码少,即目标程序占用的内存空间少,节约了内存空间。但常规的程序中,子程序用得较普遍,除非有宏汇编功能的汇编语言程序设计,一般来说,宏指令用得不多。

4.7.3 宏与子程序的区别

宏指令是用一条宏指令来代替一段程序,以简化书写源程序。子程序也有类似的功能,那么两者之间有什么区别呢?

1.执行方式的区别

宏指令是为了简化源程序的书写,但在汇编时,汇编程序处理宏指令,是将宏定义体(程序段)原原本本地插入到宏指令调用处。所以,宏指令并没有简化目标程序。有多少次宏调用,在目标程序中仍需要有同样多次的目标代码插入,所以宏指令不节省目标程序所占的内存单元。子程序或过程是在执行时,由CPU处理的。若在一个源程序中多次调用同一个子程序,在目标程序中,主程序中只有调用指令的目标代码,子程序的目标代码在整个目标程序中只有一段,所以宏指令和子程序目标代码的存储形式和执行方式都是不相同的。可用图4-18所示来表明它们的区别。

img93

图4-18 子程序调用和宏调用工作方式的区别

2.存储大小和执行速度的区别

把上述两者的特点加以比较,可以看出,若在一个源程序中多次调用一段程序,既可用子程序也可用宏指令来简化源程序。用子程序的方法,汇编后产生的目标代码少,即目标程序占用的内存空间少,节约了内存空间。但是,子程序在执行时,每调用一次都要先保护断点,通常在子程序中还要保护现场;在返回时,先要恢复现场,然后恢复断点,这些操作都额外增加了执行的时间,因而执行的时间长些,速度慢些。而宏指令恰好相反,它的目标程序长,占用的内存单元多。但在执行时,不需要保护断点和现场,恢复断点和现场,就无额外的操作,因而执行时间短、速度快。

3.参数传递的方便性

宏指令定义时可以带有形式参数,宏调用时可以直接在宏指令后带有实参数以替换形式参数,因此宏指令参数的传递十分方便。而子程序参数的传递是通过寄存器、堆栈等方法实现的,实现起来很不方便。

4.参数的使用灵活性

宏指令的实参数可以是常数、寄存器、内存变量、操作码或操作码的一部分、操作数的一部分等,这是子程序所不具备的。

所以,当要代替的程序段不长,变元较多的功能段、速度和代真(实元代替变元)是主要矛盾时,通常用宏指令;而当要代替的程序段较长,额外操作所附加的时间已变得无关紧要,而节省存储空间是主要矛盾时,通常采用子程序。但常规的程序中,子程序用得较普遍,除非有宏汇编功能的汇编语言程序设计,一般来说,宏指令用得不多。

另外,宏指令是机器的指令系统中没有的指令,但又可作为一条指令使用,从形式上看,这好比给用户提供了自己设置指令的手段,即宏指令扩充了机器的指令系统。

习 题 4

一、单项选择题(只有一个正确答案)

1.程序设计中最简单的结构形式是( )。

A.顺序程序 B.分支程序

C.循环程序      D.子程序

2.在进行二重循环程序设计时,下列描述正确的是( )。

A.外循环初值应置外循环之外;内循环初值应置内循环之外,外循环之内

B.外循环初值应置外循环之内;内循环初值应置内循环之内

C.内、外循环初值都应置外循环之外

D.内、外循环初值都应置外循环之内,内循环之外

3.下列描述正确的是( )。

A.在多重循环程序中,内层循环只能有一个

B.在汇编语言程序设计中,二重循环之间的关系可以交错

C.在汇编语言程序设计中,循环返回时应回到初始化部分之前

D.在汇编语言程序设计中,循环返回时应回到初始化部分之后

4.在循环程序中使用LOOP DON指令作为循环结束的判断,其计数值一般放在( )。

A.DX寄存器中B.CX寄存器中C.BP寄存器中D.IP寄存器中

5.在下列4种描述中,( )执行循环的次数最多。

A.MOV CX,0       B.MOV CX,0FFFFH

LOP:LOOP         LOP LOP:LOOP LOP

C.MOV CX,1       D.MOV CX,128

LOP:LOOP         LOP LOP:LOOP LOP

6.在循环程序的执行过程中,为保证循环过程中有序性,要对一些参数值加以修正,该项操作发生在( )。

A.循环控制部分      B.循环工作部分

C.循环设置部分      D.循环结束部分

7.子程序是通过( )来定义的。

A.CALL~RET        B.PROC~ENDP

C.SUB~PROC        D.PROC~RET

8.宏结构是通过( )来定义的。

A.CALL~RET        B.PROC~ENDP

C.SUB~PROC        D.MACRO~ENDM

9.如要实现正确返回,则CALL指令和( )指令两者必须成对出现。

A.MACRO          B.条件转移指令

C.RET           D.END

10.相对于子程序而言,宏指令必须先定义后调用而且( )。

A.占据空间大,执行时间长     B.占据空间小,执行时间短

C.占据空间大,执行时间短     D.占据空间小,执行时间长

二、填空题

1.以过程定义的子程序有两种类型的属性,它们分别是和。

2.在子程序结构中,若一个子程序调用该子程序本身,则称为调用,而且这种调用是子程序的特例。

3.如果一个过程需要被段间调用,那么该过程必须定义为类型,如果只是段内调用,则只需定义为类型。

4.子程序的调用与返回分段内和段间两种情况,对于段内调用与返回仅需修改的值,对于段间调用与返回需要同时修改和的值,执行CALL指令时,这些值均保留在中。

5.宏是源程序中一段有独立功能的程序段,它只需在源程序中定义,就可以调用它。

三、简答题

1.用条件转移指令能否解决全部的分支问题?

2.循环程序由几部分组成?各部分的功能是什么?

3.双循环结构是不是单循环的简单相加?写双循环程序需要注意什么?

4.简述在程序设计中,子程序与主程序有哪3种参数传递方式?

四、设计题

1.编写一个程序,用乘法指令实现32位二进制数与16位二进制数的相乘。

2.编写一个程序,将DAT存储区中的16位二进制数分成四组,每组四位,然后将这四组数分别存放到DAT1、DAT2、DAT3和DAT4存储单元中。

3.设在变量DAT为起始地址的字节存储单元中存放一组有符号数据,编写程序找出其中的最大数和最小数。

4.设在变量BUF为起始地址的字节存储单元中存放一组有符号数据,编写程序分别统计:

(1)正数的个数;(2)负数的个数;(3)0的个数。

5.设数据区以ADT为起始地址的100个字节存储单元中存放着一个字符串,请编写一个程序,如查询到有数字字符,则将该字节单元置“全1”,其他字符保持不变。

6.编程实现统计整数1~100中不能被7整除的数的个数。

7.请编写一个程序,统计DAT数据区中相邻两个数之间符号变化的次数。

8.定义一数组G RADE存放有100个学生某门功课的考试成绩,编写程序,统计各分数段的人数,即要求统计90~100分,80~89分,70~79分,60~69分以及60分以下的各有多少人。

9.设数据段定义如下:

D-SEG SEGMENT

DA1DB 12H

DA2DW 1234H

BUF DB 20 DUP(?)

D-SEG ENDS

采用子程序结构编程,将两个给定的二进制数12H和1234H转换成二进制数的ASCII码。

10.用两种方法编写程序,比较两个字符串STR1和STR2所含字符是否完全相等,若相等,则显示“MATCH!”;若不相等,则显示“NO MATCH!”。

11.编写一个能循环显示十条标题的控制程序,每条标题表放在数据区中。

12.编写数字的进制转换的系列子程序:

(1)ASCII二进制转换成整型16位二进制。

(2)ASCII十六进制转换成16位二进制。

(3)8位二进制转换成ASCII十进制。

(4)ASCII码十进制数转换成BCD码。

(5)BCD码转换成ASCII码十进制数。

(6)BCD码转换成16位二进制。

(7)16位二进制数转换成BCD码。

13.将BUF1单元开始连续存放有M个字节的数据块,转送到BUF2单元开始的连续存放的数据块中,试定义一条转送宏指令。

14.在数据块中定义两个字节数据块,首地址分别为BUF1和BUF2,且数据个数相同。检查两个数据块中的数据是否相同。若相同,则将FLAG单元置为1,否则置为0,并将首次出现的不同数据的地址分别存入ADD1和ADD2单元中。要求:

(1)用比较指令CMP实现;

(2)用串指令实现。

15.有一个100个字节的数据表,表内元素已按从大到小的顺序排列好,现给定一元素,试编程序在表内查找,若表内已有此元素,则结束;否则,按顺序将此元素插入表中适当的位置,并修改表长。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈