我正在尝试以汇编语言为网络应用程序实现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文档,甚至提供了更多解决方案。我对汇编语言陌生,尽管它变得有点奇怪了。
答案 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。
希望这对有相同问题的人有所帮助。