比较2号,应该相等,但返回!=

时间:2013-12-14 09:46:09

标签: assembly

当用户输入1/2/3/4时,它显示错误
我的“下一行”已经初始为宏 样本输出:
你的选择:1
请输入1或2或3或4!(1/2/3/4)
你的选择:2
请输入1或2或3或4!(1/2/3/4)
你的选择:3
请输入1或2或3或4!(1/2/3/4)
你的选择:4
请输入1或2或3或4!(1/2/3/4)
你的选择:

dischoice:  
mov ah,09h
lea dx,msg14
int 21h ;display ur choice
xor al,al
mov ah,01h
int 21h
mov ah,1
mov bh,2
mov ch,3
mov dh,4
cmp al,ah
je ok
cmp al,bh
je ok
cmp al,ch
je ok
cmp al,dh
je ok
;jmp ok
jmp notok
notok:
nextline
mov ah,09h
lea dx,msg23;display error
int 21h
nextline
jmp dischoice

ok:
sub al,30h
mov cho,al
nextline

2 个答案:

答案 0 :(得分:2)

您应该与'1'..'4'进行比较,而不是1..4。如下所示:

cmp al,'1'
je ok
cmp al,'2'
je ok
; ... and so on ...

由于您对所有被视为“正常”的数字采取了相同的操作,因此可以简化为:

cmp al,'1'
jb notok   ; if al < '1' goto notok
cmp al,'4'
jbe ok     ; if al >= '1' and al <= '4' goto ok
notok:

此外,这种跳跃毫无意义,应该删除:

jmp notok
notok:

答案 1 :(得分:0)

int 21h看起来像...... MS DOS?很久以前就不太了解了,但很久以前啊01h会从stdin读取,我很确定它会读取ASCII值'1'(31h)而不是1。

所以请尝试这些:

mov ah,31h
mov bh,32h
mov ch,33h
mov dh,34h

或者更好的是,只需直接执行cmp而不是将其存储在寄存器中:

cmp al,31h
je ok
cmp al,32h
je ok
cmp al,33h
je ok
cmp al,34h
je ok