为什么程序集8086中不允许使用变量名称“名称”?

时间:2018-10-23 18:03:05

标签: assembly x86-16 emu8086

当我尝试声明名称为“ 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.

问题是,如果我尝试使用该变量的其他任何名称,nameennamename_,但是大写字母不起作用,我尝试搜索所有通过互联网,但是我搜索错误,或者我不知道要搜索什么。

1 个答案:

答案 0 :(得分:6)

NAME MASM 指令的名称,并被视为保留字。使用保留字作为变量名将导致问题。特别是NAME指令并没有做任何有用的事情,因为文档表明 MASM 只会忽略它。来自MASM manual

NAME modulename
     

忽略。

EMU8086 中,除了将name变量重命名为其他名称外,没有其他解决方法。

MASM 5.x +中,您可以通过以下方式使用OPTION指令来解决此问题:

OPTION NOKEYWORD:<NAME>

OPTION NOKEYWORD MASM 手册中是这样定义的:

  

MASM保留字除预定义外不区分大小写   符号(请参阅本章后面的“预定义符号”)。

     

如果您将保留字用作变量,则汇编器会生成错误,   代码标签或源代码中的其他标识符。但是,如果   您需要将保留字用于其他目的,即OPTION   NOKEYWORD指令可以有选择地将单词的状态禁用为   保留字。

     

例如,要删除STR指令,请选择MASK   运算符,并且MASM可以识别该单词集中的NAME指令   作为保留,在程序的代码段中使用此语句   在第一次引用STR,MASK或NAME之前:

OPTION NOKEYWORD:<STR MASK NAME>