一 联合类型
1 联合类型的说明
联合数据类型在内存中占用的内存单元的位数是联合数据类型中最大的字段的位数。
联合数据类型通过不同字段的引用,可以获取不同的值。但是他们共享整个数据区域,字段之间相互覆盖。
联合数据类型的各字段的偏移量都是0。
说明格式:
[联合类型名] UNION [Alignment][, NONUNIQUE]
数据定义语句
[联合类型名] ENDS
比如
DATATYPE UNION
BB DB ?
WW DW ?
DD DD ?
DATATYPE ENDS
这个时候DATATYPE类型的变量将拥有4个字节,因为最大的字段DD拥有四个字节。
2 联合变量的定义
联合数据类型的变量只能用第一个字段进行初始化。
比如上面的DATATYPE:
U1 DATATYPE <12h> ;正确
U2 DATATYPE <1234h> ;错误,因为第一个字段是一个字节
U3 DATATYPE <'J'> ;也正确
3 联合变量的引用
定义后,可以根据不同的需要以不同的数据类型或者字段名来存取联合类型中的数据。
联合变量名.字段名
如:
MOV U1.WW, 1234H ;给联合类型变量赋予字数据
MOV AL, U1.BB ;AL=34H
MOV BX, U1.WW ;BX=1234H
MOV U1.BB, 'A' ;U1.WW=1241H,41H是'A'的ASCII码65
总结:联合类型现在已经不再常用,只有在一些内存资源非常紧张的工业设备上使用
=======================================================
二 记录类型
1 记录类型的说明
汇编语言的记录类型与高级语言的记录类型不同,是为二进制位存取数据提供方便的,记录类型的说明要用到另一个保留字RECORD,说明格式为:
记录名 RECORD 字段名:宽度[=初值表达式],……
1) 记录名代表记录类型
2) 记录类型可以由多个字段组成,每个字段用,隔开
3) 字段的宽度,代表该字段占据的二进制位数,必须是一个常数,所有字段之和不能大于16,大于8的话会自动占用两个字节,否则使用一个字节,记录中的字节以从右向左的方式分配
4) 初值是该字段的缺省值,没有初值默认是0,初值超过指定的二进制位个数所能表示的范围 编译器报错
如
COLOR RECORD BLINK:1, BACK:3=0, INTENSE:1=1, FORE:3
2 记录类型的定义
[变量名] 记录名 <[字段值表]>
1 变量名可选,没有的话要用偏移量
2 字段值以逗号分隔,字段值可省略,但如果要定义后面的字段,前面必须有空的逗号
3 所有字段都省略 要保存<>
如
COLOR1 COLOR <1,7,0,5>
COLOR2 COLOR <1,,,5>
CoLOR3 COLOR <>
3 记录的专用操作符
操作符WIDTH和MASK是用于记录类型的两个专用保留字,可以得到记录类型的不同属性
操作符WIDTH
返回记录或其字段的宽度,形式为:
WIDTH 记录名
WIDTH 记录字段名
操作符MASK
操作符MASK返回一个8位或16位的二进制数,在该二进制数中,被指定记录或字段使用的对应位为1,其余为0,形式如下:
MASK 记录名
MASK 记录字段名
记录字段
记录字段是一个特殊的操作符,本身也是操作数,返回值是该字段移到所在记录的最低位数所需要的位数,即该字段最低位在记录中的位置。
三 数据类型的自定义
在有了数据类型后,还可以定义这些数据类型的别名或指针类型,表达这种定义的伪指令是TYPEDEF 形式如下:
新数据类型名 TYPEDEF [位距] [PTR] 数据类型
位居可以是NEAR FAR 或者 PROC
例如
CHAR TYPEDEF BYTE ;给BYTE定义个别名CHAR
PCHAR TYPEDEF PTR CHAR ;定义一个字符指针数据类型PCHAR
使用:
CH1 CHAR 'ABCDEFG' ;定义一个字符串常量
PCH1 PCHAR CH1 ;定义一个指向字符串常量CH1的变量
1 联合类型的说明
联合数据类型在内存中占用的内存单元的位数是联合数据类型中最大的字段的位数。
联合数据类型通过不同字段的引用,可以获取不同的值。但是他们共享整个数据区域,字段之间相互覆盖。
联合数据类型的各字段的偏移量都是0。
说明格式:
[联合类型名] UNION [Alignment][, NONUNIQUE]
数据定义语句
[联合类型名] ENDS
比如
DATATYPE UNION
BB DB ?
WW DW ?
DD DD ?
DATATYPE ENDS
这个时候DATATYPE类型的变量将拥有4个字节,因为最大的字段DD拥有四个字节。
2 联合变量的定义
联合数据类型的变量只能用第一个字段进行初始化。
比如上面的DATATYPE:
U1 DATATYPE <12h> ;正确
U2 DATATYPE <1234h> ;错误,因为第一个字段是一个字节
U3 DATATYPE <'J'> ;也正确
3 联合变量的引用
定义后,可以根据不同的需要以不同的数据类型或者字段名来存取联合类型中的数据。
联合变量名.字段名
如:
MOV U1.WW, 1234H ;给联合类型变量赋予字数据
MOV AL, U1.BB ;AL=34H
MOV BX, U1.WW ;BX=1234H
MOV U1.BB, 'A' ;U1.WW=1241H,41H是'A'的ASCII码65
总结:联合类型现在已经不再常用,只有在一些内存资源非常紧张的工业设备上使用
=======================================================
二 记录类型
1 记录类型的说明
汇编语言的记录类型与高级语言的记录类型不同,是为二进制位存取数据提供方便的,记录类型的说明要用到另一个保留字RECORD,说明格式为:
记录名 RECORD 字段名:宽度[=初值表达式],……
1) 记录名代表记录类型
2) 记录类型可以由多个字段组成,每个字段用,隔开
3) 字段的宽度,代表该字段占据的二进制位数,必须是一个常数,所有字段之和不能大于16,大于8的话会自动占用两个字节,否则使用一个字节,记录中的字节以从右向左的方式分配
4) 初值是该字段的缺省值,没有初值默认是0,初值超过指定的二进制位个数所能表示的范围 编译器报错
如
COLOR RECORD BLINK:1, BACK:3=0, INTENSE:1=1, FORE:3
2 记录类型的定义
[变量名] 记录名 <[字段值表]>
1 变量名可选,没有的话要用偏移量
2 字段值以逗号分隔,字段值可省略,但如果要定义后面的字段,前面必须有空的逗号
3 所有字段都省略 要保存<>
如
COLOR1 COLOR <1,7,0,5>
COLOR2 COLOR <1,,,5>
CoLOR3 COLOR <>
3 记录的专用操作符
操作符WIDTH和MASK是用于记录类型的两个专用保留字,可以得到记录类型的不同属性
操作符WIDTH
返回记录或其字段的宽度,形式为:
WIDTH 记录名
WIDTH 记录字段名
操作符MASK
操作符MASK返回一个8位或16位的二进制数,在该二进制数中,被指定记录或字段使用的对应位为1,其余为0,形式如下:
MASK 记录名
MASK 记录字段名
记录字段
记录字段是一个特殊的操作符,本身也是操作数,返回值是该字段移到所在记录的最低位数所需要的位数,即该字段最低位在记录中的位置。
三 数据类型的自定义
在有了数据类型后,还可以定义这些数据类型的别名或指针类型,表达这种定义的伪指令是TYPEDEF 形式如下:
新数据类型名 TYPEDEF [位距] [PTR] 数据类型
位居可以是NEAR FAR 或者 PROC
例如
CHAR TYPEDEF BYTE ;给BYTE定义个别名CHAR
PCHAR TYPEDEF PTR CHAR ;定义一个字符指针数据类型PCHAR
使用:
CH1 CHAR 'ABCDEFG' ;定义一个字符串常量
PCH1 PCHAR CH1 ;定义一个指向字符串常量CH1的变量