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