assembly - x86组装设备vs =

标签 assembly operators constants masm

我正在上一门x86汇编语言类(class),并且开始发展很快。这本书一直在做一件事,而没有提到它是如何工作的,那就是在定义数据时使用了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或其他名称。我个人发现,通过将这类汇编程序指令和此类内容与实际的机器语言指令分离开来,您会发现代码更加清晰易懂,并且更易于维护。大时间的方式更多。 (只是我的建议。)

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

    关于assembly - x86组装设备vs =,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28948274/

    相关文章:

    c - 在变量前使用移位运算符(<<)在C中意味着什么?

    c++ - 别名 const 重载函数的返回类型

    需要 C++ 静态方法

    C++ 浮点加法(从头开始): Negative results cannot be computed

    assembly - 调试平面汇编二进制文件

    assembly - 常规使用 r10 和 r11 的可接受性

    c++ - C++ 中的 "-->"运算符是什么?

    Python *list* "in"运算符 : equality, 哈希检查,还是身份?

    javascript - 维护: Assigning numbers to constants

    assembly - DOSBox - 该程序无法在 dos 模式下运行(汇编)