gpt4 book ai didi

sockets - MASM:两次取消引用结构指针?

转载 作者:行者123 更新时间:2023-12-02 03:23:11 27 4
gpt4 key购买 nike

我一直在使用 MASM 再次涉足 x86 程序集,但遇到了一个小障碍。希望从纯粹的享受中重新发明轮子。

    ASSUME eax:PTR hostent
mov ebx, [eax].h_addr_list ;this doesn't compile -- but IDE recognizes hostent.h_addr_list
;I think I need to dereference the pointer twice, but I have no clue how to do that with MASM.
;It sounds silly, yes, but doing the traditional mov eax, [eax] won't solve my compiler error

mov ecx, [eax].h_name ;this compiles just fine

;mov ebx, (hostent PTR [eax]).h_addr_list ;didn't work either.
ASSUME eax:nothing

问题似乎是 h_addr_list 是一个字符 **,而 h_name 是一个字符 *。抛出的错误是:
error A2006: undefined symbol : h_addr_list

hostent 结构的定义是:
    typedef struct hostent {
char FAR *h_name; //note the char FAR *
char FAR FAR **h_aliases;
short h_addrtype;
short h_length;
char FAR FAR **h_addr_list; //note the char FAR FAR **
} HOSTENT, *PHOSTENT, FAR *LPHOSTENT;

最佳答案

我强烈怀疑您正在使用 MASM32 并且有这样的一行:

include \masm32\include\windows.inc

windows.inc 包含 HOSTENT 结构:
hostent STRUCT
h_name DWORD ?
h_alias DWORD ?
h_addr WORD ?
h_len WORD ?
h_list DWORD ?
hostent ENDS

比较一下:
typedef struct hostent {
char FAR *h_name; //note the char FAR *
char FAR FAR **h_aliases;
short h_addrtype;
short h_length;
char FAR FAR **h_addr_list; //note the char FAR FAR **
} HOSTENT, *PHOSTENT, FAR *LPHOSTENT;

你会注意到 h_addr_list在 windows.inc 中定义为 h_list .您可以修改 windows.inc 并重命名 h_list或者您可以修改您的代码以引用 h_list而不是 h_addr_list .我会做后者,因为它会使您的代码与其他使用 MASM32 的代码兼容。

还应该清楚的是,其他一些字段的命名也略有不同。

关于sockets - MASM:两次取消引用结构指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31899155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com