ITEEDU

4.4.3 联合类型的定义

联合数据类型是一种特殊的数据类型。它可以实现:以一种数据类型存储数据,以另一种数据类型来读取数据。程序员可以根据不同的需要,以不同的数据类型来读取联合类型中的数据。也就是说,在一些情况下,以一种数据类型来读取联合类型中的数据,而在另一些情况下,又以另一种数据类型来读取其数据。

1、联合类型的说明

联合数据类型其说明格式如下:

 [联合类型名] UNION   [Alignment] [,NONUNIQUE
 数据定义语句序列 
 [联合类型名] ENDS

联合类型中的各字段相互覆盖,即同样的存储单元被多个不同的字段所对应,并且其每个字段的偏移量都为0。

联合类型所占的字节数是其所有字段所占字节数的最大值。

对齐方式(Alignment):可用1、2或4来指定结构字节的边界,其缺省值为1。它还用可伪指令ALIGN或EVEN来重新定界,也可用命令行选项/Zp来定界;

NONUNIQUE:要求联合类型中的字段必须用全名才能访问,引用联合类型字段的方法见下面的“联合类型字段的引用”。

例如:

 DATATYPE  UNION
      BB DB ?          ;定义一个字节类型的字段
      WW DW ?     ;定义一个字类型的字段
      DD DD ?       ;定义一个双字类型的字段
  DATATYPE  ENDS

联合类型DATATYPE的字段分布如图4.8所示。 在联合类型的最外层定义中,在伪指令UNION和ENDS的前面一定要书写该联合类型名,而在其嵌套定义的内层,伪指令UNION和ENDS之前一定不能写联合类型名。


图4.8 DATATYPE的字段分布示意图

例如:

 UNION1 UNION
      BB   DB ?  
      WW DW  ?
      UNION   ;联合类型的嵌套定义形式
      W1      DW  ?
      B1       DB       ?
  ENDS
      UNION1 ENDS

2、联合类型变量的定义

联合数据类型的变量只能用第一个字段的数据类型来进行初始化。

例如:

 U1   DATATYPE     <'J'>       ;定义一个联合变量,并初始化其值
  U2   DATATYPE     <1234H> ;初始化错误,只能用字节数据来初始化
  U3   UNION1 <1>

3、联合类型字段的引用

定义了联合类型的变量后,就可根据需要,以不同的数据类型或字段名来存取该联合类型中的数据。引用其字段的具体形式如下:
联合类型变量名.字段名

例如:

 MOV      U1.WW, 1234H      ;给联合类型变量赋字数据
  MOV      AL, U1.BB      ;AL=34H
  MOV      BX, U1.WW   ;BX=1234H
  MOV      U1.BB, 'A'      ;U1的值1241H,41H是'A'的ASCII码