汇编语言程序设计(二)

1.5 结构类型伪指令

前面,我们介绍了汇编语言中六个最基本的数据类型,这些数据类型能满足程序设计中绝大多数情况的需要,但也存在需要更复杂的数据类型的情况。

 

下面介绍汇编语言所提供的三种复合数据类型的说明形式。

 

1、重复说明符DUP

 

从前面的内容里,我们知道了定义少量内存变量的定义形式,但如果在程序中要说明50个、100个、200个甚至更多的、同类型的内存变量时,若采用前面所学的方法,对它们一一加以说明显然是不可行的。为此,汇编语言提供了变量的重复说明符DUP,其说明的一般形式如下:

 

count  DUP  (表达式, 表达式, , 表达式)

 

解释:count是重复次数,(表达式, 表达式, , 表达式)是被重复的部分,“表达式”可以是存储单元的初值,也可以是含义另一个DUP的式子。如果在表达式的括号中有多个表达式,那么,它们之间要用逗号','分开。

 

例如:

BUFFER  DB 100 DUP(?)

STRING  DB 120 DUP('ABCDE'), 0

DATA1  DW 50 DUP(10H, 20 DUP(1,2,3), 20H)

POINTS  DD 12, 30 DUP(0)

 

从上面的例子可看出:用DUP说明内存变量相当于在高级语言中定义数组。

 

2、结构类型的定义

 

重复说明符DUP只能用于重复同一数据类型的变量说明,它不可以重复不同数据类型的变量说明。为了把一组不同类型的变量说明组合在一起,汇编语言提供了另一种复合数据类型说明符——结构类型说明符STRUC

 

STRUCENDS可以把一系列数据定义语句括起来作为一种新的、用户定义的结构类型。其一般说明格式如下:

 

结构名 STRUC [Alignment][, NONUNIQUE]

数据定义语句序列

结构名 ENDS

 

解释:结构名是一个合法的标识符,且具有唯一性。结构名代表整个结构类型,前后两个结构名必须一致。结构内被定义的变量为结构字段,变量名即为字段名。

 

一个结构中允许含有任意多个字段,各字段的类型和所占字节数也都可任意。如果字段有字段名,则字段名必须唯一。每个字段可独立存取。

 

l         对齐方式(Alignment):可用124来指定结构中字段的字节边界(Byte boundary),其缺省值为1。见4.3.2节中的有关叙述;

l         NONUNIQUE:要求结构中的字段必须用全名才能访问,见本小节中的“结构类型字段的引用”。

 

例如:

COURSE  STRUC 

 NO DD ?                    ;学号

 CNAME DB 'Assember'        ;名字

 SCORE DW 0                 ;得分

COURSE  ENDS

 

上例中,COURSE是结构名,它含有三个字段:NOCNAMESCORE,这些字段的类型分别是DDDBDW

 

我们不难看出:结构类型COURSE共占14个字节,其字段NOCNAMESCORE的偏移量分别为:0412

 

结构中的字段可以有字段名,也可以没有字段名。有字段名的字段可直接用该字段名来访问它,没有字段名的字段可以用该字段在结构中的偏移量来访问。

 

例如:

PEASON  STRUC

 NO DD ?             ;偏移量为0

 NAME DB 10 dup (?)   ;偏移量为4

DB 1 ;偏移量为14

PEASOM  ENDS

 

在结构PEASON中,有二个字段有字段名,一个字段没有字段名,但不管有无字段名,我们都可用其偏移量来访问它。

 

结构类型变量的定义

 

在定义某个结构类型后,程序员就可以说明该结构类型的内存变量。它的说明形式与前面介绍的简单数据类型的变量说明基本上一致。其定义格式如下:

 

[变量名] 结构名 <[字段值表]>

 

解释:

1) 变量名即为该结构类型的变量名,它可省缺。如果省缺,则不能用符号名来访问该内存单元;

2) 字段值表是给字段赋初值,中间用逗号','分开,其字段值的排列顺序及类型应与该结构说明时各字段相一致;

3) 如果结构变量中某字段用其说明时的缺省值,那么,可用逗号来表示;如果所有字段都如此,则可省去字段值表,但必须保留一对尖括号"<"">"

 

例如:

COURSE1  COURSE <> ;使用缺省的初值

COURSE2  COURSE <1, 'Pascal', 60>

COURSE3  COURSE <2, , 84>  ;使用缺省的课程名

PEASON1  PEASON <1000, ' ', 34>

 

结构类型字段的引用

 

定义了结构类型的变量后,若要访问其结构中的某个字段,则可采用如下形式:

 

结构变量名.字段名

 

大家看到,是不是感觉有些像C语言啊?不错,该引用方式与高级语言的字段引用方式完全一致,我们还可用偏移量来访问其中的某个字段,但此方法不直观,变动性大,所以,一般情况下,不提倡使用此方法。

 

例如:

EXAM1 STRUC

F1 DW  ?

F2 DB   ?

EVEN ;偶对齐

F3 DW  ?

EXAM1 ENDS

E1 EXAM1  <1234H,'A',8765H> ;定义结构EXAM1的一个变量E1

 

下面二种方法都可以把结构变量E1中字段的内容赋给寄存器AX,但如果在字段F3之前增加或减少了字段,那么,这些引用需要改变吗?

 

(1)、用字段名直接引用

 

MOV AX, E1.F3

 

(2)、用字段的偏移量间接引用(不提倡)

 

LEA SI, E1

MOV AX, [SI+4]     ;其中4是字段F3的偏移量

 

1.6

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值