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

Posted

技术标签:

【中文标题】MASM:取消引用结构指针两次?【英文标题】:MASM: dereference struct pointer twice? 【发布时间】:2015-08-08 22:22:28 【问题描述】:

我一直在使用 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 是 char **,而 h_name 是 char *。抛出的错误是:

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;

【问题讨论】:

仍在寻找答案。谢谢。 【参考方案1】:

我强烈怀疑你正在使用 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_listwindows.inc 中定义为h_list。您可以修改 windows.inc 并重命名 h_list,也可以修改代码以引用 h_list 而不是 h_addr_list。我会做后者,因为它会使您的代码与使用 MASM32 的其他代码兼容。

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

【讨论】:

以上是关于MASM:取消引用结构指针两次?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python/ctypes 中的结构内取消引用 C 函数指针

附加到结构切片时无效的内存地址或 nil 指针取消引用

试图取消引用一个接口,该接口是一个指向后端结构对象的指针,以便我可以按值传递给函数

在 sizeof 操作中取消引用空指针是不是有效[重复]

为啥取消引用称为取消引用的指针?

cppcheck 空指针取消引用,但它实际上可以变为空