Visual studio 结构的第一个成员在VS调试器中不可见
我是汇编语言的新手。当我学习写结构时,奇怪的事情发生了 这是我定义的结构Visual studio 结构的第一个成员在VS调试器中不可见,visual-studio,assembly,x86,masm,visual-studio-debugging,Visual Studio,Assembly,X86,Masm,Visual Studio Debugging,我是汇编语言的新手。当我学习写结构时,奇怪的事情发生了 这是我定义的结构 User struct name byte 20 dup(0) password byte 10 dup(0) more byte "bbbbbbbbbbbbbbbbbbbbbbbbbbbb" User ends 这就是我声明变量的方式 user1用户 但当我在visual studio 2019中检查变量user1时, 我看不到结构名称的第一个成员 关闭检查窗口: 内存窗口: 我的data.a
User struct
name byte 20 dup(0)
password byte 10 dup(0)
more byte "bbbbbbbbbbbbbbbbbbbbbbbbbbbb"
User ends
这就是我声明变量的方式
user1用户
但当我在visual studio 2019中检查变量user1时,
我看不到结构名称的第一个成员
关闭检查窗口:
内存窗口:
我的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">
环境:windows、visual studio 2019TL;DR:在MASM的现代版本(包括Visual Studio中的版本)中,以
名称开头的行实际上被忽略
NAME
是MASM中的一个名称。VisualStudio中的MASM版本将该指令作为字符串处理,但这些现代版本的MASM忽略了该指令的结果NAME
是一个指令,它的存在是为了更好地与早期版本的MASM保持源代码兼容性
因此,以NAME
开头的行类似于:
name byte 20 dup(0)
基本上被忽略了。这就是为什么它不会出现在调试器中,也不能使用以下内容引用它:
mov user1.name, 'c'
这样做的结果应该是name
是一个未定义的符号
解决方案:
- 将
name
成员重命名为类似uname
的名称或任何其他非MASM保留字的名称
- 使用该选项告诉MASM您要将
name
作为保留字覆盖。将其添加到data.asm
(或main.asm
)的顶部
OPTION-NOKEYWORD:
这告诉MASM不要将代码> >名称>代码作为保留字。这将防止MASM忽略以
NAME
开头的整行的不必要行为
字段名称
有一些有趣的地方--将其更改为aname
,它会工作,但我不知道为什么。。在列表文件中,您可以看到它只是跳过名称字节20 dup(0)
而不给它存储空间,不管它在结构中的什么位置,而是给名称字节20 dup(0)
提供存储空间。有人知道是什么使name
特别吗?一个列表文件表明,MASM是罪魁祸首,而不是调试器:整行被忽略,声明行没有存储。换句话说,甚至在运行调试器之前,事情就已经出错了(不是期望的/预期的)。其他信息:语句/指令被忽略。它最初用于指定正在组装的文件是一个应用程序(而不是DLL),并且可以选择包含一个应用程序名称和/或应用程序类型。@1201程序管理员:我正在进行调查,返回时看到了您的评论。这实际上也是我的评估。在我注意到这个评论之前,我已经更新了我的答案,但是你是完全正确的。结果是,任何以名称开始的行实际上都会被忽略,这就是为什么该代码会明确地忽略该行的原因。使用NOKEYWORD作为我最初的答案可以消除这种行为。我不得不拿出一本1992年的旧MASM手册来查找有关名称的详细信息。@1201程序:有趣的是,我在谷歌查询时发现的第一个突出的参考是70年代末的英特尔MCS-86文档。(然后是塔斯姆的理想模式中类似的东西)
mov user1.name, 'c'
OPTION NOKEYWORD:<NAME>