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 2019

TL;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>