以x86汇编语言嵌套的STRUCT和UNION

时间:2018-11-17 21:53:14

标签: assembly struct x86 masm unions

我正在尝试以汇编语言为网络应用程序实现c数据结构。注意:这是针对汇编类项目的,因此它必须在汇编器中!!!

这是MS文档的c结构:

typedef struct in_addr {
    union {
        struct {
          UCHAR s_b1;
          UCHAR s_b2;
          UCHAR s_b3;
          UCHAR s_b4;
    } S_un_b;
    struct {
          USHORT s_w1;
          USHORT s_w2;
    } S_un_w;
        ULONG S_addr;
    } S_un;
} IN_ADDR, *PIN_ADDR, *LPIN_ADDR;

以下是汇编语言中的代码:

in_addr STRUCT
    UNION S_un
        S_un_b STRUCT      ; an error here!
            s_b1 BYTE ? 
            s_b2 BYTE ?
            s_b3 BYTE ?
            s_b4 BYTE ?    
        S_un_b ENDS        ; an error here!

        S_un_w STRUCT      ; an error here!
            s_w1 WORD ? 
            s_w2 WORD ? 
        S_un_w ENDS        ; an error here!

        S_addr DWORD ? ; the complete address
    ENDS
in_addr ENDS

当我尝试构建时,我收到一条错误消息(请参阅上面的注释),该错误消息是语法错误(在前3种情况下),或者是“无匹配的块嵌套”作为最后一条。我试图浏览一下英特尔文档,以了解是否可以在联合体内定义结构,但找不到任何明确的信息。

我将非常感谢Intel / MS文档,甚至提供了更多解决方案。我对汇编语言陌生,尽管它变得有点奇怪了。

1 个答案:

答案 0 :(得分:1)

对于任何有类似问题的人,定义包含结构的并集的方法是预先定义结构。

这是我原来的内容:

in_addr STRUCT
    UNION S_un
        S_un_b STRUCT      
            s_b1 BYTE ? 
            s_b2 BYTE ?
            s_b3 BYTE ?
            s_b4 BYTE ?    
        S_un_b ENDS        

        S_un_w STRUCT     
            s_w1 WORD ? 
            s_w2 WORD ? 
        S_un_w ENDS        

        S_addr DWORD ? ; the complete address
    ENDS
in_addr ENDS

那不会编译,至少是在汇编中。可以执行以下操作:

S_un_b STRUCT
    s_b1 BYTE ? 
    s_b2 BYTE ? 
    s_b3 BYTE ? 
    s_b4 BYTE ? 
S_un_b ENDS

S_un_w STRUCT
    s_w1 WORD ? 
    s_w2 WORD ? 
S_un_w ENDS

in_addr STRUCT
    UNION S_un
        S_un_b<>
        S_un_w<>
        S_addr DWORD ? ; the complete address
    ENDS
in_addr ENDS

要使用此结构,请使用常规的struct操作:

例如:

; To set S_addr
mov <in_addr instance name>.<union_name>.S_addr, 0h

可以使用相似的原理来访问BYTE和WORD。

希望这对有相同问题的人有所帮助。