【问题标题】:Assembly --> invalid combination of opcode and operands [closed]汇编->操作码和操作数的无效组合[关闭]
【发布时间】:2022-01-11 06:34:04
【问题描述】:

我有一个名为 char 的变量,当我按下该键时,它应该将他的值更改为键盘键。我访问了How to change the value of a variable in assembly,它说我使用mov char, key_value。问题是我得到了terminal.asm:126: error: invalid combination of opcode and operands 。在网上搜索解决方案我看到有必要放括号[]。我试过了,同样的错误发生了。

这是我文件的一部分:

printChar:

    mov edx, char;

    loop5_terminal:
    mov al, [edx];
    mov byte [edi], al;
    inc edi;
    inc edi;
    inc edx;
    inc ebx
    call cursor_terminal
    cmp byte[edx],0;
    jne loop5_terminal;

    jne l2_terminal
l2_terminal:

    cmp al , 0x03      ; Checks for key 2 input

    mov char, [two]
    je printChar
    

谢谢。

【问题讨论】:

  • 在大多数汇编方言中,您不需要以分号结束一行。前导分号仅表示注释的开始。
  • 这不是一个完整的例子。特别是,它不包括chartwo的定义,这是我们提供帮助所必需的。
  • 错误发生在哪一行?显示您的完整代码。
  • 在链接的问题或答案中,我没有看到任何使用 mov char, key_value 的建议。 (这是一件好事,因为除非 char 被定义为扩展为不同文本的宏,例如寄存器名称或包括方括号的寻址模式,否则这是无效的。因为 mov char, whatever 就像 123 = foo在 C 中,尝试分配给常量。)

标签: assembly x86 nasm


【解决方案1】:

您得到的错误很可能是由于该行

mov char, [two]

其中包含两个内存操作数,即chartwo。这是不可能的,因为 x86 架构不支持在一条指令中使用两个内存操作数。

您必须将该“指令”拆分为两个单独的(有效)指令,例如

mov al, BYTE [two]
mov BYTE [char], al

如果您使用 BYTE 大小的指令。

【讨论】:

  • 至少,如果 OP 的意思是 mov [char], [two]- mov char, [two] 是无效的语法,因为 char 是一个常量内存地址。
  • 如果char 是一个常数,那么指令mov char, [two] 将是不可能的,因为将值移动到常数是没有意义的。
  • 我猜two 是一个常数,但这就是为什么我在写答案之前要求提供更多信息。
  • 除非char%define 宏,用于[edx][symbol],否则char 不是内存操作数;它是 NASM 语法中的立即数。 (所以你绝对不能mov to 它,即使有注册源)。如果两个内存操作数都有[],问题将是两个内存操作数。
  • 因为我的回答显然没有涵盖在回答这个问题时需要解决的所有方面,所以我把它留在这里直到明天作为某人编写完整的基础(阅读更好) 回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2015-07-31
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
相关资源
最近更新 更多