《汇编第六章》ppt课件

上传人:tia****nde 文档编号:70816756 上传时间:2019-01-18 格式:PPT 页数:32 大小:458.31KB
返回 下载 相关 举报
《汇编第六章》ppt课件_第1页
第1页 / 共32页
《汇编第六章》ppt课件_第2页
第2页 / 共32页
《汇编第六章》ppt课件_第3页
第3页 / 共32页
《汇编第六章》ppt课件_第4页
第4页 / 共32页
《汇编第六章》ppt课件_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《《汇编第六章》ppt课件》由会员分享,可在线阅读,更多相关《《汇编第六章》ppt课件(32页珍藏版)》请在金锄头文库上搜索。

1、第6章 结构与记录,6.1 结构 6.2记录,6.1 结构 611结构的概念 逻辑上互相关联的一组数据以某种形式组合在一起就是结构。在程序中,若要多次使用相同的一组数据格式,就可以把这一组数据格式定义为一个结构。结构定义仅仅是一种对存储形式的描述,并不真正分配存储空间。结构一经定义就可以以此结构如同DB、DW、DD一样用来预置和分配变量的存储空间。 612 结构的定义 在一个程序中,使用结构前必须用结构伪指令STRUC/ENDS先定义。结构伪指令的使用格式如下: 结构名 STRUC ,结构名 ENDS 其中结构名是标识符,不能缺省,且在一源程序中必须是唯一的。数据定义语句序列是用DB,DW或D

2、D定义结构中各字段(Fields),这些语句中的变量名叫结构字段名。 每一个结构字段名有局部偏移量及类型的属性。局部偏移量是指结构字段的第一个字节与结构起点之间的字节数,类型仍然是指字节、字或双字。例如定义一个结构: STUDENT STRUC NAME DB 0123456789ABCDEF SEX DB 0 CITY DB 20H DUP(?) ID DW ?,FACE DB ? STUDENT END 上述结构中NAME、SEX、CITY、ID、FACE分别是结构STUDENT的字段名,它们的局部偏移量分别是0,l0H,11H,31H,33H。结构中各字段可以指定具体的数值或字符作为结构

3、字段的初值。用伪指令STRUCENDS定义的结构,不产生任何目标代码,因而也不分配存储单元。 注意标记一个结构类型结束的伪指令与标记一个段结束的伪指令用相同的助记符ENDS,汇编程序通过上下文理解ENDS的含义,因此要确保每一SEGMENT伪指令和每一STRUC伪指令有各自对应的ENDS伪指令。,613 结构的预置与存储分配 当结构定义后,我们可在程序中直接引用结构名,为结构预置副本,定义结构变量,分配存存储空间。结构变量定义格式为: 结构变量名 结构名 其中,结构名是用STRUCENDS伪指令定义结构时的结构名。结构变量名是当前定义的结构变量的名称,它同其他变量一样有三个属性:段、偏移量和类

4、型属性。段、偏移量表示结构变量的地址,类型表示结构的总字节数。字段值表为结构变量中各字段进行预置,其中各字段值的排列顺序及类型应与结构定义时各字段相一致,中间以逗号分隔。如果某个字段采用在说明结构时所给定缺省的初值,那么可简单地用逗号表示;如果结构变量的所有字段均如此,那么可省去字段值表,但尖括号不能省略。,例如,假设已说明了上述结构STUDENT ,那么可定义如下结构变量: DATA SEGMENT STD1 STUDENT STD2 STUDENT ,STD3 STUDENT STD4 STUDENT 10H DUP() DATA ENDS 在上述结构预置中,结构变量STDl对结构中所有字

5、段不加修改,保留各字段的初值。结构变量STD2仅修改第一个字段,其余各字段保留其初值。结构变量STD3除第三个字段(字段名为CITY)外,其余各字段均作修改。按照上述结构变量的定义,变量STDl,STD2和STD3的存储空间分配情况如下图所示。,对结构字段初值的修改,并非所有字段的初值都可以修改,只有简单结构字段和字符串字段初值才可以修改。所谓简单结构字段就是由伪指令DB,DW或DD定义的单项变量,如结构STUDENT中SEX,ID,FACE就是只有单项的简单结构字段。而NAME是用DB伪指令定义的字符串,也可以用其他字符串进行修改。而多项(多重)变量的结构字段初值(如CITY)不能修改。例如

6、下面就是多项(多重)的结构字段: DB 10H DUP(?) DW 1234H,5678H,0ABCDH,DB ABCD,EFGH DW BUF,CUT 结构变量名STD4同时预置10H个结构副本,每一个副本中都是仅修改第二个字段初值,其余保留不变。这10H个结构数据在分配存储空间时,依次存放。,614 结构变量及其字段的访问 通过结构变量名可直接存取结构变量,如果要访问结构变量中的某一字段,需使用结构字段运算符“.”,该运算符使用格式如下: 结构变量名结构字段名 例如: STDl.NAME ;表示结构变量STDl中的NAME字段 STD2.ID ;表示结构变量STD2中的ID字段,STD3.

7、SEX ;表示结构变量STD3中的SEX字段 在结构变量字段名前加运算符与一般变量名前加运算符有相同意义。例如: MOV DI,OFFSET STD1.NAMEl3 ;DI34H MOV CX,TYPE STD2.ID ;CX2 MOV CX,TYPE STD3.FACE ;CX1 为传送结构变量STD1的 NAME字段的第个字符给AL,可以用:,MOV BX,OFFSET STD1 MOV AL,BX.NAME 或者 MOV AL,STD2.NAME 若要取出结构变量STD4中的第五个副本的NAME字段的第5个字符,可用下面的指令序列: MOV BX,OFFSET STD4 ADD BX,T

8、YPE STD4,MOV AL,BXNAME4 与一般变量一样,结构变量也可作为一条指令的操作数,不过使用某些运算符时有不同的意义。当结构变量前面使用运算符时,运算符TYPE所表示的是结构所占的总字节数。其他运算符(如OFFSET,LENGTH,SIZE等)所表示的意义与一般变量的使用相同。例如: MOV AX,TYPE STD3 ;BX34H MOV CX,LENGTH STD4 ;CX10H MOV DX,SIZE STDl ;DX34H MOV BX,OFFSET STDl ;BX0 MOV BX,OFFSET STD2 ;BX34H,615 程序举例 例61 下面定义一学生的成绩结构,

9、其中SClSC5是五个连续字段,分别存储每个学生五门课程的成绩;AVER字段记录该学生的平均成绩。在数据段中已预置20位学生的结构副本。另有程序已完成20位学生成绩的录入。现要求编制一子程序计算每位学生五门课程的平均成绩并送入相应的AVER字段中。结构定义及数据段中结构预置如下: STD_SCOR STRUC : :,SC1 DB ? SC2 DB ? SC3 DB ? SC4 DB ? SC5 DB ? AVER DB 0 : : STD_SCOR ENDS,: CLASS_SCOR STD_SCOR 30 DUP() 由于记录每位学生五门课程成绩的字段是连续的,因此只需要用一个地址指针(如

10、DI)指向一位学生的SCl字段,然后依次递增这个地址指针(DI),便可找到其它成绩字段。如何寻找一位学生的SCl字段呢? 首先用寄存器BX(BX是结构副本地址指针)依次指向每一个结构副本(即一位学生的成绩)首地址,再加上结构字段SCl的局部偏移量,便是SCl在数据段中的偏移量。在计算完平均成绩后,就可以存入AVER字段中。为了简化程序,平均成绩仅取整数部分。子程序编制如下: AVE_SCOR PROC,LEA BX,CLASS_SCOR ;第一个结构副本首地址送BX MOV CX,20 ;计算平均成绩的总人数 LOPl:MOV AX,0 PUSH CX LEA DI,BX.SCl ;一位学生S

11、Cl字段偏移量送DI MOV CX,5 LOP2:ADD AL,DI ;计算一位学生成绩总分 ADC AH,0 INC DI,LOOP LOP2 MOV DL,5 ;计算于均成绩 DIV DL MOV BX.AVER,DL ;存储平均成绩 ADD BX,TYPE CLASS_SCOR ;指向下一个结构副本首地址 POP CX LOOP LOP1 AVE_SCOR ENDP,62 记录 记录和结构一样是用来定义一种存储形式,只不过结构是以字节为基本单位组成字段,而记录是以二进制数位为基本单位组成字段。在程序中,对记录的应用与结构样,首先定义记录,然后对记录变量进行预置和存储分配,而后就可以访问记

12、录变量及其字段。 621 记录的定义 记录定义格式如下: 记录名 RECORD 字段名:宽度表达式,字段名:宽度表达式,其中,RECORD为伪指令用来定义记录,记录名由用户定义,不能缺省,在记录变量进行预置时,它是已定义记录引用的符号名,且它应是程序中唯一的符号名。记录名和字段名由程序设计人员自己选定,且必须唯一性。宽度是所在字段所需要的二进制位数。表达式是对字段设置的初值,它是任选项,但必须是该字段宽度所能表达的正整数。如果宽度7,表达式可以使用单引号括起来的字符。一个记录可以由若干个字段构成,但是所有字段宽度之和应16。若所有字段宽度之和大于8,那么汇编程序会给对应的记录变量分配两个字节,

13、否则仅给定义对应的记录变量分配一个字节。第一个字段放在记录左边的较高有效位,随后定义的各字段依次向较低位安排。若各字段宽度之和8或16,则将字节或字的各字段向右对齐(即最低位对齐),剩余未用的数位安排在高位,并置o。例如: REC1 RECORD F1:2,F2:3,F3:3,REC2 RECORD F4:5,F5:4=8,F6:3,F7:4=0 REC3 RECORD F8:3,F9:4,F10:5 上述三个记录中各字段所占用各位如下图所示:,622 记录的预置和存储分配 同结构定义一样,记录定义并不分配存储空间,仅当定义记录变量时,才分配存储空间,并对它进行预置。记录变量定义格式如下: 记

14、录 变量名 记录名 其中,记录变量名与一般变量名一样,是任选的,它同样有一般变量的三个属性(段、偏移量和类型)。字段值表用来给记录变量的各字段赋初值,各字段值的排列顺序及大小应与记录定义时的各字段一致,中间以逗号分隔。如果某个字段采用在定义记录时所给定的缺省初值,那么可简单地用逗号表示;如果记录变量的所有字段都如此,那么可省去字段值表,但尖括号不能省略。例如:,R1 REC1 R2 REC1 R3 REC2 R4 REC2 R5 REC3 R6 REC3 10H DUP() 623 记录专用运算符 一、记录宽度运算符 格式: WIDTH 记录名 或 WIDTH 记录字段名 功能:返回该记录或记

15、录字段的宽度(二进制位数)。 例如: WFl EQU WIDTH RECl ;WF1=7,WF2 EQU WIDTH F5 ;WF2=4 MOV CH,WIDTH REC2 ;(AH)=16 MOV CL,WIDTH F7 ;(AL)=4 二、移位值运算 在语句中,把记录字段名作为一个操作数直接引用,这时便返回个常数。这个常数表示该字段右移到所在记录的最右边的移位次数。它也表示该字段在记录中的起始位置(自右至左015)。如下列各语句直接引用记录RCE2中各记录字段名的结果: MOV BL,F4 ;(BL)=0BH MOV BH,F5 ;(BH)=07H MOV CL,F6 ;(CL)=04H,MOV CH,F7 ;(CH)=00H 三、记录屏蔽运算符 格式 MASK 记录字段名 功能:得到该记录字段在记录中的屏蔽码,即该字段各位均为1,而记录中其他各位均为0的代码。例如: MOV AL,MASK F1 ;(AL)=0C0H MOV BL,MASK F3 ;(BL)=07H MOV CX,MASK F5 ;(CX)=0780H MOV BX,MASK F7 ;(BX)=000FH,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号