如何在 NASM 中建立工会?

How do you make a union in NASM?

我需要在 Nasm 中复制一个 C 风格的联合,但不知道如何实现。

我需要

r_eax dd 0
r_ax dw 0

其中 r_ax 应该驻留在与 r_eax 的低 16 位相同的内存位置。

在 C 中,这将是:

union RegType {
    long eax;
    short ax;
} reg_a;

我明白 Nasm 不关心变量大小,但我仍然希望能够使用不同的引用/变量名称。

真的很容易。 EQU 指令表示 "make this symbol the same as another one" - 因此您可以在示例中简单地编写 r_ax EQU r_eax

如果您使用 NASM 的 "local notation"(我强烈推荐...),这甚至可以工作

STRUC Reg_A
    .eax RESD 1
    .ax EQU .eax
    .al EQU .ax
    .ah EQU ????? ; Ummm!
ENDSTRUC

不过我会这样重新排列它:

STRUC Reg_A
    .al RESB 1
    .ah RESB 1
    .eah RESW 1  ; Not a real symbol - but NASM won't allow unnamed members
    .ax EQU .al
    .eax EQU .ax
ENDSTRUC