x86汇编中的equ与=的区别

10

我正在学习x86汇编语言课程,进度开始加快。有一件事情没有详细说明如何工作,那就是在定义数据时使用equ和=运算符。

看起来equ用于定义常量,但=也是同样的吗?如果我有一些代码:

.data
   count = 100            ; Is this a constant? Of what data type is this?
   array WORD count DUP(?)
   x_param EQU [EBP + 8]  ; Is this a constant?

我问这个问题是因为我们通常通过声明数据类型来定义数据,但是当没有声明数据类型时(例如count = 100),它是如何工作的?
我已经在过去几天里(春假期间)搜索了谷歌和论坛关于这些运算符的内容,但是我无法找到相关信息,所以我认为我应该自己提问。
编辑: 我正在使用x86 MASM汇编器。

2
你忘了提到你使用哪个汇编器了,请添加一个标签。此外,不要使用谷歌或论坛,最好先查看您的汇编器的官方手册。 - Jester
请参阅EQU=的手册。简而言之,EQU可以定义常量数字或可重新赋值的文本,而=则用于可重新赋值的数字。 - Jester
好的,那么如果我声明 a = 1 或 b equ 1,它们都会是32位数据类型(DWORD)吗? - Backwardsman
不,它们将具有值1。数据类型取决于您在何处以及如何使用它们。 - Jester
哦,好的,现在我明白了。谢谢。 - Backwardsman
1个回答

13

首先,针对您的问题,可以立即回答...

Equ将数字固定。

=在稍后更改之前设置数字。

注意!!!“稍后”一词的定义可能会让你非常困惑,特别是涉及多个源文件时。

以下是一个有用的技巧,可与这两个指令一起使用以定义一组数字,当...

  • 您希望名称表示唯一值(即数学上“唯一”,保证它们都不相同)
  • 您并不关心它们是什么
  • 您可能想要随着开发的进行添加或删除这些值
  • 您不知道(从开始时)您需要多少个这样的值

The_Counter             =               0
The_Counter             =               The_Counter + 1


Fred                    =               The_Counter
The_Counter             =               The_Counter + 1

Barney                  =               The_Counter
The_Counter             =               The_Counter + 1

Dino                    =               The_Counter
The_Counter             =               The_Counter + 1

Arnold                  =               The_Counter
The_Counter             =               The_Counter + 1

Mr_Slate                =               The_Counter
The_Counter             =               The_Counter + 1

现在,正如你所看到的,Fred、Barney、Dino、Arnold、Mr_Slate都可以使用这种方案改变它们的值,这可能是一个不好的事情;因此,如果您想确保在源文件的另一个部分中,其他人(或者您自己出错)不会更改 Fred 等人的值,那么您可以像这样结合上面方案中的 =Equ...

    The_Counter             =               0
    The_Counter             =               The_Counter + 1


    Fred                    Equ             The_Counter
    The_Counter             =               The_Counter + 1

    Barney                  Equ             The_Counter
    The_Counter             =               The_Counter + 1

    Dino                    Equ             The_Counter
    The_Counter             =               The_Counter + 1

    Arnold                  Equ             The_Counter
    The_Counter             =               The_Counter + 1

    Mr_Slate                Equ             The_Counter
    The_Counter             =               The_Counter + 1
在这种情况下,它们仍然彼此不同,但它们的实际值不会成为更改的候选项。
虽然此示例使用 Flintstone 的角色名称,但可以轻松更改为更有用的内容,例如...
- 分配多个中断处理程序及其优先级。您可以移动源代码中的两行位置,并尝试使用允许您观察一个中断处理程序优先于另一个中断处理程序的差异的系统,然后进行切换。 - 更改查找表中选择的值。 - 为每个组开发人员都可以使用的常量命名(作为文本标签,希望其名称明显),而无需担心该特定整数值是什么等等其他约47个非常好的理由。
哦,只是一个建议;如果您想使用这种方案,我建议将这些“Equ”和“=”指令等放入它们自己的“include”文件中;通常命名为“SomeFile.Equ”或其他文件。我个人发现,将这些汇编指令和类似的东西与实际的机器语言指令隔离开来,你会发现你的代码更易读,更易维护;大幅度提高。 (只是我的建议。)
很好的问题,这个问题让我自己陷入了几周的困惑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接