(48)错误参数:MOV CX,DATO(48)操作数不匹配:16位寄存器和8位地址

时间:2017-06-11 02:59:28

标签: assembly x86

(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

1 个答案:

答案 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分支不会被采取,因此执行将落到......什么?糟糕。