【问题标题】:x86 assembly extreme novice inquiry: "invalid instruction operands"?x86汇编极限新手询问:“无效指令操作数”?
【发布时间】:2016-05-04 18:04:27
【问题描述】:

下面的代码只是我目前正在尝试编写的程序的一小部分,但程序的其他部分与此无关,所以我只粘贴了必要的部分。无论如何,我要做的是将 inputLoopCounter 中存储的值移动到 ecx 中,以确定循环应该执行多少次。但是,当我尝试组装这个程序时,我得到了问题标题中提到的错误。谁能解释一下这个原因?

.data
inputLoopCounter BYTE -1

.code
mov   ecx,inputLoopCounter

【问题讨论】:

  • 不是 x86 专家,但问题可能在于将“BYTE”放入需要 32 位值的寄存器中?也许只是加载cl。实际上,在从内存中加载时,可能需要使用括号 []。我会把它留给真正的专家,他们很快就会来到这里:)
  • 或者movsx ecx, byte ptr [inputLoopCounter],如果你真的希望你的变量是一个字节,但仍然想将它加载到一个双字寄存器中。
  • @Michael 如果它不是绝对必要的字节,我是否可以将 BYTE 更改为 DWORD 以使其工作?编辑:谢谢 Jose Manuel Abarca Rodriguez,您回答了我的问题。这是一个非常业余的错误。
  • @JoseManuelAbarcaRodríguez 当然,为什么不呢。

标签: assembly x86 masm32


【解决方案1】:

一种可能的解决方案是将inputLoopCounter BYTE -1 替换为inputLoopCounter DWORD -1

【讨论】:

    【解决方案2】:

    在 MASM 中,foo BYTE -1 被视为声明具有固定大小的“变量”。稍后使用该符号意味着访问它的指令的操作数大小。

    因此,MASM 试图将您从自己手中拯救出来,阻止您从 1 字节变量执行 dword(4 字节)加载。即使您有多个字节也会发生这种情况,例如 foo db "foobar"want 加载多个字符;这时候mov eax, dword ptr [foo] 就派上用场了。

    英特尔语法汇编语言 (NASM) 的另一种主要风格,会很高兴地汇编一条从 [inputLoopCounter] 加载 4B 的指令,而不管 inputLoopCounter 是什么标签。

    在 NASM 中,mov [inputLoopCounter], 0 是语法错误,因为两个操作数都没有隐含的操作数大小。 (在 MASM 中,它将是 mov byte ptr [inputLoopCounter], 0。)


    半相关:Confusing brackets in MASM32 - foo ptr [123] 可替代 ds:123 用于指示内存操作数,而不是立即数,其中疯狂的 [123] 仍然是立即数。也相关:Assembly difference between [var], and var


    如果 MASM 允许在数据部分中使用它,foo: db ... 将只声明一个没有隐含大小的标签,与任何数据声明分开。

    但显然 MASM 在数据部分支持这一点,所以除非你想切换汇编程序,否则你会被变量困住。 How to store 4 characters in a define doubleword in assembly language?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2015-06-29
      • 1970-01-01
      相关资源
      最近更新 更多