Assembly 添加两个寄存器时操作码和操作数的组合无效

Assembly 添加两个寄存器时操作码和操作数的组合无效,assembly,x86,nasm,Assembly,X86,Nasm,我正在编写一段汇编代码,设计用于使用BIOS中断获取键盘输入,然后使用另一个BIOS中断将其打印到屏幕上。我正在为x86系统使用NASM编译器。在我代码的第19行(用星号(*)标记),我得到了“操作码和操作数的无效组合”错误。我知道这通常表示任意数量的语法错误,但就我的技能水平而言,我无法深入到任何细节,抱歉。这是我的代码块: ; --------------------------------------------- ;获取输入(永远挂起输入和循环) ; -----------------

我正在编写一段汇编代码,设计用于使用BIOS中断获取键盘输入,然后使用另一个BIOS中断将其打印到屏幕上。我正在为x86系统使用NASM编译器。在我代码的第19行(用星号(*)标记),我得到了“操作码和操作数的无效组合”错误。我知道这通常表示任意数量的语法错误,但就我的技能水平而言,我无法深入到任何细节,抱歉。这是我的代码块:


; ---------------------------------------------
;获取输入(永远挂起输入和循环)
; ---------------------------------------------
获取输入:

XOR AH,AH;对于中断16.0,AH=0 INT 0x16;获取按下的下一个键。 MOV SI,键映射;将SI设置为键映射的头指针 添加SI,AH;按键号增加指针。 *MOV AL,[SI];加载返回的密钥以进行打印。 调用PrintCharacter;打印密钥 调用GetInput;等待下一个键。 RET


如果您需要更多信息,请告诉我,谢谢!

我相信您的错误就在一行之前。 您不能在x86中混合使用16位和8位寄存器,例如:

ADD SI, AH
如果要将AH寄存器添加到SI,请先将AH复制(零扩展)到AX,如:

MOVZX AX, AH
ADD   SI, AX

我相信你的错误就在一行之前。 您不能在x86中混合使用16位和8位寄存器,例如:

ADD SI, AH
如果要将AH寄存器添加到SI,请先将AH复制(零扩展)到AX,如:

MOVZX AX, AH
ADD   SI, AX

这显然是个问题。我在你的代码中用AX替换了EAX,因为我只使用16位汇编。不过,MOVZX在这两种情况下都应该正常工作,对吗?对不起,我太快了,没有测试代码。AX代替EAX是正确的!是的,MOVZX在这两种情况下都正常工作。这显然是个问题。我用AX替换了EAX在您的代码中,因为我只使用16位程序集。不过,MOVZX在这两种情况下都应该正常工作,对吗?对不起,我太快了,没有测试代码。AX而EAX是正确的!是的,MOVZX在这两种情况下都正常工作。