第 7章 复杂汇编程序设计第 7章 复杂汇编程序设计
7.1 结构
7.2 记录
7.3 联合
7.4 应用举例第 7章 复杂汇编程序设计
7.1 结 构
7.1.1 结构的定义用 STURC和 ENDS把一系列数据定义语句括起来就成了一个结构。
格式:
结构名 STRUC
<数据定义语句序列 >
结构名 ENDS
功能:定义结构类型的数据,但并不真正给结构分配存储空间,只是说明包括结构名、域名及其数据类型在内的结构的类型。
第 7章 复杂汇编程序设计说明:
① 结构名由用户定义,结构内数据定义语句中的变量名称为结构字段名,简称为字段名;
② 结构的使用应是先定义后使用,即应在为结构数据分配空间之前定义;
③ 结构定义中的结构名必须有且 STURC和 ENDS前的结构名必须一致。
第 7章 复杂汇编程序设计例 7-1
SAFY STRUC
NO DB?
NAME DB 'ABCDEFG'
SAGE DW?
DEP DB 'COMPUTER'
SAFY ENDS
在结构 SAFY中,定义了 4个字段,分别是 NO,NAME、
DEP和 SAGE字段,字段 NO,NAME和 DEP是字节型数据,
SAGE是字型数据。
第 7章 复杂汇编程序设计
7.1.2 结构的存储分配和预置结构定义仅仅是告诉汇编程序存在这样一种形式的变量,
只有进行结构的存储分配和预置后,才使结构变量真正占有内存,也才能使用结构变量。
格式:
结构变量名 结构名 <字段值表 >
功能:为结构变量分配存储空间及初始化。
第 7章 复杂汇编程序设计说明:
(1) 结构名是结构定义时用的名字,结构变量名与具体的存储空间及数据相联系,程序中可以直接引用它;
(2) 字段值表用来给结构变量赋初值。规定如下:
① 各字段值的排列顺序及类型应与结构定义时相一致,中间以逗号分隔;
② 如果采用在结构定义时的初值,仅写一个逗号即可,若所有字段均采用在结构定义时的初值,仅写一个尖括号即可;
③ 只有在结构定义中具有一项数据的字段 (包括字符串字段 )
才可重新赋初值;
④ 在结构预置中,若分配给结构的数据有多个且相同,可以使用 DUP操作符;
⑤ 尖括号什么时侯也不可省略。
第 7章 复杂汇编程序设计例 7-2
A1 SAFY<1,'ZHANG',19,>
A2 SAFY<>
其中,A1 SAFY<1,'ZHANG',>仅对 SAFY结构中的 NO、
NAME和 SAGE这 3个字段赋初值,第 4个字段采用结构定义时的值;对 A2 SAFY<>而言,是采用结构定义时的初值。
已经定义了一个结构之后,就可以通过结构的存储分配和预置得到多个结构变量。如前所述,可将学生简历定义为一个结构,根据每个学生的情况组成多个字段值表,再用多条结构预置语句就可以产生每个学生的登记表。
第 7章 复杂汇编程序设计
7.1.3 结构及其字段的引用要访问结构变量,可以直接写结构变量名。要访问结构变量中某一字段,可采用两种方法:
(1) 结构变量名 ·结构字段名;
(2) 预先将结构变量的起始地址、偏移量送往某个地址寄存器,再用 [地址寄存器名 ]代替结构变量名。
第 7章 复杂汇编程序设计例 7-3
MOV AL,A1.NO ;结构变量的访问采用“结构变量名 ·结构字段名”的方法或 MOV BX,OFFSET A1 ;结构变量的访问采用预先将结构变量的起始地址,
MOV AL,[BX].NO ;偏移量送 BX地址寄存器,再用
[BX]代替 A1的方法第 7章 复杂汇编程序设计例 7-4 引用结构,在数据段定义和预置结构,在代码段引用结构。;定义结构
LIKE STRUC
TO DW 0
FRM DW?
INO DB 99 DUP(?)
LIKE ENDS;存储分配和预置结构
MAS LIKE<,5>
TXN LIKE<,9,100>
CHA LIKE 500 DUP(< >) ;预置 500个结构变量;将 CHA中所有 FRM字段预置 0
第 7章 复杂汇编程序设计
MOV BX,OFFSET CHA
MOV [BX].FRM,0
MOV SI,TYPE CHA ; SI← 一个结构的字节数
MOV CX,LENGTH CHA-1 ; CX← 结构变量个数 -1
PLG,MOV [BX*SI],FRM,0
ADD BX,SI
LOOP PLG;将 MAS中 FRM字段改为 TXN中 TO字段的值
MOV AX,TXN.TO
MOV MAS.FRH,AX
第 7章 复杂汇编程序设计结构在以下几种场合特别适用:
● 多次定位同样的存储格式;
● 单个文件多重缓冲;
● 列表处理;
● 栈寻址。
第 7章 复杂汇编程序设计
7.2 记 录
7.2.1 记录的概念和定义格式:
记录名 RECORD字段名:宽度 [=表达式 ][,…]
功能:定义记录类型的数据。
第 7章 复杂汇编程序设计说明:
① 记录名和字段名必须具有惟一性。
② 宽度表示相应字段所占的位数 (1~ 16位 )。如果各字段的宽度和大于 8位,那么汇编程序按字处理,否则按字节处理。若所定义的总位数少于 8位或 16位,那么所有字段就靠右对齐到字节或字的最低有效位位置。
③ 表达式是赋给相应字段的初值,可以省略。
若某字段的位数为 7时,可定义为一字符。如 FID,7='A'。
第 7章 复杂汇编程序设计例 7-5 使用记录类型变量描述工作人员的情况。其中工龄占
6位,性别占 1位 (0表示男,1表示女 ),健康状况占 1位 (0表示健康,1表示不健康 )。
定义的记录如下:
STATUS RECORD AGE,6= 35,SEX,1,STAU,1= 0
该记录定义了一个占 1个字节,有 3个位域的记录类型。 AGE位域初值为 35,STAU位域初值为 0,SEX位域初值未指出,被认为是 0。该记录各位域在这 1个字节中的分配形式为第 7章 复杂汇编程序设计
1 0 0 0 1 1 0 0
b7 b6 b5 b4 b3 b2 b1 b0
AGE SEX STAU
第 7章 复杂汇编程序设计
7.2.2 记录的存储分配和预置与结构定义一样,记录定义只提供一个记录的模板,只有经过存储分配和预置后,才真正占有内存。
格式:
记录变量名 记录名 <字段值表 >
功能:为记录变量分配存储空间及初始化。
说明:
① 字段值表是赋给各字段的初值,用尖括号括起,各项间用逗号分隔;
② 各项的顺序应与记录定义时相一致,若某一或某几个字段都采用记录定义时的初值,对应项可省略,仅写逗号即可,若仅写尖括号,表示全部采用定义时的初值。
第 7章 复杂汇编程序设计例 7-6
ZHA STATUS <001000B,1B,>
WAN STATUS <010000B,1B,1B>
将在存储器中分配两个记录变量 ZHA(其值为 22H)和 WAN(其值为 43H)。
第 7章 复杂汇编程序设计
7.2.3 记录操作符对记录进行操作的专用操作符有 3个,WIDTH、记录字段名、
MASK。
1) WIDTH
格式,WIDTH 记录名或记录字段名功能:返回记录或记录字段所占的位数。
例 7-7
MOV DH,WIDTH STATUS ; DH ← 8
MOV AL,WIDTH AGE ; AL ← 6
第 7章 复杂汇编程序设计
2) 记录字段名格式:这个操作符直接引用,不带操作数。
功能:返回一个立即数,表示该字段移到所在记录的最右边所需的移位次数。
例 7-8
MOV CL,YER ; CL ← 2
第 7章 复杂汇编程序设计
3) MASK
格式,MASK记录字段名功能:返回一个 8位或 16位的二进制数,这个二进制数中相应于该字段的各位为 1,其余各位为 0。
例 7-9
MOV BL,MASK SEX ; BL ← 00000010B
MOV BH,MASK AGE ; BH ← 11111100B
记录操作符可以与运算符 NOT,OR,AND及操作符
SHL(左移 ),SHR(右移 )配合使用。
第 7章 复杂汇编程序设计例 7-10
MOV CH,NOT MASK SEX ; CH ← 11111101B
MOV CL,12 SHL SEX ; CL ← 12 左移 1位第 7章 复杂汇编程序设计
7.2.4 记录及其字段的引用利用各种记录操作符,可对记录及其字段进行操作。
例 7-11 下述程序可根据工作人员的条件做不同的安排,条件是:
工龄 >10年,女性和健康。
WAN DB?
BTRC RECORD YER,6,SEX,1,STAU,1;判断工作人员是否满足指定的条件
MOV AL,WAN
TEST AL,MASK SEX
第 7章 复杂汇编程序设计
JZ RJT
TEST AL,MASK STAU
JNZ RJT
MOV CL,YER
SHR AL,CL
CMP AL,10
JL RJT;满足条件时的安排;不满足条件时的安排
RJT:
HLT


第 7章 复杂汇编程序设计
7.2.5 记录与结构的比较
(1) 不同之处:结构用于处理按字节计算的数据信息集合,
而记录用于处理按二进制位计算的数据信息集合。记录可用于定义一个字节、字或双字的记录变量集合,在这些集合中,同一字节、字或双字的不同位可能代表不同的意义;结构也是一个字节、字或双字的记录变量集合,在这些集合中,同一字节、
字或双字的不同位代表的意义相同,且同一字节、字或双字是作为一个整体使用的。
(2) 相同之处:记录与结构都是汇编语言提供给用户自定义的数据结构,无论是定义结构,还是定义记录,应分别使用结构定义伪指令语句和记录定义伪指令语句。
第 7章 复杂汇编程序设计
7.3 联 合
7.3.1 联合的概念和定义联合也是一种结构性数据,是对结构定义的一个补充,它与结构可同时使用,是 MASM 6.0新增的一种结构性数据,可嵌套使用。同结构数据语句一样,联合数据语句也必须先定义内存数据结构形式,然后按数据定义伪指令的使用方式,用它定义联合变量并赋初值。
第 7章 复杂汇编程序设计
7.3.2 联合类型说明语句格式:联合名 UNION
域 DB?
域 DW?
域 DD? 联合体,由数据定义语句构成联合名 ENDS
功能:定义一个联合的结构模块。

第 7章 复杂汇编程序设计说明,UNION/ENDS为系统规定的保留字,联合名和域为用户定义的名字。每个域用一条数据伪指令定义,一般不应有初值。从格式可看出,UNION与 STRUC的定义类似,只是域的偏移地址不同,STRUC中的域是相对于结构顺序分配的;而
UNION中的域则是相对于联合重叠分配的,其偏移地址均为 0,
所以域中不应有初值,如果有初值,汇编时只保留第一个域的初值。
第 7章 复杂汇编程序设计例 7-12 一个联合类型的说明。
UNINAME UNION
XX DB?
YY DW?
ZZ DD?
UNINAME ENDS
第 7章 复杂汇编程序设计
7.3.3 联合变量的说明与赋初值格式:变量名 联合名 <域值表 >
功能:定义一个联合变量,分配存储空间并给它的各域变量赋初值。
说明:联合变量及域值表的说明与结构变量的一样,赋值规定也一致。
第 7章 复杂汇编程序设计例 7-13 使用例 7-12定义的联合,UNINAME”,再定义下列联合变量:
VAR UNINAME <87654321>
其中各个域的变量为,VAR.XX,VAR.YY,VAR.ZZ,并赋给了如下初值:
(VAR.XX)= 21H
(VAR.YY)= 2143H
(VAR.ZZ)= 21436587H
第 7章 复杂汇编程序设计
7.4 应 用 举 例例 7-14 描述学生基本情况的结构的定义和引用。
STUDENT STRUC ;定义数据结构
STU_NO DD 9703001H ;学号
SNAME DB '王美云 ' ;姓名
SEX DB 0 ;性别,0,女; 1,男
AGE DB 20 ;年龄
POLITICA DB '团员 ' ;政治面貌
CREDIT DW 120 ;成绩第 7章 复杂汇编程序设计
STU1 STUDENT<> ;定义 6个结构变量
STT2 STUDENT<9703002H,'孙一华 ',,,,108>
STU3 STUDENT<9703010H,'刘海涛 ',1,21,'群众 ',150>
STU4 STUDENT<970303SH,'周眉艳 ',,19,'群众 ',180>
STU5 STUDENT<9703042H,'李连松 ',1,,'党员 ',170>
STU6 STUDENT<9703055H,'张皋笠 ',,,'党员 ',140>
DSEG ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:DSEG
START,
MOV AX,STU1.CREDIT ;比较王美云和张皋笠的成绩
CMP AX,STU6.CREDIT
CODE ENDS
END START
第 7章 复杂汇编程序设计例 7-15 日期结构的定义和引用。
DATE STRUC ;定义一个日期的数据结构
MONTH DB? ;月
DAY DB? ;日
YEAR DW? ;年
DATE ENDS
.DATA
YESTERDAY DATE <10,23,1995> ;定义结构变量
TODAY DATE <10,24,1995>
TOMORROW DATE <10,25,1995>
第 7章 复杂汇编程序设计
.CODE
MOV AL,YESTERDAY.DAY ;取结构中的一个域
MOV AH,TODAY.MONTH
MOV DX,2003
MOV TODAY.YEAR,DX ;改写结构中的一个域
MOV BX,OFFSET YESTERDAY ;取结构的基地址
MOV AX,[BX].YEAR ; YEAR是相对于结构基址的偏移量需要特别说明的是,联合和结构均可以嵌套,既可以结构套结构,联合套联合,又可以结构和联合相互嵌套。
第 7章 复杂汇编程序设计例 7-16 结构定义的嵌套,即一个结构域中可有另一结构的变量。
FUN STRUC
X DW?
Y DW 200
FUN ENDS
EXTR STRUC
EXX FUN
EYY FUN <20,60>
MN DB '5678'
EXTR ENDS
第 7章 复杂汇编程序设计例 7-17 联合定义的嵌套,即一个联合中的域可有另一联合的变量。设 UNNAME是一个已定义的联合。
UNNAME UNION
UBYTE DB?
UDD UNINAME
UZL DW?
UNNAME ENDS
第 7章 复杂汇编程序设计例 7-18 结构和联合定义的相互嵌套,即结构或联合的定义中的域可以是联合变量或结构变量,甚至可以是结构或联合的定义。
UNAS UNION ;定义联合 UNAS
STRUC ; UNAS中的域为两个结构定义
M1 DW?
M2 DD?
ENDS
STRUC
N1 DB?
第 7章 复杂汇编程序设计
N2 DD?
ENDS
UNAS ENDS
LABA UNAS ;定义联合变量 LABA
第 7章 复杂汇编程序设计其中,M1和 M2的偏移地址不同,N1和 N2的偏移地址也不同。
但是 M1与 N1的偏移地址相同,即 M1,M2与 N1,N2共享同一存储空间。该定义适用于面向对象程序设计的结构,还常用于
I/O端口的描述。对域变量的访问可用下面形式:
LABA.M1,LABA.M2,LABA.N1,LABA.N2
或用间接存储器变量形式:
MOV BX,OFFSET TLABA
MOV AX,[BX].M1
第 7章 复杂汇编程序设计例 7-19 用 STRUC伪指令定义的参数表 NAMELIST如下:
NAMELIST STRUC
MAXLEN DB 100
ACTLEN DB?
NAMEIN DB 100 DUP<' '>
NAMELIST ENDS
第 7章 复杂汇编程序设计
(1) 请用结构预置语句分配此结构的存储区。
(2) 编写一段指令,从键盘输入字符存入结构中,然后将输入的字符数送入 DISPFILE单元中。
解,(1) 用结构预置语句分配结构存储区为
STUDENTS NAMELIST< >
其中 STUDENTS为假设的变量名。
第 7章 复杂汇编程序设计
(2) 按照要求编写程序段如下:
MOV AH,0AH ;从键盘输入字符
LEA DX,STUDENTS
INT 21H
MOV AL,STUDENTS.ACTLEN ;将字符送 DISPFILE
MOV DISPFILE,AL
第 7章 复杂汇编程序设计习 题 七
7.1 为结构类型 PARAMS分配存储空间,并采用原缺省值,
结构变量名为 APROC;为结构类型 POLAR分配存储空间,并赋初值。
第 7章 复杂汇编程序设计
7.2 结构类型 OVERRIDABLE的定义如下:
OVERRIDABLE STRUC
ASTRING DB
DONTCARE DW
AREAL DD
OVERRIDABLE ENDS
VARO是 OVERRIDABLE类型变量,试给出 OVERRIDABLE每个域的初始值,并为 VARO变量赋值,使其域的缺省值可以被替换。
第 7章 复杂汇编程序设计
7.3 结构类型 NONOVERRIDE的定义如下:
NONOVERRIDE STRUC
ALIST DB
ADUP DW
NONOVERRIDE ENDS
试给出 NONOVERRIDE每个域的初始值,使其域的缺省值是不能替换的。
第 7章 复杂汇编程序设计
7.4 用 STRUC伪指令定义的参数表 NAMELIST如下:
NAMELIST STRUC
MAXLEN DB 100
ACTLEN DB?
NAMEIN DB 100 DUP( ' ' )
NAMELIST ENDS
(1) 用结构预置语句分配此结构的存储区。
(2) 编写一段指令,从键盘输入字符存入结构中,然后将输入的字符数送入 DISPFILE单元中。
第 7章 复杂汇编程序设计
7.5 利用结构的概念定义并分配一个通信录。
7.6 定义一个长度为 DWORD的记录类型。若 ERRFLAG是一个 DWORD的记录类型且定义如下:
ERRFLAG RECORD IO,3= 0,SYS,3= 0,MEM:
24= 'ABC'
问,ERRFLAG中的 3个位域的总长度是多少位?实际存储分配时分配多少位?为什么?按记录类型 ERRFLAG分配两个记录:
FLAG1和 FLAG。 FLAG1取缺省值,FLAG的位域值用新值替换。
第 7章 复杂汇编程序设计
7.7 在记录类型 ERRFLAG中,使用合适的指令求位域 SYS
向右对齐应移位的次数。
7.8 记录 REC的一个域为 FULL,使用合适的指令在 EAX中建立一个与记录 REC类型相同的记录,EAX中的域 FULL的值与
REC.FULL域相同,而 EAX中其他所有的域值均为 0。
7.9 使用合适的指令在 EAX中建立一个与记录 REC类型相同的记录,其中 EAX的 FULL域置 0,而 EAX其他所有的域的值都与 REC记录相同。
第 7章 复杂汇编程序设计
7.10 若有一个记录 PATTERN的定义如下:
PATTERN RECORD A,3,B,1,C,2,D,4,E,6
执行下述程序段每一条指令后,DX中的内容是什么?
AREC PATTERN< >
MOV DX,AREC
AND DX,MASKC
SHR DX,C
7.11 编程实现为 7.10中的记录变量 AREC的 D位域赋一个新值 VAL的功能。