我正在上一门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汇编器

最佳答案

首先,立即回答您的问题...

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=指令等放入它们自己的包含文件中非常有好处;通常命名为SomeFile.Equ或其他名称。我个人发现,通过将这类汇编程序指令和此类内容与实际的机器语言指令分离开来,您会发现代码更加清晰易懂,并且更易于维护。大时间的方式更多。 (只是我的建议。)

这是一个很好的问题,这个问题使我自己困惑了数周。

07-24 09:44