汇编语言STRUCT和ENDS伪指令:定义结构
定义结构使用的是 STRUCT 和 ENDS 伪指令。在结构内,定义字段的语法与一般的变量定义是相同的。结构对其包含字段的数量几乎没有任何限制:
下面的 Employee 结构描述了雇员信息,其包含字段有 ID 号、姓氏、服务年限,以及薪酬历史信息数组。结构定义如下所示,定义必须在声明 Employee 变量之前:
比如,下面的例子就把 myVar 对齐到双字边界:
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 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 字节