Первый член структуры не виден в отладчике VS - PullRequest
3 голосов
/ 09 апреля 2020

Я новая пчела на ассемблере. Когда я учусь писать структуру, происходят странные вещи.

Это структура, которую я определяю

User struct 
    name byte 20 dup(0)
    password byte 10 dup(0)
    more byte "bbbbbbbbbbbbbbbbbbbbbbbbbbbb"
User ends

, так я объявляю переменную

user1 User <"chi","fan">

но когда я проверяю переменную user1 в Visual Studio 2019, я не вижу первого члена имени структуры

закрыть окно проверки: close inspect window

Окно памяти: memory 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, визуальная студия 2019

1 Ответ

4 голосов
/ 09 апреля 2020

TL; DR : в современных версиях MASM (включая версии в Visual Studio) строка, начинающаяся с name, фактически игнорируется.


NAME - это зарезервированное слово в MASM. Версии MASM в Visual Studio обрабатывают директиву 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.

...