与汇编语言中的比较和跳转相混淆?修复它的正确方法是什么?

时间:2014-07-29 08:36:32

标签: assembly x86

上面的一些代码............  我希望用户输入数字0或1来选择菜单,设置以下菜单和alacart 不知道为什么无法比较和正确跳转

    cmp bufi,0
    je set
    jne wronginput


    cmp bufi,1
    je ala
    jne wronginput

set:
    lea dx, setmeal      
    call endpar
    lea dx, dotline      
    call endpar
    lea dx, menusetA         
    call endpar
    lea dx, menusetB         
    call endpar
    lea dx, menusetC         
    call endpar

    jmp oder

alac:
    lea dx, setala   
    call endpar
    lea dx, pasta    
    call endpar
    lea dx, asian   
    call endpar


 wronginput:
    lea dx, promptwronginput
    call endpar
    lea dx, nextLine
    call endpar

endpar:
    mov ah, 9
    int 21h
    ret

请留下评论和建议 我很欣赏它

3 个答案:

答案 0 :(得分:1)

您不清楚如何填充bufi,但很可能是用户输入的字符,因此您需要进行测试字符 '0''1',而不是整数值 01。所以改变:

cmp bufi,0

为:

cmp bufi,'0'

同样改变:

cmp bufi,1

为:

cmp bufi,'1'

答案 1 :(得分:1)

正如其他人所说,您必须检查'0''1'的ASCII值,而不是值01

但是你有另一个问题。在腐蚀之后,你仍然有这个:

    cmp bufi,'0'
    je set
    jne wronginput

这意味着永远不会达到接下来的几行,因为如果bufi不是'0',则跳转到wronginput:而不检查'1'。删除第一个条件跳转到wronginput:并执行以下操作:

    cmp bufi,'0'
    je set
    cmp bufi,'1'
    je ala

    ; neither '0' nor '1', so wrong input
    jmp wronginput

set:

答案 2 :(得分:0)

用户输入是一个ASCII输入,这意味着你必须比较" bufi"使用该输入的十六进制表示... 0表示其30h,1表示31h,或者您可以简单地与字符“0”进行比较。或者' 1' 。

cmp bufi,30h  ; for 0

cmp bufi,31h ; for 1