汇编语言联合 (union) 的声明和使用
unionname UNION
union-fields
unionname ENDS
structname STRUCT
structure-fields
UNION unionname
union-fields
ENDS
structname ENDS
Integei; UNION
D DWORD 0
W WORD 0
B BYTE 0
Integer ENDS
一致性
如果使用初始值,那么它们必须为相同的数值。假设 Integer 声明了 3 个不同的初始值:
Integer UNION
D DWORD 1
W WORD 5
B BYTE 8
Integer ENDS
.data
mylnt Integer <>
结构包含联合
在结构声明中使用联合的名称,就可以使联合嵌套在这个结构中。方法如同下面在 Fileinfo 结构中声明 FilelD 字段一样:
Fileinfo STRUCT
FilelD Integer <>
FileName BYTE 64 DUP(?)
Fileinfo ENDS
Fileinfo STRUCT
UNION FilelD
D DWORD ?
W WORD ?
B BYTE ?
ENDS
FileName BYTE 64 DUP(?)
Fileinfo ENDS
声明和使用联合变量
联合变量的声明和初始化方法与结构变量相同,只除了一个重要的差异:不允许初始值多于一个。下面是 Integer 类型变量的例子:
val1 Integer <12345678h>
val2 Integer <100h>
val3 Integer <>
mov val3.B, al
mov val3.W, ax
mov val3.D, eax
INPUT_RECORD STRUCT
EventType WORD ?
ALIGN DWORD
UNION Event
KEY_EVENT_RECORD <>
MOUSE_EVENT_RECORD <>
WINDOW_BUFFER_SIZE_RECORD <>
MENU_EVENT_RECORD <>
FOCUS_EVENT_RECORD <>
ENDS
INPUT_RECORD ENDS
Win32 API
在命名结构时,常常使用单词 RECORD。KEY_EVENT_RECORD 结构的定义如下所示:
KEY_EVENT_RECORD STRUCT
bKeyDown DWORD ?
wRepeatCount WORD ?
wVirtualKeyCode WORD ? wVirtualScanCode WORD ?
UNION uChar
UnicodeChar WORD ?
AsciiChar BYTE ?
ENDS
dwControlKeyState DWORD ?
KEY_EVENT_RECORD ENDS