【问题标题】:Why these code is error: instruction operands must be the same size [duplicate]为什么这些代码是错误的:指令操作数必须是相同的大小[重复]
【发布时间】:2013-10-10 04:18:53
【问题描述】:

正如我所说:

这些代码:

mov     EBX, 0
mov     EBX, ofn.nFileOffset   
add     EAX, EBX                ;; error

得到错误:指令操作数的大小必须相同。

但是当我编辑时:

mov     EBX, 0
mov     BX, ofn.nFileOffset   
add     EAX, EBX   

没关系。 我还测试了 Ollydbg 以跟踪寄存器,但我没有看到任何不同。

谁能解释一下

【问题讨论】:

  • 添加 eax,ebx 不是错误所在,而是它上面的那一行。 ofn.nFileOffset 是 2 个字节(字),这就是为什么你可以将其移入 bx,移入 ebx,将 mov 更改为 movzx
  • 啊,它是 MASM,它的语法很奇怪......不要使用它。 :)
  • xor ebx, ebx 等价于mov ebx, 0 并节省三个字节。清除寄存器时使用第一种形式。
  • @johnfound 我看不出有多么奇怪的语法涉及试图直接将显然是 16 位的东西移动到 32 位寄存器的非法操作???
  • @Gunner:谢谢,但是当我签入 Ollydbg 时,我想如果使用 MOV EBX,ofn.nFileOffset,它会自动将零位扩展为完整的 EBX。而MOVZX也是如此。有什么不同???

标签: winapi assembly x86


【解决方案1】:

ofn.nFileOffset 为 2 个字节。

和 mov 指令要求 2 个参数的大小相同。

【讨论】:

    【解决方案2】:

    你应该试试:

    xor     EBX, EBX
    mov     BX, ofn.nFileOffset   
    add     EAX, EBX
    

    现在您将在EBX 中拥有ofn.nFileOffset

    【讨论】:

    • 使用movzx ebx, ofn.nFileOffset 而不是用两条指令模拟它。 (您可以使用movzx ebx, word ptr [ofn.nFileOffset] 明确大小。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多