汇编 8086 EQU 指令

Assembly 8086 EQU directive

我在汇编程序 (8086) 中弄清楚 EQU 指令时遇到了问题。

abc EQU xyz

当在代码中找到带有 xyz 的 EQU 是否按字面意思交换 abc,无论 xyz 代表什么,值等?

即我可以写吗?

varA EQU [bp+4]

mov ax, varA

还有一个问题是 EQU 全局访问,即我可以在程序外定义 EQU,并在程序中使用它吗?

一些汇编器有合理的宏支持,通常在内部作为预处理器工作,或者非常接近预处理器。

否则正如我已经在评论中写的那样,你为什么不使用 C 预处理器? (它是独立的工具,您可以用它预处理任何文本文件,只需使用 #define 和其他扩展您的 asm 源代码,其余内容不必看起来像 C 源代码,预处理器不关心,它将文件作为 [任何] 文本文件处理。

你需要吗?我不会。我在 ASM 中编写了大量代码只是因为我缺乏经验,macros/preprocessor 不会让我免于犯下这个巨大的错误(它们可能只会让它不那么明显并且在更长的时间内更容易忍受)。

虽然您出于教育原因或 performance/low-level 的原因在 ASM 中只编写了一小段代码,但恕我直言,macros/preprocessor 会添加抽象层来隐藏生成的指令,因此在调试过程中您可能会发现你自己问 "where did this one come from?"。我更喜欢手写每条 ASM 指令,知道我为什么把它放在那里,我不希望 ASM 代码有任何惊喜,在 ASM 中编写无错误代码已经非常困难。

再一次,我在 ASM 中的大部分后期工作都是 256B 的介绍,所以我真的必须了解生成的每个字节...:)

EQU 仅表示相等,因此 abc EQU xyz, xyz 必须在之前定义。

在你的第二个例子中,它需要像

%define varA [bp+4]

mov   ax, varA

然后在你的代码被组装后,一个对象转储将产生

mov ax, [bp+4]

然后你可以做类似的事情

Bubble equ varA

mov  bx, Bubble

你会得到

mov bx, [bp+4]

一般来说,所有汇编器的工作方式都相同,尽管在语法上存在细微差别,例如 NASM 需要 %,其他汇编器可能不需要。

EQU 项不是变量,它们不占用任何内存 space :

  • EQU引用一个常量值时,它就成为该值的同义词。这个值不能被覆盖,即使你尝试它也不会改变。
  • EQU 引用另一个变量时,它成为该变量的同义词,因此发生在同义词上的一切都会发生在该变量上。

在 EMU8086 中复制并粘贴下一个代码 运行 :

.model small
.stack 100h
.data

xyz DW  2016    ;◄■■■ ABC IS NOT A VARIABLE, IT IS
abc EQU xyz     ;     JUST A SYNONYM FOR XYZ.

pqr EQU 10      ;◄■■■ PQR IS NOT A VARIABLE, IT IS
                ;     JUST A SNYNONYM FOR NUMBER 10.

varA EQU [bp+2] ;◄■■■ BP POINTS TO GARBAGE.

.code

mov  ax, @data
mov  ds, ax

mov  abc, 25    ;◄■■■ XYZ BECOMES 25!!!!

mov  pqr, 999   ;◄■■■ NO ERROR, BUT THE VALUE WILL NOT CHANGE.
mov  ax, pqr    ;◄■■■ AX IS NOT 999, AX=10.

mov  si, varA   ;◄■■■ GARBAGE.
mov  bp, sp
mov  si, varA   ;◄■■■ DIFFERENT GARBAGE.
push ax         ;◄■■■ PUSH 10.
call my_proc

mov  ax, NUMBER ;◄■■■ YES, EQUS ARE GLOBAL!!! (AX=0B9H).

mov  ax, 4c00h
int  21h

;-----------------------------------------

my_proc proc  
mov  bp, sp
mov  si, varA    ;◄■■■ WRONG VALUE (ANOTHER GARBAGE). 
mov  si, [bp+2]  ;◄■■■ PROPER VALUE (10).

varB EQU [bp+2]
mov  si, varB    ;◄■■■ WRONG AGAIN.

NUMBER EQU 0b9h  ;◄■■■ DEFINE EQU INSIDE PROCEDURE.

ret
my_proc endp          

[bp+2]的情况下似乎不行,可能是因为编译器不能得到一个固定的值。