【问题标题】:Why is the variable name "name" not allowed in assembly 8086?为什么程序集 8086 中不允许使用变量名称“name”?
【发布时间】:2018-10-23 18:03:05
【问题描述】:

当我尝试用名称“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_,但大写字母不起作用,我尝试在整个互联网上搜索,但要么我搜索错了,或者我不知道要搜索什么。

【问题讨论】:

  • 你可以尝试MOV BL, BYTE PTR [name]获取name的第一个字节。
  • @zx485 :在 MASM(包括 TASM/EMU8086 等)中,[] 在没有 offset 关键字的情况下被暗示。所以name 实际上是[name]。 MASM 可以从目标寄存器中推断出大小(它还与nameDB 定义相匹配)。最终结果是MOV BL, nameMOV BL, [name]MOV BL, BYTE PTR [name] 都是一样的。为了便于阅读,我会使用[]

标签: assembly x86-16 emu8086


【解决方案1】:

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

NAME modulename

忽略。

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

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

OPTION NOKEYWORD:<NAME>

OPTION NOKEYWORDMASM 手册中是这样定义的:

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

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

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

OPTION NOKEYWORD:<STR MASK NAME>

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多