汇编语言程序设计教程(第二版)卜艳萍著 下载本文

子程序是在程序执行期间由主程序调用的,它只占有它自身大小的一个空间,它不仅是源程序级别的简化,还是目标程序级的简化,形成的目标代码较短;而宏调用则是在汇编期间展开的,每调用一次就把宏定义体展开一次,它是源程序级的简化。因而它占有的存储空间与调用次数有关,调用次数越多则占有的存储空间也越大。如果宏调用次数较多的话,则其空间上的开销也是应该考虑的因素。

宏调用的参数通过形参、实参结合实现传递,简洁直观、灵活多变。子程序需要利用寄存器、存储单元或堆栈等传递参数。对宏调用来说,参数传递错误通常是语法错误,会由汇编程序发现;而对子程序来说,参数传递错误通常反映为逻辑或运行错误,不易排除。

4. 用条件汇编实现:如果AL寄存器的值小于20,则对语句块1进行汇编,否则对语句

块2进行汇编。 IF AL LT 20 语句块1 ELSE 语句块2

ENDIF

5. 记录数据类型如何说明?简述MASK和WIDTH运算符的功能。

<记录名> RECORD <字段名>:<宽度>[=<表达式>]

[,<字段名>:<宽度>[=<表达式>]┅┅]

说明:记录定义时,记录名和字段名不能省略。字段的宽度是指相应字段占的二进制位数,且所有的字段宽度之和不能大于16。如宽度之和大于8位,该记录按字处理,否则按字节处理。表达式是给字段赋的初值。

MASK运算符返回一个8位或16位的二进制数,在这个数中,记录字段名所指定的字段的对应位为1,其他位为0。

WIDTH运算符返回记录长度或记录字段在记录中所占的二进制位数。

6. 定重复汇编与不定重复汇编有哪些区别?

定重复汇编使汇编程序对重复体作重复汇编,以整数表达式的值作为重复次数。 不定重复汇编使汇编程序对重复体作重复汇编,汇编时,依次将参数表中的参数取出代替形参,重复体部分的语句序列的重复次数由参数表中的参数个数决定。

7. 使用重复汇编结构,在内存建立起0~9的立方值表。 NUM1=0 REPT 10

NUM2=1

NUM2=NUM2*NUM1 DW NUM2*NUM1

NUM1=NUM1+1 ENDM

8. 可以实现条件汇编的伪指令有几条,简述这些伪指令之间的区别。

条件汇编伪指令及其功能如下

伪指令 IF 表达式 IFE 表达式

功能 如果汇编程序求出的表达式非0,条件为真 如果汇编程序求出的表达式等于0,条件为真 17

IFDEF 符号 IFNDEF 符号 IFB <参数> IFNB <参数> IFIDN <字符串1>,<字符串2> IFDIF <字符串1>,<字符串2> IF1 IF2 如果符号在程序中有定义或被说明为EXTRN,条件为真 如果符号在程序中无定义或未被说明为EXTRN,条件为真 如果参数为空,条件为真 如果参数不为空,条件为真 如果字符串1和字符串2相同,条件为真 如果字符串1和字符串2不相同,条件为真 如果是第一遍扫描,条件为真 如果是第二遍扫描,条件为真

9. 下面是用STRUC伪指令定义的参数表SUBLIST,请定义结构变量以实现此结构的存储

区的分配。

SUBLIST STRUC MXLEN DB 60 ACLEN DB ?

SUBIN DB 60 DUP(‘ ’) SUBLIST ENDS 结构变量定义如下: LIST1 SUBLIST < >

10. 编写宏定义DISPLAY,使其能在当前光标位置显示字符串,字符串的首地址由BX寄

存器指出。 DISPLAY MACRO

MOV DX,BX MOV AH,9

INT 21H ENDM

11. 编写宏定义SUM,其功能是将一组数据累加。数据存放的首地址在SI寄存器中,数据

的个数在CL寄存器中。 SUM PROC SUMM MOV AX,0

LOP:ADD AX,[SI] INC SI DEC CL JNZ LOP

ENDM

12. 定义20名教师的记录变量,通过输入数据得到教师的基本信息,然后统计年龄满40

岁的男教师的人数。

DATA SEGMENT

TEACHER RECORD NUM:4,SEX:1,AGE:6,MAJOR:5

ARRAY TEACHER 40 DUP (< >)

COUNT DB 0

18

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:PUSH DS MOV AX,0 PUSH AX

MOV AX,DATA

MOV DS,AX MOV CH,40

MOV BX,OFFSET ARRAY

NEXT: MOV AX,[BX]

TEST AX,MASK SEX JZ NEXT1

MOV CL,AGE MOV DX,MASK AGE AND AX,DX SHR AX,CL CMP AL,40 JL NXET1

INC COUNT

NEXT1:ADD BX,2 DEC CH JNE NEXT RET

CODE ENDS

END START

13. 编程实现如下功能:如果变量A=‘MA32’,则汇编MOV RESULT,0,否则汇编MOV

RESULT,1。 IF A=‘MA32’

MOV RESULT,0

ELSE

MOV RESULT,1 ENDIF

14. 定义一个能实现多个字节数据连减功能的宏,即(a -b -c -d - ┄)→RESULT,减数

的个数存放在某内存单元中,最后结果RESULT存入另一内存单元中。 SUBM MACRO X,Y,Z MOV DI,OFFSET X

MOV CX,[DI]

MOV DI,OFFSET Y MOV AX,[DI] INC DI

LOP:SUB AX,[DI] INC DI

19

DEC CX

JNZ LOP

MOV DI,OFFSET Z MOV [DI],AX ENDM

第6章 汇编语言程序设计

1. 在8086/8088汇编语言中,如何实现过程的定义与调用。

子程序的定义是由过程定义伪指令来实现的,一个过程是一段程序,以PROC伪指令语句开始,以ENDP伪指令语句结束。格式如下:

过程名 PROC [NEAR或FAR] ┇

┇ 过程体语句 RET 过程名 ENDP

子程序(过程)调用指令CALL的格式为: CALL OPRD

2. 在8086/8088汇编语言中,调用程序与子程序(过程)传递参数的方法有哪几种?

(1)利用寄存器传递参数

这是最常用的一种方法,但受到寄存器个数的限制,一般用于参数较少的情况。在主程序中将要传递的参数放入到指定的寄存器中,然后在子程序中再从相应的寄存器获取参数。

(2)利用内存缓冲区传递参数

用存储器传递参数的最简单方法是定义位置、格式确定的缓冲存储区,凡是需要过程处理的参数,无论原来存在什么地方,必须按格式要求先传入缓冲区。过程从缓冲区取得数据进行规定的处理,产生的结果按格式要求存入这个或另外的缓冲存储区,调用程序(主程序)再从缓冲区取走结果。

(3)利用堆栈区传递参数

将子程序(过程)要用的参数放在堆栈区中,设置好指针(BP),子程序(过程)执行时从堆栈区取出参数,完成相应的功能。

3. 循环由哪几部分组成?循环的控制方法有哪几种?

? 循环初始化部分。这是循环准备工作阶段,如建立地址指针、设置循环次数、必要的数

据保护以及为循环体正常工作而建立的初始状态等。这一部分本身只执行一次。 ? 循环体。即循环程序要完成的具体操作,是需要重复执行的程序段。它是循环的核心部

分,没有循环体就不能构成循环。 ? 循环控制部分。循环控制部分主要用来结束整个循环过程,根据循环所给定的条件,判别循环是否结束,完成对循环的控制。 ? 循环控制修改部分。这一部分是为保证每一次循环时,参加执行的信息能发生有规律的

变化而建立的程序段。循环控制主要是一些运算控制单元(变量、寄存器)的修改间距、

修改操作数地址、修改循环计数器、改变变量的值等。

4. 为了编写具有良好风格的子程序,一般需要书写哪些重要的说明性信息?

为了正确和方便地使用子程序,在编制出子程序的同时必须给出子程序的说明信息,一

20