结构的第一个成员在 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.

  • 开头的整行的不良行为