(50)参数错误:MOV CX,DATO (50)操作数不匹配:16位寄存器和8位地址
这个代码
DATO DB ?,'$'
DATO1 DB ?,'$'
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
START:
LEA DX,CAD
MOV AH,9
INT 21H
CALCULO:
LEA DX,CAD1
MOV AH,9
INT 21H
MOV AH,1
INT 21H
MOV DATO,AL
ADD AL,30
CMP AL,'0'
JNGE MENSAJE
CMP AL,'9'
JNG MENSAJE
CMP AL,'A'
JNGE CONTINUE
CMP AL,'Z'
JNG CONTINUE
MENSAJE:
LEA DX,CAD3
MOV AH,9
INT 21H
JMP CALCULO
CONTINUE:
LOOP:
MOV CX,DATO
ADD DATO,DATO
DEC CX
JNZ LOOP
答案 0 :(得分:1)
错误消息不言自明:指令mov cx, DATO
中操作数的大小不匹配。 CX
是一个16位寄存器,而您将DATO
定义为8位值(使用DB
指令 - d eclare b < / em>的YTE)。
另外,我猜你可能正在使用像MASM或TASM这样的代码来组装这段代码,这种代码对于允许取消引用内存的语法非常宽容。由于您要移动DATO
的值而不是地址,因此 应将其放在括号中。编写指令的正确方法是:
mov cx, BYTE PTR [DATO]
......然后问题显而易见。
解决这个问题的一种方法是将DATO
移到8位寄存器中:
mov cl, BYTE PTR [DATO]
然后,您需要调整周围的代码,以便它使用CL
寄存器。特别是,您应该dec cl
。
或者,如果您定位到386或更高版本,则可以使用零扩展进行移动:
movzx cx, BYTE PTR [DATO]
然后,您根本不需要修改代码。
但是你会立即遇到另一个问题。这条指令:
ADD DATO,DATO
是不可能的。一条指令中不能有两个内存操作数。您需要使用寄存器作为中间件。所以代码需要看起来像:
Loop:
mov cl, BYTE PTR [DATO]
mov al, cl
add al, al
mov BYTE PTR [DATO], al
dec cl
jnz Loop
请注意,这会破坏AL (or
AX`)注册。如果您需要保留该值,可以使用不同的寄存器作为&#34; scratch&#34;注册
最后,问问自己cl
为零时会发生什么。 jnz
分支不会被采取,因此执行将落到......什么?糟糕。