第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-1SAFYSTRUCNODB?NAMEDB'ABCDEFG'SAGEDW?DEPDB'COMPUTER'SAFYENDS在结构SAFY中,定义了4个字段,分别是NO、NAME、DEP和SAGE字段,字段NO、NAME和DEP是字节型数据,SAGE是字型数据。第7章复杂汇编程序设计7.1.2结构的存储分配和预置结构定义仅仅是告诉汇编程序存在这样一种形式的变量,只有进行结构的存储分配和预置后,才使结构变量真正占有内存,也才能使用结构变量。格式:结构变量名结构名字段值表功能:为结构变量分配存储空间及初始化。第7章复杂汇编程序设计说明:(1)结构名是结构定义时用的名字,结构变量名与具体的存储空间及数据相联系,程序中可以直接引用它;(2)字段值表用来给结构变量赋初值。规定如下:①各字段值的排列顺序及类型应与结构定义时相一致,中间以逗号分隔;②如果采用在结构定义时的初值,仅写一个逗号即可,若所有字段均采用在结构定义时的初值,仅写一个尖括号即可;③只有在结构定义中具有一项数据的字段(包括字符串字段)才可重新赋初值;④在结构预置中,若分配给结构的数据有多个且相同,可以使用DUP操作符;⑤尖括号什么时侯也不可省略。第7章复杂汇编程序设计例7-2A1SAFY1,'ZHANG',19,A2SAFY其中,A1SAFY1,'ZHANG',仅对SAFY结构中的NO、NAME和SAGE这3个字段赋初值,第4个字段采用结构定义时的值;对A2SAFY而言,是采用结构定义时的初值。已经定义了一个结构之后,就可以通过结构的存储分配和预置得到多个结构变量。如前所述,可将学生简历定义为一个结构,根据每个学生的情况组成多个字段值表,再用多条结构预置语句就可以产生每个学生的登记表。第7章复杂汇编程序设计7.1.3结构及其字段的引用要访问结构变量,可以直接写结构变量名。要访问结构变量中某一字段,可采用两种方法:(1)结构变量名·结构字段名;(2)预先将结构变量的起始地址、偏移量送往某个地址寄存器,再用[地址寄存器名]代替结构变量名。第7章复杂汇编程序设计例7-3MOVAL,A1.NO;结构变量的访问采用“结构变量名·结构字段名”的方法或MOVBX,OFFSETA1;结构变量的访问采用预先将结构变量的起始地址,MOVAL,[BX].NO;偏移量送BX地址寄存器,再用[BX]代替A1的方法第7章复杂汇编程序设计例7-4引用结构,在数据段定义和预置结构,在代码段引用结构。;定义结构LIKESTRUCTODW0FRMDW?INODB99DUP(?)LIKEENDS;存储分配和预置结构MASLIKE,5TXNLIKE,9,100CHALIKE500DUP();预置500个结构变量;将CHA中所有FRM字段预置0第7章复杂汇编程序设计MOVBX,OFFSETCHAMOV[BX].FRM,0MOVSI,TYPECHA;SI←一个结构的字节数MOVCX,LENGTHCHA-1;CX←结构变量个数-1PLG:MOV[BX*SI].FRM,0ADDBX,SILOOPPLG;将MAS中FRM字段改为TXN中TO字段的值MOVAX,TXN.TOMOVMAS.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表示不健康)。定义的记录如下:STATUSRECORDAGE:6=35,SEX:1,STAU:1=0该记录定义了一个占1个字节,有3个位域的记录类型。AGE位域初值为35,STAU位域初值为0,SEX位域初值未指出,被认为是0。该记录各位域在这1个字节中的分配形式为第7章复杂汇编程序设计10001100b7b6b5b4b3b2b1b0AGESEXSTAU第7章复杂汇编程序设计7.2.2记录的存储分配和预置与结构定义一样,记录定义只提供一个记录的模板,只有经过存储分配和预置后,才真正占有内存。格式:记录变量名记录名字段值表功能:为记录变量分配存储空间及初始化。说明:①字段值表是赋给各字段的初值,用尖括号括起,各项间用逗号分隔;②各项的顺序应与记录定义时相一致,若某一或某几个字段都采用记录定义时的初值,对应项可省略,仅写逗号即可,若仅写尖括号,表示全部采用定义时的初值。第7章复杂汇编程序设计例7-6ZHASTATUS001000B,1B,WANSTATUS010000B,1B,1B将在存储器中分配两个记录变量ZHA(其值为22H)和WAN(其值为43H)。第7章复杂汇编程序设计7.2.3记录操作符对记录进行操作的专用操作符有3个:WIDTH、记录字段名、MASK。1)WIDTH格式:WIDTH记录名或记录字段名功能:返回记录或记录字段所占的位数。例7-7MOVDH,WIDTHSTATUS;DH←8MOVAL,WIDTHAGE;AL←6第7章复杂汇编程序设计2)记录字段名格式:这个操作符直接引用,不带操作数。功能:返回一个立即数,表示该字段移到所在记录的最右边所需的移位次数。例7-8MOVCL,YER;CL←2第7章复杂汇编程序设计3)MASK格式:MASK记录字段名功能:返回一个8位或16位的二进制数,这个二进制数中相应于该字段的各位为1,其余各位为0。例7-9MOVBL,MASKSEX;BL←00000010BMOVBH,MASKAGE;BH←11111100B记录操作符可以与运算符NOT、OR、AND及操作符SHL(左移)、SHR(右移)配合使用。第7章复杂汇编程序设计例7-10MOVCH,NOTMASKSEX;CH←11111101BMOVCL,12SHLSEX;CL←12左移1位第7章复杂汇编程序设计7.2.4记录及其字段的引用利用各种记录操作符,可对记录及其字段进行操作。例7-11下述程序可根据工作人员的条件做不同的安排,条件是:工龄10年,女性和健康。WANDB?BTRCRECORDYER:6,SEX:1,STAU:1;判断工作人员是否满足指定的条件MOVAL,WANTESTAL,MASKSEX第7章复杂汇编程序设计JZRJTTESTAL,MASKSTAUJNZRJTMOVCL,YERSHRAL,CLCMPAL,10JLRJT;满足条件时的安排;不满足条件时的安排RJT:HLT……第7章复杂汇编程序设计7.2.5记录与结构的比较(1)不同之处:结构用于处理按字节计算的数据信息集合,而记录用于处理按二进制位计算的数据信息集合。记录可用于定义一个字节、字或双字的记录变量集合,在这些集合中,同一字节、字或双字的不同位可能代表不同的意义;结构也是一个字节、字或双字的记录变量集合,在这些集合中,同一字节、字或双字的不同位代表的意义相同,且同一字节、字或双字是作为一个整体使用的。(2)相同之处:记录与结构都是汇编语言提供给用户自定义的数据结构,无论是定义结构,还是定义记录,应分别使用结构定义伪指令语句和记录定义伪指令语句。第7章复杂汇编程序设计7.3联合7.3.1联合的概念和定义联合也是一种结构性数据,是对结构定义的一个补充,它与结构可同时使用,是MASM6.0新增的一种结构性数据,可嵌套使用。同结构数据语句一样,联合数据语句也必须先定义内存数据结构形式,然后按数据定义伪指令的使用方式,用它定义联合变量并赋初值。第7章复杂汇编程序设计7.3.2联合类型说明语句格式:联合名UNION域DB?域DW?域DD?联合体,由数据定义语句构成联合名ENDS功能:定义一个联合的结构模块。…第7章复杂汇编程序设计说明:UNION/ENDS为系统规定的保留字,联合名和域为用户定义的名字。每个域用一条数据伪指令定义,一般不应有初值。从格式可看出,UNION与STRUC的定义类似,只是域的偏移地址不同:STRUC中的域是相对于结构顺序分配的;而UNION中的域则是相对于联合重叠分配的,其偏移地址均为0,所以域中不应有初值,如果有初值,汇编时只保留第一个域的初值。第7章复杂汇编程序设计例7-12一个联合类型的说明。UNINAMEUNIONXXDB?YYDW?ZZDD?UNINAMEENDS第7章复杂汇编程序设计7.3.3联合变量的说明与赋初值格式:变量名联合名域值表功能:定义一个联合变量,分配存储空间并给它的各域变量赋初值。说明:联合变量及域值表的说明与结构变量的一样,赋值规定也一致。第7章复杂汇编程序设计例7-13使用例7-12定义的联合“UNINAME”,再定义下列联合变量:VARUNINAME87654321其中各个域的变量为:VAR.XX、VAR.YY、VAR.ZZ,并赋给了如下初值:(VAR.XX)=21H(VAR.YY)=2143H(VAR.ZZ)=21436587H第7章复杂汇编程序设计7.4应用举例例7-14描述学生基本情况的结构的定义和引用。STUDENTSTRUC;定义数据结构STU_NODD9703001H;学号SNAMEDB'王美云';姓名SEXDB0;性别:0,女;1,男AGEDB20;年龄POLITICADB'团员';政治面貌CREDITDW120;成绩第7章复杂汇编程序设计STU1STUDENT<>;定义6个结构变量STT2STUDENT9703002H,'孙一华',,,,108STU3STUDENT9703010H,'刘海涛',1,21,'群众',150STU4STUDENT970303SH,'周眉艳',,19,'群众',180STU5STUDENT9703042H,'李连松',1,,'党员',170STU6STUDENT9703055H,'张皋笠',,,'党员',140DSEGENDSCODESEGMENTPARAPUBLIC'CODE'ASSUMECS:CODE,DS:DSEGSTART:MOVAX,STU1.CREDIT;比较王美云和张皋笠的成绩CMPAX,STU6.CREDITCODEENDSENDSTART第7章复杂汇编程序设计例7-15日期结构的定义和引用。DATESTRUC;定义一个日期的数据结构MONTHDB?;月DAYDB?;日YEARDW?;年DATEENDS.DATAYESTERDAYDATE10,23,1995;定义结构变量TODAYDATE10,24,1995TOMORROWDATE10,25,1995第7章复杂汇编程序设计.CODEMOVAL,YESTERDAY.DAY;取结构中的一个域MOVAH,TODAY.MONTHMOVDX,