x86汇编极新手查询:"invalid instruction operands"?

x86 assembly extreme novice inquiry: "invalid instruction operands"?

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

.data
inputLoopCounter BYTE -1

.code
mov   ecx,inputLoopCounter

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

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

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

Intel 语法汇编语言的另一种主要风格 (NASM),将愉快地 assemble 从 [inputLoopCounter] 加载 4B 的指令,而不管 inputLoopCounter是一个标签。

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


半相关:Confusing brackets in MASM32 - foo ptr [123] works as an alternative to ds:123 for indicating a memory operand, not an immediate, where insanely [123] would still be an immediate. Also related:


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

但显然 MASM 在数据部分支持它,所以你只能使用变量,除非你想切换 assemblers。