【问题标题】:x86 Intel Assembly -- Are these two statements equivalent?x86 Intel Assembly——这两个语句是否等效?
【发布时间】:2011-10-11 05:42:43
【问题描述】:

这里有一个非常简单的问题...我正试图围绕汇编程序来思考这些操作是否等效:

mov [ebx], 5

lea esi, ebx
mov esi, 5

谢谢!

【问题讨论】:

    标签: assembly x86 intel


    【解决方案1】:

    没有。 mov [ebx], 5 将值 5 放入 ebx 指向的地址中(至少这是它应该做什么的一般想法。MASM 一方面会拒绝它,因为它不知道你想要什么大小的目的地,所以你需要mov byte ptr [ebx], 5,或mov word ptr [ebx], 5等)

    第二个将 ebx 复制到 esi,然后将 5 复制到 esi。它不会(甚至试图)将任何东西移入内存。您(显然)正在寻找的内容更像是:

    lea esi, ebx
    mov [esi], 5
    

    同样,您会遇到同样的事情:您需要指定 byte ptrword ptr 或其他任何内容。另请注意,在这种情况下,使用lea 是相当浪费的——您正在执行与mov esi, ebx 完全相同的操作。当您想要进行更复杂的地址计算时,通常只使用lea,例如:lea esi, ebx*4+ebp

    【讨论】:

    • +1 删除了我的答案,尽管我认为您在lea 指令中仍然缺少[ebx]
    • @user786653:可能有 some 汇编程序需要 lea 的括号(其中一个 MASM 可能允许但忽略它们)但它们不是通常需要。
    • 好吧,我只能谈谈我经常使用的汇编程序 NASM(需要它)和 GAS(在 AT&T 模式下需要它(lea (%ebx), %esi 而不是lea %ebx, %esi)以及.intel_syntax与 NASM 相同)。
    • @user786653:多么奇怪——我几乎可以肯定我记得几年前与 NASM 的一位开发人员的对话,他说它只在将要使用括号时才使用对内存的引用。
    • 好吧,lea 确实引用了内存 Vol. 2A 3-579,不过它不会进行任何取消引用。因此,为什么它经常用于实际上不涉及内存引用的简单算术计算,例如lea eax, [eax+eax*2]eax *= 3
    【解决方案2】:

    你可以的

    lea esi, [ebx]
    mov [esi], 5
    

    这将等于你的第一个 sn-p。

    【讨论】:

    • 谢谢!出于好奇,“lea esi, ebx”会做什么?
    • 正如在其他回复中已经指出的那样,没有 lea esi, ebi 这样的东西。 lea itslef 将(l)加载(e)有效(a)地址,即您需要提供地址参数而不仅仅是注册。因此[ebx].
    • 查看LEAstackoverflow.com/questions/1658294/…的详细信息
    【解决方案3】:

    不,它们不是,mov [ebx], 5 将 5 移动到ebx 中指定的内存位置,而

    lea esi, ebx
    mov esi, 5
    

    计算内存地址到esi(在这种情况下,它只是将ebx复制到esi),然后将5移动到esi,而不是写入内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 2018-01-21
      相关资源
      最近更新 更多