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。