汇编语言STRUCT和ENDS伪指令:定义结构


定义结构使用的是 STRUCT 和 ENDS 伪指令。在结构内,定义字段的语法与一般的变量定义是相同的。结构对其包含字段的数量几乎没有任何限制:

name STRUCT
    field-declarations
name ENDS

字段初始值若结构字段有初始值,那么在创建结构变量时就要进行赋值。字段初始值可以使用各种类型:
  • 无定义:运算符?使字段初始值为无定义。
  • 字符串文本:用引号括起的字符串。
  • 整数:整数常数和整数表达式。
  • 数组:DUP 运算符可以初始化数组元素。

下面的 Employee 结构描述了雇员信息,其包含字段有 ID 号、姓氏、服务年限,以及薪酬历史信息数组。结构定义如下所示,定义必须在声明 Employee 变量之前:
Employee STRUCT
    IdNum BYTE "000000000"
    LastName BYTE 30 DUP(0)
    Years WORD 0
    SalaryHistory DWORD 0,0,0,0
Employee ENDS
该结构内存保存形式的线性表示如下:

对齐结构字段

为了获得最好的内存 I/O 性能,结构成员应按其数据类型进行地址对齐。否则,CPU 将会花更多时间访问成员。例如,一个双字成员应对齐到双字边界。下表列岀了 Microsoft C 和 C++ 编译器,以及 Win32 API 函数的对齐方式。汇编语言中的 ALIGN 伪指令会使其后的字段或变量按地址对齐:

ALIGN datatype


成员类型 对齐方式 成员类型 对齐方式
BYTE, SBYTE 对齐到 8 位(字节)边界 REAL4 对齐到 32 位(双字)边界
WORD, SWORD 对齐到 16 位(字)边界 REAL8 对齐到 64 位(四字)边界
DWORD, SDWORD 对齐到 32 位(双字)边界 structure 所有成员的最大对齐要求
QWORD 对齐到 64 位(四字)边界 union 第一个成员的对齐要求

比如,下面的例子就把 myVar 对齐到双字边界:

.data
ALIGN DWORD
myVar DWORD ?

现在正确地定义 Employee 结构,利用 ALIGN 将 Years 按字(WORD)边界对齐,SalaryHistory 按双字(DWORD)边界对齐。注释为字段大小:
Employee STRUCT
    IdNum BYTE "000000000"              ; 9
    LastName BYTE 30 DUP(0)             ; 30
    ALIGN WORD                          ; 加 1 字节
    Years WORD 0                        ; 2
    ALIGN DWORD                         ; 加 2 字节
    SalaryHistory DWORD 0,0,0,0         ; 16
Employee ENDS                           ;共 60 字节