汇编 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]
的情况下似乎不行,可能是因为编译器不能得到一个固定的值。
我在汇编程序 (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]
的情况下似乎不行,可能是因为编译器不能得到一个固定的值。