我无法在汇编程序(8086)中明确EQU指令。
abc EQU xyz
当在带有 xyz 的代码中找到时,EQU 是否会从字面上交换 abc,无论 xyz 代表什么,值等?
即我可以写吗?
varA EQU [bp+4]
mov ax, varA
还有一个问题是 EQU 全局访问,即我可以在程序外定义 EQU,并在程序内使用它吗?
EQU
items 不是变量,它们不占用任何内存空间:
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]
它似乎不起作用,可能是因为编译器无法获得固定值。
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 %
,其他的可能没有。
一些汇编器有合理的宏支持,通常在内部作为预处理器工作,或者非常接近它。
否则,正如我已经在评论中写的那样,你为什么不使用 C 预处理器呢?(它是独立工具,您可以使用它预处理任何文本文件,只需使用#define
和其他扩展您的 asm 源,其余内容不必看起来像 C 源,预处理器不在乎,它将文件处理为[任何] 文本文件)。
你会需要吗?我不会。我在 ASM 中编写了大量代码只是因为我缺乏经验,而且宏/预处理器不会让我摆脱那个巨大的错误(它们可能只会让它变得不那么明显,并且在更长的时间内更容易忍受)。
虽然您出于教育原因或性能/低级别的事情在 ASM 中只执行一小段代码,但宏/预处理器会恕我直言添加抽象层来隐藏生成的指令,因此在调试期间您可能会发现自己在问“这个在哪里来自?”。我更喜欢手动编写每条 ASM 指令,知道我为什么把它放在那里,我不想在 ASM 代码中出现任何意外,在 ASM 中编写无错误代码已经非常困难了。
然后我在 ASM 中的大部分后期工作都是 256B 介绍,所以我真的必须知道产生的每个字节...... :)