【问题标题】:assembly code:understanding the lea command汇编代码:理解 lea 命令
【发布时间】:2013-06-11 16:48:54
【问题描述】:

我找到了这段代码:

lea 0x10(%edi),%esi
mov %esi,0x4(%edi)

但我真的不明白这个组合。

  1. lea 命令的堆栈上究竟发生了什么。
  2. 写:mov 0x10(%edi),0x4(edi%) 不是更简单吗?

【问题讨论】:

    标签: assembly x86 addressing-mode


    【解决方案1】:
    1. 堆栈没有任何反应。
    2. 可能是这样,但这不是一个有效的指令。 mov 最多支持一个内存操作数。无论如何,您的示例似乎具有不同的语义(如下面的@zch 所述)。

    您可以获取Intel Software Developers Manuals 的副本并阅读您想要的所有内容。

    编辑:关于您的问题“%esi 中写入了什么值?lea 是计算偏移量?哪个地址的?”

    esi 得到edi + 0x10;这就是0x10(%edi) 的意思。 lea 代表“加载有效地址”。也就是说,它将edi解释为一个指针,并将其递增0x10,将结果存储在esi中。

    【讨论】:

    • 这也意味着不同的事情。写入价值,而不是地址。
    • 2.我明白了,谢谢。但是 1. %esi 中写的是什么值? lea 是计算偏移量吗?哪个地址?
    • 啊,等等。简单地将 0x10 写入 %esi 是否只是一种棘手的方法?
    • 不完全。它将edi + 0x10 写入esi。我链接到的文档包含您需要了解的所有内容(除了可能将 intel 语法转换为 at&t 语法)。
    【解决方案2】:

    在 x86 汇编中使用 leamov 是一样的,在 C/C++ 中,说:

    char *ptr;
    ...
    ptr = &val;
    

    对比

    char *ptr;
    ...
    *ptr = val;
    

    lea 计算地址,mov(或其他带有内存操作数的指令)取消引用(访问)它。

    所以lea 在 x86 汇编中执行 C/C++ 中所谓的“指针算术” - 不涉及内存访问。

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多