【问题标题】:Assembly instruction mov组装说明 mov
【发布时间】:2012-11-11 19:57:50
【问题描述】:

我可以在汇编中做到这一点mov eax, [ax] 还是必须指定大小mov eax, dword [ax]

【问题讨论】:

  • 取决于汇编程序,那么,您使用的是哪个汇编程序?
  • 使用 Nasm,并在 32 位模式下工作

标签: assembly x86 32-bit mov


【解决方案1】:

[ax] 不是有效的 16 位寻址模式。将其更改为mov ebx, [bx] 即可。 ebx 决定了操作的大小,所以你不需要说dword。在 32 位模式下,[bx] 不太可能是“有用”地址,但它是“有效”代码。在 32 位模式下,mov al, [eax]mov ax, [eax]mov eax, [eax] 都有效,大小由目标寄存器的大小决定,但您可能想说“字节”、“字”或“ dword”为清楚起见。在这种(!)情况下,大小不必匹配。

FWIW,可以在 16 位代码中使用 32 位指令和 32 位寻址模式。整个地址需要在段限制内 - 通常为 64k - 但mov eax, [eax + ecx * 4] 是有效代码。 Nasm(或其他“称职的”汇编程序)将生成所需的“操作数大小覆盖前缀”和“地址大小覆盖前缀”(0x66 和 0x67)。

不要害怕尝试这些事情......虽然可能不清楚 Nasm 拒绝的原因,如果 Nasm 接受它并不意味着它会按照您的意愿行事......

【讨论】:

  • 那么漏洞问题是 [ax] 不是有效的 16 位寻址模式?
  • 对。无论如何,这就是“大部分”问题。
  • 我只是一直忘记有效的 16 位寻址模式是什么......哦,好吧
  • offset + base + index(全部可选),其中“base”寄存器是bxbpbp默认为ss:bp)和“index”寄存器是@987654334 @ 和 di。相当有限!在 32 位模式下,任何寄存器都可以是“base”,除esp 之外的任何寄存器都可以是“index”,并添加一个可选的“scale”(2、4 或 8)以乘以“index”。一旦我们从 32 位代码开始,我们就会忘记 16 位模式……很高兴!
【解决方案2】:

不,这些操作数不匹配。在可以访问 EAX 的 32 位系统上,您还必须使用相同的地址大小。

mov eax, [eax]

会将 EAX 中的指针替换为它指向的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多