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。
下面的代码只是我目前正在尝试编写的程序的一小部分,但与程序的其他部分无关,所以我只粘贴了必要的部分。无论如何,我想要做的是将存储在 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。