回 帖 发 新 帖 刷新版面

主题:Operand types do not match

我的代码简要:
DATASG       SEGMENT
    ........
COUNT    DB    0
    ........
DATASG       ENDS
;*******************************************
CODESG       SEGMENT
    ........
   MAIN PROC NEAR
  (完成一个COUNT累加的动作)
  MAIN  ENDP
;------------------------------- 
   INPUT PROC NEAR
   ..........
   [color=FF0000]MOV  CX,COUNT[/color]
   ..........
   [color=FF0000]MOV  BX,COUNT[/color]
   ..........
   INPUT  ENDP
;-------------------------------
  ..........

结果,就在两个红色的地方,报了如题的错误,不知道为什么,怎么改,求教达人,再拜(30分)

回复列表 (共7个回复)

沙发

改为MOV CL,COUNT
    MOV CH,0
    MOV BL,COUNT
    MOV BH,0
就可以了。

板凳

出错的原因是count的类型是db,与cx、bx寄存器的大小不一致,修改方法可以有两个:

一、

xor ch, ch
mov cl, count
xor bh, bh
mov bl, count

二、

如果基于386以上cpu编程(带有.386伪指令),这样改就行了:

movzx cx, count
movzx bx, count

3 楼

明白了,谢谢,再拜达人

4 楼

还想问下达人; 
那么,此时,我的计数存在CL中了,还能不能再用JCXZ来判断跳转了?
谢谢,再拜达人!

5 楼

当然能,只要cx为0,jcxz就跳转。

还有,jcxz和jecxz两者都很少用的,通常不使用它们来进行一般的跳转。这两条指令的设计初衷,是为了处理loop循环的,因为loop是先把cx减一判断cx是否为零然后继续循环,也就是先循环一次,某些情况下,如果进入loop循环前cx为零,loop就会变成循环65536次了,因此在进入loop前运行一条jcxz或jecxz指令可以比较方便地避免这个问题。loop的减一和判0顺序与rep相反。

6 楼

谢谢,那么,您的意思是,LOOP先减一,后判零;REP是先判零,后减一了?

7 楼

是的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册