Assembly编译报invalid combination of opcode and operands,mov赋值变量失败
错误原因排查
- 指令集规则冲突:x86架构的
mov指令原生不支持两个内存操作数同时作为源和目标,你写的mov char, [two]中char是内存变量、[two]也是内存地址取值,两个操作数都指向内存空间,属于指令不支持的操作数组合,这是编译报错的直接原因。 - 语法使用不规范:你需要明确汇编器的语法规则,以NASM为例,操作内存变量时需要加
[]标注内存寻址,修改为mov [char], [two]依然会报错,本质还是双内存操作数的问题,和是否加方括号无关。 - 逻辑顺序错误:
cmp al , 0x03之后你先执行了赋值操作再做je跳转,会导致无论按键是否匹配2键,赋值操作都会被执行,不符合功能预期。 - 冗余跳转逻辑问题:你在
jne loop5_terminal之后写的jne l2_terminal没有对应的cmp操作,此时标志位已经被之前的比较指令覆盖,这个跳转是无效的。
修复方案
你需要用通用寄存器作为中转完成内存变量之间的赋值,修正后的代码片段如下:
printChar: mov edx, char ; 若要取char的值需写为mov edx, [char],当前是取char的地址存入edx 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 l2_terminal: cmp al , 0x03 ; 检测是否为2键输入 jne skip_assign ; 按键不匹配则跳过赋值 mov al, [two] ; 先把two变量的值读入寄存器al mov [char], al ; 再把寄存器值写入char变量的内存地址 skip_assign: jmp printChar
额外检查项
- 如果
two是你定义的立即数常量,不需要加[],直接写mov byte [char], 对应键值即可 - 确认
char变量的定义长度是字节类型,和操作的al寄存器长度匹配,避免长度不匹配报错
内容的提问来源于stack exchange,提问作者Lixt
相关产品推荐
相关产品推荐

