我在汇编(8086)中,对于EQU指令的含义感到困惑。
abc EQU xyz
EQU 是否会在代码中找到 abc 时直接将其与 xyz 进行交换,无论 xyz 表示什么,例如数值等等?
也就是说,我可以这样写吗?
varA EQU [bp+4]
mov ax, varA
还有一个问题是,EQU是否可以全局访问?也就是说,我可以在过程之外定义EQU,并在过程中使用它吗?
我在汇编(8086)中,对于EQU指令的含义感到困惑。
abc EQU xyz
EQU 是否会在代码中找到 abc 时直接将其与 xyz 进行交换,无论 xyz 表示什么,例如数值等等?
也就是说,我可以这样写吗?
varA EQU [bp+4]
mov ax, varA
还有一个问题是,EQU是否可以全局访问?也就是说,我可以在过程之外定义EQU,并在过程中使用它吗?
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]
的情况下,它似乎并不起作用,可能是因为编译器无法获得固定值。
varA EQU [bp+2]
和varB EQU [bp+2]
产生的垃圾清晰地表明EMU8086本不应该在第一时间接受这些等式。又发现了模拟器中的另一个缺陷!+1 很高兴看到你花时间了解EQU。 - Fifoernikabc 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需要使用%
,而其他汇编器可能不需要。
0x38
,后面跟着RTS
。那个0x38
恰好是指令SEC
,那个厚颜无耻的家伙跳到那里以带进位标志的方式获取RTS
。 - Weather Vane