我在汇编程序(8086)中明确 EQU 指令时遇到了麻烦。
eval
在使用xyz的代码中找到时,EQU是否真的交换了abc,无论xyz代表什么,值等等?
即。我可以写吗?
abc EQU xyz
还有一个问题是EQU全局访问,即我可以在程序中定义EQU,并在程序中使用它吗?
答案 0 :(得分:6)
EQU
项不是变量,它们不占用任何内存空间:
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]
的情况下,它似乎无法正常工作,可能是因为编译器无法获得固定值。
答案 1 :(得分:4)
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需要%
,其他人可能不会。
答案 2 :(得分:3)
一些汇编程序具有合理的宏支持,通常在内部作为预处理程序工作,或者非常接近它。
否则正如我在评论中写的那样,为什么不使用C预处理器? (它是独立的工具,你可以用它预处理任何文本文件,只需使用#define
和其他扩展你的asm源,其余内容不必看起来像C源,预处理器不关心,它将文件作为[任意]文本文件处理)。
虽然你在ASM中只是出于教育原因,或性能/低级别的东西,宏或预处理器,你会在IMHO中添加一层抽象阴影生成的指令,所以在调试过程中你可能会发现自己在问“哪里这个来自哪个?“我更喜欢手工编写每个ASM指令,知道为什么我把它放在那里,我不希望ASM代码有任何意外,在ASM编写无错代码已经很难了。
然后我在ASM的大部分后期工作都是256B的介绍,所以我真的必须知道每个字节产生的......:)