循环和减少计数器不工作 - 装配

时间:2016-10-19 06:02:46

标签: loops assembly

我是汇编语言的新手,并被要求有一个程序,在输入密码时只允许三次错误机会。

s:
    main proc
    mov ax, @data
    mov ds, ax
    mov cx, 3

again:
    mov ah, 9 
    lea dx, a
    int 21h
    mov ah, 2
    mov dl, '*'
    int 21h
    mov ah, 8
    int 21h
    mov bl, al
    mov ah, 2
    cmp bl, 'Y'
    je second
    cmp bl, 'y'
    je second
    jne iinvalid

second:
    mov ah, 2
    mov dl, '*'
    int 21h
    mov ah, 8
    int 21h
    mov bh, al
    mov ah, 2
    cmp bh, 'E'
    je third
    cmp bh, 'e'
    je third
    jne iinvalid

third:
    mov ah, 2
    mov dl, '*'
    int 21h
    mov ah, 8
    int 21h
    mov cl, al
    mov ah, 2
    cmp cl, 'S'
    je welcome
    cmp cl, 's'
    je welcome
    jne iinvalid

iinvalid: 
jmp invalid

checking:
        mov ah, 9
        lea dx, i
        int 21h
        jmp exit

togo:
    loop again

welcome:
        mov ah,9
        lea dx, c
        int 21h
        lea dx, d
        int 21h
        mov ah, 1
        int 21h
        mov bl, al

            newp:
                mov ah, 9
                lea dx, i
                int 21h
                jmp exit

invalid: 
        mov ah, 9
        lea dx, b
        int 21h
        mov ah, 1
        int 21h
        mov cl, al
        cmp cl, 'Y'
        je togo
        cmp cl, 'y'
        je togo
        jne exit

exit:
       mov ah, 4ch
       int 21h
       main endp
       end s

1 个答案:

答案 0 :(得分:0)

你破坏了循环中cx的内容。 最简单的解决方法:

    mov cx, 3

again:
    push cx                   ; save loop cnt on stack
    mov ah, 9 
    ...

togo:
    pop cx                    ; restore cnt from stack
    loop again

请记住,如果你跳出循环,仍然必须从堆栈中删除cx

welcome:
    pop cx                   ; purge cnt from stack
    mov ah,9

只是一个提示:

您将输入的字符比较为小写或大写
除了位0x20之外,大写和小写字符(在ascii中)相同。你可以用一个带有0xDF(1101 1111二进制)的AND“掩盖”这个位,并用一个分支(而不是3)来检查字符:

cmp bl, 'Y'
je second
cmp bl, 'y'
je second
jne iinvalid

--->

and bl, 0xdf           ; make lowercase to uppercase
cmp bl, 'Y'            ; THEN here both 'y' and 'Y' match
jne iinvalid