装配8086 EQU指令

时间:2016-10-31 16:26:08

标签: assembly x86-16 emu8086

我在汇编程序(8086)中明确 EQU 指令时遇到了麻烦。

eval

在使用xyz的代码中找到时,EQU是否真的交换了abc,无论xyz代表什么,值等等?

即。我可以写吗?

abc EQU xyz

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

3 个答案:

答案 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中执行了大量代码,而宏/预处理器不会让我免于那个巨大的错误(他们可能只是让它不那么明显,而且在更长的时间内更可忍受。)

虽然你在ASM中只是出于教育原因,或性能/低级别的东西,宏或预处理器,你会在IMHO中添加一层抽象阴影生成的指令,所以在调试过程中你可能会发现自己在问“哪里这个来自哪个?“我更喜欢手工编写每个ASM指令,知道为什么我把它放在那里,我不希望ASM代码有任何意外,在ASM编写无错代码已经很难了。

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