Почему имя переменной "имя" не разрешено в сборке 8086? - PullRequest
0 голосов
/ 23 октября 2018

Когда я пытаюсь объявить переменную с именем "name", она не работает, она выдает мне ошибку, эта there are errors. со следующим объяснением

(22) wrong parameters: MOV  BL, name
(22) probably no zero prefix for hex; or no 'h' suffix; or wrong addressing; or undefined var: name

вот мой код

; multi-segment executable file template.

data segment
    ; add your data here!
    pkey db "press any key...$"
    name db "myname"
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax

    ; add your code here

    MOV BL, name


    ;;;;;

    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx

    ; wait for any key....
    mov ah, 1
    int 21h

    mov ax, 4c00h ; exit to operating system.
    int 21h
ends

end start ; set entry point and stop the assembler.

дело в том, что если я попробую любое другое имя для переменной, с которой она работает, namee, nname, name_, но верхний регистр не работает, я попытался найти всечерез Интернет, но я либо неправильно ищу, либо не знаю, что искать.

1 Ответ

0 голосов
/ 23 октября 2018

NAME является названием директивы MASM и считается зарезервированным словом.Использование зарезервированных слов в качестве имен переменных вызовет проблемы.директива NAME, в частности, не делает ничего полезного, поскольку документация предполагает, что MASM просто игнорирует ее.Из MASM руководства :

NAME modulename

Игнорируется.

В EMU8086 нетРеальный способ обойти это невозможно, кроме как переименовать переменную name во что-то еще.

В MASM 5.x + вы можете обойти эту проблему, используя OPTION директива следующим образом:

OPTION NOKEYWORD:<NAME>

OPTION NOKEYWORD определяется таким образом в MASM руководстве:

MASM зарезервированные слова не чувствительны к регистру, кромепредопределенные символы (см. «Предопределенные символы» далее в этой главе).

Ассемблер генерирует ошибку, если вы используете зарезервированное слово в качестве переменной, метки кода или другого идентификатора в вашем исходном коде.Однако если вам нужно использовать зарезервированное слово для другой цели, директива OPTION NOKEYWORD может выборочно отключать статус слова как зарезервированного слова.

Например, чтобы удалить инструкцию STR, оператор MASK и директиву NAME из набора слов, которые MASM распознает как зарезервированные, используйте этот оператор в сегменте кода вашей программы перед первой ссылкой на STR,МАСКА или ИМЯ:

OPTION NOKEYWORD:<STR MASK NAME>
...