6

我无法在汇编程序(8086)中明确EQU指令。

abc EQU xyz

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

即我可以写吗?

varA EQU [bp+4]

mov ax, varA

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

4

3 回答 3

9

EQUitems 不是变量,它们不占用任何内存空间:

  • 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]它似乎不起作用,可能是因为编译器无法获得固定值。

于 2016-10-31T17:20:47.473 回答
4

EQU 简单地表示相等,因此abc EQU xyz, xyz 必须先前已定义。

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

%define varA [bp+4]

mov   ax, varA

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

移动斧头,[bp+4]

那么你可以做类似的事情

Bubble equ varA

mov  bx, Bubble

你会得到

mov bx, [bp+4]

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

于 2016-10-31T17:09:40.230 回答
3

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

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

你会需要吗?我不会。我在 ASM 中编写了大量代码只是因为我缺乏经验,而且宏/预处理器不会让我摆脱那个巨大的错误(它们可能只会让它变得不那么明显,并且在更长的时间内更容易忍受)。

虽然您出于教育原因或性能/低级别的事情在 ASM 中只执行一小段代码,但宏/预处理器会恕我直言添加抽象层来隐藏生成的指令,因此在调试期间您可能会发现自己在问“这个在哪里来自?”。我更喜欢手动编写每条 ASM 指令,知道我为什么把它放在那里,我不想在 ASM 代码中出现任何意外,在 ASM 中编写无错误代码已经非常困难了。

然后我在 ASM 中的大部分后期工作都是 256B 介绍,所以我真的必须知道产生的每个字节...... :)

于 2016-10-31T16:54:59.310 回答