x86 assembly equ vs =

时间:2015-03-09 17:34:18

标签: assembly operators constants masm

我正在使用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汇编程序

1 个答案:

答案 0 :(得分:7)

首先,你问题的直接答案......

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 et.al.不要被其他人(或你自己,错误地)在源文件的另一部分中更改,那么你可以将上述方案中的=Equ组合在一起...... / p>

    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或其他。我个人发现,通过从实际的机器语言指令中分离出这些类型的汇编指令和这些东西,你会发现你的代码更易读,而且更易于维护;大时间的方式更多。 (只是我的建议。)

好问题,而且我自己也困惑了好几个星期。