结构和记录
3.4.1 结构
对于学生成绩的管理,每个学生有姓名、性别、学号、系别、各门课程成绩、总成绩等,这时用单一的伪指令(如DB,DW等)就显得力不从心了。如果将这些项组成一个表,并为各项分配以不同的符号名称,使得程序员在找到表头以后,直接利用符号名称存取各项,显然这种方法给编程带来很大的方便。8086/8088宏汇编语言就设置了提供这种功能的结构。
结构的说明:结构可以作为位移量的存储体,这个的范围是包括在STRUC和ENDS两条伪指令之间的部分;结构中每个字段由DB、DW、DD等伪指令来定义。
格式:结构名 STRUC
(数据定义语句序列)
结构名 ENDS
其中结构名是必不可少的,而且STRUC和ENDS前的名字必须相同,STRUC和ENDS必须成对出现。
例如:STUDENT STRUC
NO DB ? ;学号
MATH DB ? ;数学
PHY DB ? ;物理
。。。
STUDENT ENDS
结构的存储分配和预置:
;定义结构
LINK_TAB STRUC
TO DW ?
FROM DW ?
INFOM DB 20 DUP(?)
LINK_TAB ENDS
;预置结构
CHAIN_G LINK_TAB 100 DUP(<>) ;预置100个上述的结构变量
;将CHAIN_G中的所有字段初始化(预置零)
MOV BX, OFFSET CHAIN_G ;取CHAIN_G的偏移地址送BX
MOV [BX].TO,0 ;零送第一张表的TO字段
MOV SI,TYPE CHAIN_G ;结构的字节数送SI
MOV CX,LENGTH CHAIN_G-1
LOP1: MOV [BX SI].TO,0
ADD BX,SI
LOOP LOP1
3.4.2 记录
格式:<记录名> RECORD <字段名>:宽度[=表达式] [,...]
举例:例如:某工作人员情况:工龄占6位,性别占一位(0表示男,1表示女),健康状况占一位(0表示健康,1表示不健康),其定义为记录如下:
WORKER RECORD YER:6, SEX:1,STAU:1=0
记录的存贮分配和预置:
与结构一样,记录定义只提供一个样板,只有经过存贮分配和预置后,才真正占有内存。
格式:<记录变量名> 记录名 <字段值表>
说明:其中字段值表是赋给各字段的初值,它外面的尖括号是不可省略的语法符号。各项的顺序应与记录定义时相一致,若某一个或某几个字段都采用记录定义时的初值,对应项可省略,仅写逗号即可;若所有字段均采用定义时的初值,则只需写上尖括号即可。举例如下:
ZHA WORKER <001000B,1B,>
WAN WORKER <010000B,1B,1B>