【问题标题】:Difference between memory and register内存和寄存器的区别
【发布时间】:2014-06-07 19:12:55
【问题描述】:

我看到像这样的汇编代码,

MOV [EAX], EBX

上面一行,提到[EAX]是内存,EBX是寄存器。那么,[EAX]EBX 之间有什么区别。上面的指令会发生什么。

【问题讨论】:

    标签: memory assembly cpu-registers instructions mov


    【解决方案1】:

    在此语法中,寄存器周围的括号表示使用内存位置(根据指令作为源或目标),并在寄存器中指定起始地址(在您的情况下为 EAX)。例如,如果 EAX 在指令之前包含 1344,则将 EBX 中的值复制到逻辑内存地址 1344-1347(因为这是 4 字节复制)。

    我希望这足以让您在脑海中解开它们:) 并且请注意更复杂的情况是可能的(例如,MOV [EAX+ECX],EBX 将目标地址形成为两个寄存器值的总和)。

    【讨论】:

      【解决方案2】:

      假设内存中从地址 0x1000 开始的前 16 个字节包含以下内容:

      0x1000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
      

      现在假设EAX 包含 0x1002(只是一个示例;不要尝试在实际代码中写入任意地址),EBX 包含 0x12345678。

      MOV [EAX],EBX 会将EBX 的值(即32 位== 4 字节)写入内存,从EAX 中包含的地址开始,因此之后的内存将如下所示:

      0x1000: 00 01 78 56 34 12 06 07 08 09 0A 0B 0C 0D 0E 0F
      

      注意字节的写入顺序。这是因为 x86 处理器是 little-endian。

      如果您已经完成了MOV EAX,EBX,您将把值 0x12345678 复制到寄存器 EAX 并保持 0x1002 处的内存不变。

      【讨论】:

      • 我怀疑将 0x1003 中的值更改为 0x1005。为什么它会改变?根据,汇编代码在变化吗?
      • 因为EBX 是 32 位(4 字节)。
      猜你喜欢
      • 2017-07-15
      • 2012-01-28
      • 2021-11-17
      • 2012-02-10
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多