You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MASM 5中定义指向FOO结构体的引用变量

MASM 5 结构体指针定义与访问方案

代码错误原因

  • foo PRT FOO为非法语法:首先拼写错误,正确类型修饰符是PTR而非PRT;其次MASM 5没有高级语言的“引用”类型,你需要先定义16位指针变量存储结构体的偏移地址,访问时显式指定指针指向的结构体类型即可。
  • 访问结构体成员时需要先把指针加载到通用寄存器(bx/si/di均可),再通过寄存器间接寻址访问成员。

正确实现步骤

1. 目标模块先声明FOO结构体

必须先让MASM知晓FOO的成员布局,你可以直接在目标模块定义,或者将结构体定义放到公共.inc文件用INCLUDE指令引入:

FOO STRUCT
  bar DB ?
FOO ENDS

2. 定义存储结构体偏移的指针变量

定义一个16位的字变量存储传入的FOO实例偏移量:

; 存储FOO实例偏移的指针变量
pFoo DW ?

3. 函数实现逻辑

写法1:直接强制类型转换

func PROC NEAR
  ; 保存传入的FOO偏移量
  mov pFoo, bx
  ; 将指针加载到si寄存器
  mov si, pFoo
  ; 指定[si]指向FOO类型,访问bar成员
  mov (FOO PTR [si]).bar, 0
  ret
func ENDP

写法2:用TEXTEQU定义别名简化写法

如果不想每次都写强制类型转换,可以定义别名简化后续访问:

; 定义别名,foo等价于FOO类型的[si]
foo TEXTEQU <FOO PTR [si]>

func PROC NEAR
  mov pFoo, bx
  mov si, pFoo
  ; 直接通过别名访问成员
  mov foo.bar, 0
  ret
func ENDP

如果你的程序使用同一段寻址,不需要长期存储指针,也可以直接用bx寄存器访问:

func PROC NEAR
  mov (FOO PTR [bx]).bar, 0
  ret
func ENDP

内容的提问来源于stack exchange,提问作者Luke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:54:06