错误"操作数不匹配:16位和8位寄存器"用汇编语言

时间:2014-06-17 22:22:25

标签: 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 

1 个答案:

答案 0 :(得分:0)

好的问题。

我的意见不大,特别是如果您不熟悉汇编语言:这些评论将帮助您更好地调试代码。

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

Sub Cx,Cx ; We're really only after the top half here

正如其他人所提到的,您可以使用Mov Ch, 0指令或Xor Ch, Ch,还有其他指令。减法的东西完全完成了工作,对读者来说非常明显;当你进行调试时,它会帮助你解决所有问题。

Xor Ch, Ch的东西会回来;回过头来;到那个指令是最快的方式使寄存器为零。这不再是真的。)

所以无论如何,汇编程序对你很生气,因为你告诉他将一个8位寄存器AL移入一个16位寄存器CX。虽然可以通过稍后出现的一些说明来实现,但我非常怀疑这是你想要的。

好的,所以,在将完整的Cx寄存器设为零后,我将第4行更改为此...

Mov Cl,Al ; Cx is now the counter for our loop

这里有你的东西,另外一行和另一行改变

 ;------------------------------------------------------------------.
 ;                                                                  ;
 ;   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行,operands do not match: 16 bit and 8 bit register

不,你面前还有一个烦恼; Ascii不是Binary;不是一个长镜头

事实上,如果我正确计数,当您按下键盘上的7时,您可能会在屏幕上看到类似55星的内容。是什么给了什么?

Ascii "7"实际上是37h

这很容易修复,在女士用户用户的按键返回给你后,你从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

希望这有帮助。