如何在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
相关产品推荐
相关产品推荐

