《汇编语言程序设计》第十二章:高级汇编语言技术课件

上传人:我*** 文档编号:145015624 上传时间:2020-09-15 格式:PPT 页数:56 大小:1.05MB
返回 下载 相关 举报
《汇编语言程序设计》第十二章:高级汇编语言技术课件_第1页
第1页 / 共56页
《汇编语言程序设计》第十二章:高级汇编语言技术课件_第2页
第2页 / 共56页
《汇编语言程序设计》第十二章:高级汇编语言技术课件_第3页
第3页 / 共56页
《汇编语言程序设计》第十二章:高级汇编语言技术课件_第4页
第4页 / 共56页
《汇编语言程序设计》第十二章:高级汇编语言技术课件_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《《汇编语言程序设计》第十二章:高级汇编语言技术课件》由会员分享,可在线阅读,更多相关《《汇编语言程序设计》第十二章:高级汇编语言技术课件(56页珍藏版)》请在金锄头文库上搜索。

1、汇编语言程序设计-朱耀庭,第12章 高级汇编语言技术,尽管汇编语言作为低级语言不能象高级语言那样具有丰富的数据类型和方便灵活的表达方式,但汇编语言也有一些高级的技术来体现它的灵活性,如:结构(STRUC)、记录(RECORD)、联合(UNION)和宏(MACRO)。 这些技术只是宏汇编(MASM)所支持的伪指令,小汇编(ASM)不支持他们。 本章具体介绍结构、记录、联合数据类型的定义、预置、存储分配及访问,介绍宏的定义和引用。 希望同学们通过本章的学习能够正确应用以上数据类型和宏。,南开大学 朱耀庭,第12章 高级汇编语言技术,12.4 宏,12.3 记录,12.2 联合,12.1 结构,南开

2、大学 朱耀庭,12.1 结构,假设一个学生的信息包括:姓名、学号、数学成绩、语文成绩和英语成绩几个数据项。在C/C+程序设计中用结构存储一个学生信息的数据定义为: STRUCT STUDENT STRING NAME ;姓名 STRING NUM ;学号 INT MATH ;数学成绩 INT CHINESE;语文成绩 INT ENGLISH ;英语成绩 若有100个学生的信息,则可以定义一个该结构类型的数组,如STUDENT S100;当需要访问某一个学生的信息时,直接用结构体中数据项的名称来访问,例如:S1.NAME, S2.MATH,这为编写程序带来了很大的方便。,南开大学 朱耀庭,12.

3、1 结构,南开大学 朱耀庭,1. 结构类型的定义,在描述结构型数据或使用结构型变量之前,需要说明结构类型,用STRUC和ENDS可以把一系列数据定义语句括起来作为一种新的、用户定义的结构类型。其格式如下: 结构名 STRUC 数据定义语句序列 结构名 ENDS 在MASM 6.0版本以后也可以使用STRUCT代替STRUC,STURC之后也可以接上一个可以省略的alignment选项和NONUNIQUE选项,格式如下: 结构名 STRUC alignment,NONUNIQUE 数据定义语句序列 结构名 ENDS,南开大学 朱耀庭,1. 结构类型的定义,结构名是一个合法的标识符,是必须有的,并

4、且STRUC前面的结构名和ENDS前面的结构名必须保持一致。alignment表示对齐方式,可用1、2或4来指定结构中字段的对齐方式,缺省值为1。NONUNIQUE要求结构中的字段必须用全名才能访问,若缺省该项表示不仅可以用全名访问,也可以通过偏移量来访问。 数据定义语句序列中定义的字段可以有字段名,也可以没有字段名。有字段名的字段可直接用该字段名来访问它,没有字段名的字段可以用该字段在结构中的偏移量来访问。,南开大学 朱耀庭,1. 结构类型的定义,下面举例来说明结构类型是如何定义的: STUDENT STRUC ;对STUDENT不分配存储单元 NAMEDB ;NAME字段,偏移量为0,缺省

5、值为6个空格 NUMDB 000 ;NUM字段,偏移量为6,缺省值为000 MATHDB ? ;MATH字段,偏移量为9 CHINESE DB ?;CHINESE字段,偏移量为10 ENGLISH DB ?;ENGLISH字段,偏移量为11 SUM DB ?;SUM字段,偏移量为12 STUDENT ENDS ,南开大学 朱耀庭,1. 结构类型的定义,在上述程序段中,STUDENT是结构名称,NAME,NUM,MATH,CHINESE,ENGLISH,SUM是字段名称,这个结构共有6个字段。和一般变量的定义、预置及存储分配不一样,以上仅仅是结构类型名称的定义,此时,汇编程序不给结构类型名称ST

6、UDENT分配存储单元,每个字段中的值也暂时没有实际意义。只有应用结构类型名称作为伪操作符定义结构变量时,才为该结构类型的变量分配存储空间。本例中每个STUDENT结构类型的变量分配13个字节大小的存储空间。 说明: 结构中每个字段所占的字节数,是根据DB,DW, DD伪指令来定义的。 访问结构中某字段所产生的偏移量是该字段距离结构起始点的字节数。,南开大学 朱耀庭,2. 结构变量的定义,在说明了结构类型之后,就可以定义相应的结构变量。可以用结构类型定义中的结构名称(例如STUDENT)作为伪操作符(类似于DB、DW、DD等伪指令的作用)对这个结构进行存储分配和预置。也就是说,可以用结构名称作

7、为伪操作符定义结构变量或结构数组。 格式如下:变量名 结构名 其中,变量名是该结构类型的变量名,可以缺省,如果缺省就不能通过名字来访问该内存单元,只能通过内存地址来访问。字段值表是给每个字段来赋初值的,初值之间用逗号,隔开,其字段值的排列顺序及类型与结构类型定义的字段保持一致,如果不为某个字段赋初值,则直接用逗号隔开。,南开大学 朱耀庭,2. 结构变量的定义,例如: S1 STUDENT ;定义STUDENT类型的变量S1,并分配13个字节大小的存储 ;空间,保持缺省值 S2 STUDENT;定义变量S2,NAME字段为ZHANG,NUM ;字段为001,其余字段为缺省值 S3 STUDENT

8、;定义变量S3,NAME字段为LI,MATH字段、 ;CHINESE字段和ENGLISH字段都为90,NUM字段和SUM字段为缺省值。 利用DUP伪指令可以定义结构类型的数组。 例如: ARRAY1 STUDENT 10 DUP();定义STUDENT类型的数组,数组的大小为10 ARRAY2 STUDENT 3 DUP();定义数组ARRAY2,数组中每个元素 ;的NAME字段初始值改为ZHANG,南开大学 朱耀庭,2. 结构变量的定义,不是所有的结构字段在进行存储分配时其缺省值都是可以被修改的,只有简单字段才可以被修改。 简单字段就是只有一个项的字段,即用DB,DW,DD加以说明而不是用多

9、重说明(即不用DUP伪指令定义)的字段。 多重说明的字段不能被修改,但用DB定义的多于两个字符的字符串字段为简单字段,可以被修改。 修改时可以用一个新字符串代替,新字符串的长度应不大于原字符串的长度,如果比原字符串长,就把多余的字符截去;如果不够长就用原字符串的高位字节的字符去填充。,南开大学 朱耀庭,2. 结构变量的定义,假设结构类型STUDENT定义如下: STUDENT STRUC ;对STUDENT不分配存储单元 NAMEDB 6 DUP( ) ;多重字段,不能修改 NUMDB 000 ;简单字段,可以修改 MATHDB ? ;简单字段,可以修改 CHINESE DB ?;简单字段,可

10、以修改 ENGLISH DB ?;简单字段,可以修改 SUM DB ?;简单字段,可以修改 STUDENT ENDS 若有如下定义: S STUDENT 则会出现汇编错误提示“Field cannot be overridden”。因为NAME是多重字段不能被修改。,南开大学 朱耀庭,3. 结构变量中字段的访问,定义了结构类型的变量后,可以用多种形式的地址表达式来访问结构变量及结构数组元素中的字段,其地址表达式的形式归纳起来常用的有以下6种: 变量名.字段名 变量名.字段名变址 变量名变址+位移 数组名基址.字段名 或基址.字段名 数组名基址.字段名变址 或基址.字段名变址 数组名基址+变址+

11、位移 或基址+变址+位移 例如: MOV AL, 90 MOV S2.MATH, AL MOV BX,OFFSET S2 MOV AL,BX.MATH,南开大学 朱耀庭,4. 结构实例,例12-1 结构程序设计实例 题目:假设每一个学生的信息包括学号(3位)、数学成绩、语文成绩和总成绩,还有一个链指针。编写程序,输入10个学生的学号、数学成绩和语文成绩,并计算出总成绩,按学生总成绩由大到小拉链(建立单向链表),且按拉链的顺序(按学生名次)显示学生信息。 设计思路: 1)数据定义 一个数据元素(一个学生的数据项)应该为一个结构类型,定义如下: S STRUC LINK DW 0;指针 NUM D

12、B 000;学号 MATH DB ?;数学成绩 CHINESE DB ?;语文成绩 SUM DB ?;总成绩 S ENDS,南开大学 朱耀庭,4. 结构实例,例12-1 结构程序设计实例 设计思路: 1)数据定义 其中,LINK字段为链指针,指向数据元素的后续元素的地址,它占用一个字,其初值为0;NUM字段为3个字节,存放学号,为了输入输出方便,学号以3位十进制数字的字符存放;MATH字段、CHINESE字段和SUM字段分别为学生的数学成绩、语文成绩和总成绩,这3个字段值不超过200,分别以一个字节的二进制存放即可。 每一个学生的数据信息为结构S这样一个数据元素。则10个学生需要分配10个这样

13、的数据元素的存储单元。用上面的结构名称S作为伪指令定义学生数组如下: S_ARRAY S 10 DUP() S_ARRAY是一个结构类型的数组,它包括10个元素,每一个元素为一个S类型的结构。 在建立链表的过程中,会用数组元素的首地址装填LINK字段,为了避免冲突,数组元素的首地址不能为0和1,因此,在数据段定义中定义S_ARRAY数组之前,用DW分配了一个字,使数组S_ ARRAY的第一个元素的位移量不为0,也不为1。,南开大学 朱耀庭,4. 结构实例,例12-1 结构程序设计实例 设计思路: 2)方法和步骤 这个程序主要包括3部分:输入数据、按学生的总成绩由大到小建立链表和按学生名次输出学

14、生信息。 (1)输入数据。从数组的第一个元素开始,顺序装填数据元素,因此,设置循环将S_ARRAY数组第一个元素的位移量送至BX,每循环一次,BX加上TYPE S_ARRAY(值为8),使BX指向S_ARRAY数组中下一个元素的起始地址。 装填每个元素的各字段值:输入学号存放到S_ARRAY数组元素的NUM字段;输入数学成绩、语文成绩并分别存放到数组元素的MATH字段和CHINESE字段;将MATH字段和CHINESE字段的值相加得到的总成绩送入SUM字段。,南开大学 朱耀庭,4. 结构实例,例12-1 结构程序设计实例 设计思路: 2)方法和步骤 (2)按学生的总成绩由大到小进行排序建立链表

15、。这一部分任务是按学生的总成绩由大到小进行排序。这里采用建立链表的方式,给数据元素的链指针LINK字段装填数据,使LINK字段指向它的后继数据元素。步骤如下: 初始时,数组元素的每个LINK字段值为0,表示数组元素没有被选中。扫描数组元素的SUM字段,从中找到第一个最大的数,将这个数组元素设置为链表的头,保存这个数组元素的位移量,并将其LINK字段置1,标记这个数组元素已被选中,但尚未装填链指针。 扫描整个数组,从链指针字段为0的数组元素中寻找SUM字段值最大的数组元素,将这个数组元素的位移量填至上一个最大元素的LINK字段,并将1送至这个数组元素的LINK字段。 重复执行步骤,最后剩下一个链指针字段值为1的数组元素,该元素是链表的链尾。,南开大学 朱耀庭,4. 结构实例,例12-1 结构程序设计实例 设计思路: 2)方法和步骤 (3)按名次(总成绩由大到小的顺序)输出学生的信息,也就是按链表中元素的顺序访问其数据元素。步骤如下: 将链表头元素的位移量送到BX寄存器。 输出BX指向的数据元素的信息,即学号、数学成绩、语文成绩和总成绩,输出回车换行。判断BX.LINK字段的值是否为1,为1则结束程序,否则将该元素LINK字段的内容送入BX,重复执行步骤。 提示:输出学生的分数部分是将二进制转换成十进制输出的过程,可以用一

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

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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