我正在尝试从用户那里获取一个数字输入并打印等于该数字的星......
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
答案 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
希望这有帮助。