循环和减少计数器不工作组件



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

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

在循环中销毁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

提示:

比较输入的字符,是小写还是大写
大写字母和小写字母(在ascii中)完全相同,除了0x20位。您可以通过与0xDF(1101 1111二进制)"屏蔽"该位,并仅使用单个分支(而不是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

最新更新