Assembly “错误”;操作数不匹配:16位和8位寄存器;汇编语言

Assembly “错误”;操作数不匹配:16位和8位寄存器;汇编语言,assembly,Assembly,我正在尝试从用户输入一个数字,并打印出与该数字相等的星星 mov ah, 1h int 21h mov dl, '*' mov cx,al mov ah,2h l1: int 21h loop l1 但我得到了以下错误 (4) wrong parameters: MOV cx,al (4) operands do not match: 16 bit and 8 bit register 好问题 我的一点看法,特别是如果您对汇编语言不熟悉的话:注释将比其他任何东西都更好地帮助您调试代码

我正在尝试从用户输入一个数字,并打印出与该数字相等的星星

mov ah, 1h
int 21h
mov dl, '*'
mov cx,al
mov ah,2h

l1:
int 21h
loop l1
但我得到了以下错误

(4) wrong parameters: MOV  cx,al
(4) operands do not match: 16 bit and 8 bit register 
好问题

我的一点看法,特别是如果您对汇编语言不熟悉的话:注释将比其他任何东西都更好地帮助您调试代码

我已经拿了你的东西,添加了评论,还添加了一行代码(我希望)可以解决你的问题;这个

子Cx,Cx;我们真的只追求上半场

正如其他人提到的,您可以使用
Mov-Ch,0
指令或
Xor-Ch,Ch
,还有其他指令。减法的工作完全完成了,而且对读者来说是非常明显的;当你调试时,一切都会很有帮助

(异或Ch,Ch的内容可以追溯到很久以前;可以追溯到那条指令是使寄存器归零的最快方法的时候。这不再是真的。)

总之,汇编程序对你很生气,因为你告诉他把8位寄存器AL移到16位寄存器CX中。虽然这是可能的一些指示,后来来了,我严重怀疑这是你想要的

好的,在将整个Cx寄存器置零后,我将您的第4行更改为

Mov-Cl,Al;Cx现在是循环的计数器

这是你的东西,加了一行,换了一行

 ;------------------------------------------------------------------.
 ;                                                                  ;
 ;   Ms-Dos assembly language routine to print X Number of stars    ;
 ;                                                                  ;
 ;   On Entry:      Nothing                                         ;
 ;                                                                  ;
 ;   On Exit:       Nothing                                         ;
 ;                                                                  ;
 ;                  AX, CX, DX are all meaningless after this code  ;
 ;                                                                  ;
 ;                  Flags don't mean anything either                ;
 ;                                                                  ;
 ;   Scheme:        Get a single character input from the user      ;
 ;                                                                  ;
 ;                  Use that as the count                           ;
 ;                                                                  ;
 ;                  Print that many stars                           ;
 ;                                                                  ;
 ;                                                                  ;
 ;                                                                  ;
 ;------------------------------------------------------------------'


 Print_Stars: 

    Mov Ah, 1h              ; 1h means get one char 
    Int 21h                 ; Ms.Dos puts it into AL for us 

    Sub Cx,Cx               ; We're really only after the top half here 
    Mov Cl,Al               ; Cx is now the counter for our loop 

    Mov Dl, '*'             ; Ms.Dos wants the character in this reg 
    Mov Ah,2h               ; This will tell her to print that one char 

 The_Loop_1: 

    Int 21h                 ; Ms.Dos puts the character in DL on the screen 
    Loop The_Loop_1         ; And we repeat as often as the user wanted 
    : 
    : 
    :                       ;  (Whatever, whatever) 
    : 
    : 
    : 
到目前为止,一切顺利

此时,我相信您认为唯一的错误是第4行,
操作数不匹配:16位和8位寄存器

不,你面前还有一个烦恼;Ascii不是二进制的;不远

事实上,如果我正确计数,当你按键盘上的
7
时,你可能会在屏幕上看到55颗星。有什么好处

Ascii
“7”
实际上是
37h

这很容易解决,在Dos女士从用户的击键返回给您后,您从AL中减去30小时

这里有一个很早以前的老把戏,它对当时的作家(和调试器)很有用;看看今天它对你是否有用

可以通过减去Ascii字符
“0”
本身来调整该值。汇编程序足够聪明,知道你在做什么。看起来像这样

    Sub Al, '0'             ; Make ascii digit into real binary number
好的,把你的前两行改成前三行,然后看魔术

    Mov Ah, 1h              ; 1h means get one char 
    Int 21h                 ; Ms.Dos puts it into AL for us 
    Sub Al, '0'             ; Make ascii digit into real binary number

希望这有帮助。

关于此错误消息,您不了解的是什么?一个寄存器是16位,另一个是8位。你不能把一个的内容放进另一个。空间不够。使用不同的寄存器。或者先屏蔽前8位。如何屏蔽前8位?请告诉我!尝试使用| mov ch,0 | mov cl,al |。。。或者…|xor cx,cx | mov cl,al |。实际上这是一个从8位寄存器到16位寄存器的mov,因此有足够的空间:)您可以使用
movzx cx,al
…或者如果这是一个古董,您可以将“mov cx,al”替换为“cbw”(或者可能是一个“xor ah,ah”),“mov cx,ax”组合,因为您之后无论如何都会覆盖ah。