结构的第一个成员在 VS 调试器中不可见
First member of struct not visible in VS debugger
我是汇编语言的小蜜蜂。在我学习写结构体的时候,奇怪的事情发生了。
这是我定义的结构
User struct
name byte 20 dup(0)
password byte 10 dup(0)
more byte "bbbbbbbbbbbbbbbbbbbbbbbbbbbb"
User ends
这就是我声明变量的方式
user1 User <"chi","fan">
但是当我在 visual studio 2019 年检查变量 user1 时,
我看不到结构名称的第一个成员
关闭检查 window:
内存window:
我的完整代码 data.asm
Employee struct
IdNum byte "000000000" ; 9
LastName byte 30 DUP(0) ; 30
ALIGN word ;
Years word 0 ; 2
ALIGN dword ;
SalaryHistory dword 0,0,0,0 ; 16
Employee ends
Employee2 struct
IdNum byte "000000000" ; 9
LastName byte 30 DUP(0) ; 30
ALIGN word ;
Years word 0 ; 2
ALIGN dword ;
SalaryHistory dword 0,0,0,0 ; 16
Employee2 ends
User struct
name byte 20 dup(0)
password byte 10 dup(0)
more byte "bbbbbbbbbbbbbbbbbbbbbbbbbbbb"
User ends
user1 User <"chi","fan">
worker4 Employee <"888","555">
worker2 Employee2 <"aaa","bbb">
我的完整代码在main.asm
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
.data
include data.asm
.code
main PROC
mov worker4.SalaryHistory, 1000H ;
;
invoke ExitProcess,0
main ENDP
END main
环境:windows,visual studio 2019
TL;DR:在现代版本的 MASM(包括 Visual Studio 中的版本)中,以 name
开头的行实际上被忽略了。
NAME
是一个采用字符串的 reserved word in MASM. Versions of MASM in Visual Studio process the NAME
指令,但是这些现代版本的 MASM 会忽略该指令的结果。 NAME
是一个指令,允许与早期版本的 MASM 更好地兼容源代码。
因为这一行以 NAME
开头,例如:
name byte 20 dup(0)
基本上被忽略了。这就是为什么它没有出现在调试器中,也不能用类似的东西来引用它的原因:
mov user1.name, 'c'
这样的结果应该是 name
是一个未定义的符号。
解决方案:
- 将
name
成员重命名为 uname
或任何其他非 MASM 保留字的名称。
使用 NOKEYWORD
选项告诉 MASM 你想覆盖 name
作为保留字。将此添加到 data.asm
(或 main.asm
)
的顶部
OPTION NOKEYWORD:<NAME>
这告诉 MASM 不要将 NAME
视为保留字。这应该可以防止 MASM 忽略以 NAME
.
开头的整行的不良行为
我是汇编语言的小蜜蜂。在我学习写结构体的时候,奇怪的事情发生了。
这是我定义的结构
User struct
name byte 20 dup(0)
password byte 10 dup(0)
more byte "bbbbbbbbbbbbbbbbbbbbbbbbbbbb"
User ends
这就是我声明变量的方式
user1 User <"chi","fan">
但是当我在 visual studio 2019 年检查变量 user1 时, 我看不到结构名称的第一个成员
关闭检查 window:
内存window:
我的完整代码 data.asm
Employee struct
IdNum byte "000000000" ; 9
LastName byte 30 DUP(0) ; 30
ALIGN word ;
Years word 0 ; 2
ALIGN dword ;
SalaryHistory dword 0,0,0,0 ; 16
Employee ends
Employee2 struct
IdNum byte "000000000" ; 9
LastName byte 30 DUP(0) ; 30
ALIGN word ;
Years word 0 ; 2
ALIGN dword ;
SalaryHistory dword 0,0,0,0 ; 16
Employee2 ends
User struct
name byte 20 dup(0)
password byte 10 dup(0)
more byte "bbbbbbbbbbbbbbbbbbbbbbbbbbbb"
User ends
user1 User <"chi","fan">
worker4 Employee <"888","555">
worker2 Employee2 <"aaa","bbb">
我的完整代码在main.asm
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
.data
include data.asm
.code
main PROC
mov worker4.SalaryHistory, 1000H ;
;
invoke ExitProcess,0
main ENDP
END main
环境:windows,visual studio 2019
TL;DR:在现代版本的 MASM(包括 Visual Studio 中的版本)中,以 name
开头的行实际上被忽略了。
NAME
是一个采用字符串的 reserved word in MASM. Versions of MASM in Visual Studio process the NAME
指令,但是这些现代版本的 MASM 会忽略该指令的结果。 NAME
是一个指令,允许与早期版本的 MASM 更好地兼容源代码。
因为这一行以 NAME
开头,例如:
name byte 20 dup(0)
基本上被忽略了。这就是为什么它没有出现在调试器中,也不能用类似的东西来引用它的原因:
mov user1.name, 'c'
这样的结果应该是 name
是一个未定义的符号。
解决方案:
- 将
name
成员重命名为uname
或任何其他非 MASM 保留字的名称。 使用
的顶部NOKEYWORD
选项告诉 MASM 你想覆盖name
作为保留字。将此添加到data.asm
(或main.asm
)OPTION NOKEYWORD:<NAME>
这告诉 MASM 不要将
NAME
视为保留字。这应该可以防止 MASM 忽略以NAME
. 开头的整行的不良行为