Assembly 汇编乘法/除法菜单
我对汇编编程非常陌生,主要是想学习youtube视频和“x86处理器汇编语言”pdf。这个程序现在已经快完成了,但我已经发现了3个错误,我想不出来Assembly 汇编乘法/除法菜单,assembly,x86,masm,dos,Assembly,X86,Masm,Dos,我对汇编编程非常陌生,主要是想学习youtube视频和“x86处理器汇编语言”pdf。这个程序现在已经快完成了,但我已经发现了3个错误,我想不出来 文件中的无效字符(第1行) 无效的指令操作数(第27、46、26行) 符号类型冲突(第15行) 最后,我想将输入范围限制在1-100,我也希望得到有关如何做到这一点的任何提示,任何帮助都将不胜感激我无法在这里重现错误1)和3)。也许他们是因为抄袭而“消失”了。删除源中的行并再次键入 “错误A2070:指令操作数无效”: 1) 第27行和第26行:
最后,我想将输入范围限制在1-100,我也希望得到有关如何做到这一点的任何提示,任何帮助都将不胜感激我无法在这里重现错误1)和3)。也许他们是因为抄袭而“消失”了。删除源中的行并再次键入 “错误A2070:指令操作数无效”: 1) 第27行和第26行:
mov ah, seg message2
mov ds, ah
段是一个16位的值。无法将其加载到8位寄存器(AH
)中。此外,不能将8位寄存器(AH
)复制到16位寄存器(DS
)。将行更改为:
mov ax, seg message2
mov ds, ax
movzx ax, cl ;preform division
div dl
2) 第46行:
mov ax, cl ;preform division
div dl
不能将8位寄存器(CL
)复制到16位寄存器(AX
)。有专门的指令来执行这样的操作:MOVZX
&MOVSX
。第一条指令将8位寄存器视为无符号整数,第二条指令视为有符号整数。将行更改为:
mov ax, seg message2
mov ds, ax
movzx ax, cl ;preform division
div dl
“古老”的8086方法是:
xor ch, ch ; set CH (the upper part of CX) to null
mov ax, cx ;preform division
div dl
删除尝试从
消息
获取段的行。在代码顶部,您可以使用mov ax,@data
mov DS,ax
设置DS一次。不允许使用mov ax,cl
行。CL是一个8位寄存器,AX是一个16位寄存器。当我现在使用“@data”时,它会在带有“@data”的行上给我一个新的错误“undefined symbol:Dgroup”。我错过了什么?我需要使用IsDefined吗?你用什么来组装这个?你的链接器是什么?听起来你的链接器可能不懂16位。我正在使用Microsoft visual studio。我打开了一个win32项目,构建自定义设置为masmGod,我觉得很傻。谢谢你的帮助,我在计划这件事时曾考虑过使用movzx或movsx,但我完全忘记了。@rkhb我明白了。我已经删除了注释。如果您要使用xor zero,请执行xor ax,ax
/mov al,cl
。这将比归零ch
然后读取cx
更有效。它的代码大小相同,应该在real 8086上执行相同的操作。(在现代CPU上,在写入al
之前对eax
进行异或调零要比只对ax
进行调零要好得多。)