120 likes | 278 Views
第十三章 高级汇编语言技术及其使用简介. 第一节 结构. 结构 是把 逻辑 上互相关联的一组数据以某种形式组合在一起。在程序中, 若要多次使用相同的一组数据格式,则可把这一组数据格式定义为一个结构数据 。例如,建立学生档案,首先确定一名学生的档案,如分别用不相等字节来记载学号、姓名、性别、年龄、系别等项。 此时,这个 结构即数据格式本身并不需要占用存储单元 ,然后,可按此结构,在存储单元中布局相同的数据格式,用来记载全班所有学生的档案。 在程序中使用结构数据时,须先定义,后进行预置与分配存储单元。只有这样,才能对结构中相关数据进行存取或修改。. 1.1 结构的定义.
E N D
第十三章 • 高级汇编语言技术及其使用简介
第一节 结构 • 结构是把逻辑上互相关联的一组数据以某种形式组合在一起。在程序中,若要多次使用相同的一组数据格式,则可把这一组数据格式定义为一个结构数据。例如,建立学生档案,首先确定一名学生的档案,如分别用不相等字节来记载学号、姓名、性别、年龄、系别等项。 此时,这个结构即数据格式本身并不需要占用存储单元,然后,可按此结构,在存储单元中布局相同的数据格式,用来记载全班所有学生的档案。 • 在程序中使用结构数据时,须先定义,后进行预置与分配存储单元。只有这样,才能对结构中相关数据进行存取或修改。
1.1 结构的定义 • 定义结构必须使用结构定义伪指令STRUC/ENDS。其语句格式如下: • 其中,结构名不能缺省并要满足标识符的条件,它在程序中必须是惟一的。数据定义语句序列定义了结构中的各字段,这些语句中的变量名称为字段名或域名。每个字段只能用数据定义伪指令及注释加以说明,可以有一个或几个初值。 • 每一个字段名同普通变量一样,也具有三种属性:段、局部偏移量和类型。段是指所在段的段基址,局部偏移量是指字段名的第一个字节与结构起点之间的字节数,类型仍然是指字节、字或双字。 结构名 STRUC <数据定义语句序列> 结构名 ENDS
例如,建立学生档案的结构: Student STRUC NUMBER DW? NAME DB 8 DUP(?) SEX DB ‘M’ AGE DB 20 Student ENDS • 上述结构中,结构名是Student。字段名为NUMBER、NAME、SEX和AGE,它们具有相同的段基址,局部偏移量分别为0、2、10、11,它们的类型和初值由数据定义伪指令及表达式定义。 • 定义结构只是定义了一种数据类型,即只有形式而不生成具体数据,因此宏汇编程序不产生目标代码,也就不为它分配存储单元。
1.2 结构变量的预置与存储器分配 在结构已定义后,就可直接引用结构名来预置结构变量,这时将为结构变量分配存储单元。结构变量预置语句格式如下: 其中: (1)结构名是结构定义时用的名字。 (2)结构变量名是结构变量(结构副本)的标识符,它与其它变量一样有三个属性:段、偏移量和类型属性。但类型表示的是结构的总字节数。 (3)字段值表用来给结构变量的字段赋初值,表中各字段的排列顺序及类型应与结构定义时一致。各字段间以逗号分开。 结构变量名 结构名 <字段值表>
通过结构变量预置语句,可以对结构变量的字段进行初始化,但初始化有一定的规定和限制:通过结构变量预置语句,可以对结构变量的字段进行初始化,但初始化有一定的规定和限制: • 若某些字段的内容采用定义时的初值,作为结构变量的预置隐含值,则在预置语句中对应字段的位置只写一个逗号即可。若所有字段都采用定义时的初值,则语句中仅用一对尖括号表示。 • 预置时,只能修改单项数据的字段;而不能修改用DUP定义的字段或一个字段后有多个数据项的字段。例如不能修改以下这样的结构字段: • DW 20H DUP(0) • DB 12H,34H,56H • DB ‘ABC’,‘DEF’ • DW VAR1,VAR2
例13.1.1 有以下结构定义和结构变量预置: STR STRUC VA1 DB 12H VA2 DW 10H DUP(?) VA3 DW VAR VA4 DB ‘ABC’ STR ENDS DATA SEGMENT DAW DW 123H,0A34H S1 STR < > S2 STR <20H,DAW,’DEF’> S3 STR 10H DUP(<30H>) S4 STR <30H,,’XYZ’> DATA ENDS 在此结构预置中,结构变量S1保留结构中各字段的初值。结构变量S2除不能修改VA2字段外,其余各字段均作修改。结构变量S3同时预置10H个结构副本,每一个副本中只修改第一个字段初值,其余保持不变。结构变量S4除不能修改VA2字段外,VA3字段采用了预置隐含值(逗号之间的空缺表示采用预置隐含值),其余各字段均作修改。
1.3 对结构变量及其字段的操作 在程序中引用结构变量与一般变量相同,可直接写结构变量名,来作为一条指令的操作数。若要引用结构变量中的某个字段,则使用如下形式: 也可先将结构变量起始地址的偏移量送入某个地址寄存器,再用以下形式: 例如,若要引用结构变量S2的VA3字段的第3个字符,则以下两种方法都可以: (1)MOV AL,S2.VA3[2] (2)MOV BX,OFFSET S2 MOV AL,[BX].VA3[2] 结构变量名.字段名 或 结构变量名.字段名[指定字节个数] [地址寄存器].字段名
在结构变量前使用运算符时,TYPE运算符所表示的是结构的总字节数。其它运算符如OFFSET、LENGTH、SIZE等,所表示的含义与一般变量相同。例如:在结构变量前使用运算符时,TYPE运算符所表示的是结构的总字节数。其它运算符如OFFSET、LENGTH、SIZE等,所表示的含义与一般变量相同。例如: MOV CX,TYPE S1 ;CX 26H MOV AX,ENGTH S2 ;AX 1 MOV BX,SIZE S2 ;BX 26H*1 MOV AX,LENGTH S3 ;DX 10H MOV BX,SIZE S3 ;BX 26H*10H MOV AX,TYPE S1.V2 ;AX 2
1.4 结构应用举例 定义一个学生成绩的结构,编写一个对5个学生的成绩进行管理的程序。 例13.1.2 有5个学生的姓名、学号及英语、数学、物理成绩用结构的形式存放在主存中,试编程显示数学不及格的学生的姓名。 根据题意,首先定义学生成绩的结构,然后在数据段预置5个学生的结构变量。编写的源程序如下:
STUD STRUC NAME DB ‘ ’ NUM DB ? ENGLISH DB ? MATHS DB ? PHYSICS DB ? STUD ENDS DATA SEGMENT ST1 STUD <‘WANG’,1,80,78,90> ST2 STUD <‘LI’,2,60,55,70> ST3 STUD <‘SUN’,3,76,87,83> ST4 STUD <‘QIAN’,4,74,85,81> ST5 STUD <‘ZHAN’,5,70,54,65> DATA ENDS STACK0 SEGMENT PARA STACK DW 20H DUP(0) STACK0 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK0 START: MOV AX,DATA MOV DS,AX MOV CX,5 MOV SI,OFFSET ST1 ;SI指向ST1的首字节 LOP1: CMP [SI].MATHS,60 ;MATHS字段60? JAE NSHOW ;大于或等于60分,不显示 MOV BL,4 MOV DI,SI ;DI指向NAME字段首字节 SHOW: MOV DL,[DI] ;显示姓名 MOV AH,2 INT 21H INC DI DEC BL JNZ SHOW NSHOW: ADD SI,TYPE ST1 ;SI指向下一个结构变量 LOOP LOP1 MOV AH,4CH INT 21H CODE ENDS END START