【问题标题】:ADD instruction or plus sign?ADD 指令还是加号?
【发布时间】:2015-02-24 18:49:43
【问题描述】:

非常简单的问题,但我没有找到好的答案,所以我在这里问。
我看到有时我们使用 ADD 指令进行加法,有时我看到使用加号 (+)。
请看以下内容:

mov eax,[esi + TYPE DWORD]

嗯,我知道要添加数字,我应该使用 ADD 指令,但它似乎像这样工作。
我认为应该这样做:

add esi, TYPE DWORD
mov eax,[esi]
sub esi, TYPE DWORD

我的意思是,计算机如何在不执行添加指令的情况下访问内存地址esi + TYPE DWORD?好奇怪...

非常感谢您的阅读(:

【问题讨论】:

  • CISC?
  • 不要陷入思考1助记符=1指令=1循环的陷阱。
  • @OllieFord 它一条指令,如果它是 lea 它将是一个单周期指令
  • @OllieFord 那么第二个代码(带有 ADD 和 SUB)是处理器真正执行的代码吗?
  • 没有。它会将esi 的值和4(dword 类型为4)通过加法器。它不需要指令,只是一个加法器。就像它不执行add eip, instruction_length 一样。不可能一直是乌龟,在某些时候它只是硅电路。

标签: assembly x86 masm


【解决方案1】:

首先,它们被编码为两种不同的东西 - ADD 是一条指令,将带有完整的操作码,而 + 将由您的汇编程序翻译成它所附加的主要指令的引用模式到(在这种情况下为MOV)。

然而主要区别在于第一个将由内存单元(或更准确地说 - 地址生成单元)执行,在加载执行之上不消耗任何额外的仲裁,而后者将在 ALU 上执行,并相应地消耗所需的资源(取决于微架构,但在您的示例中,在任何现代无序 CPU 上,至少需要几个队列条目、解码槽、调度槽、端口等。) .

从这个意义上说,第一个通常“更便宜”,这就是为什么它经常用于没有内存引用的普通算术运算,通过使用 LEA 指令,正如 Harold 指出的那样。

【讨论】:

    【解决方案2】:

    为了更通用一点,您在第一个示例中看到的是寻址模式的一部分,而不是操作码。

    地址寄存器的最简单形式只是指向您感兴趣的内容(基地址)的指针

    [bx]
    

    如果您正在查看数组或结构,则必须调整基址寄存器才能查看其他内容。随着时间的推移,寻址变得更加灵活。你可以有一个基础和一个索引:

    [ebx+eax]    ; add 2 registers to get the pointers - array + index
    

    现在,如果您有一个字节数组,您可以保留基数并调整索引。如果您正在查看 2、4 或 8 个字节,您可以根据目标的大小调整索引:

    [ebx+eax*2]   ; 2 byte target, array + (index*2)
    

    现在,如果您正在查看 c 样式的结构,那么您也可以在结果地址中添加位移:

    [ebx+eax*2+16]
    

    这些在编译时被编码到指令中,而不是变成汇编指令。熟悉寻址模式 - 如果您为正确的解决方案使用正确的模式,它们将为您节省大量时间。

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 2019-04-08
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多