【问题标题】:x86 assembly equ vs =x86 汇编 equ vs =
【发布时间】:2015-05-10 23:30:05
【问题描述】:

我正在学习 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= 的手册。 TL;DR:EQU 可以定义常量数字或可重新分配的文本,= 可以定义可重新分配的数字。
  • 好吧,那么如果我声明 a = 1 或 b equ 1,它们都是 32 位数据类型(DWORD)吗?
  • 不,它们将具有价值1。数据类型取决于您使用它们的位置和方式。
  • 哦,好吧,现在说得通了。谢谢。

标签: assembly operators constants masm


【解决方案1】:

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

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...

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

好问题,一个让我自己困惑数周的问题。

【讨论】:

    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 2020-10-24
    • 2011-02-08
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多