Assembly 汇编乘法/除法菜单

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行:

我对汇编编程非常陌生,主要是想学习youtube视频和“x86处理器汇编语言”pdf。这个程序现在已经快完成了,但我已经发现了3个错误,我想不出来

  • 文件中的无效字符(第1行)
  • 无效的指令操作数(第27、46、26行)
  • 符号类型冲突(第15行)


  • 最后,我想将输入范围限制在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
    进行调零要好得多。)