我想制作一个程序,要求用户输入密码并要求确认。然后它将输入的值保存到bx寄存器,并将3放入cx进行循环。
然后,程序将再次询问用户刚刚创建的密码。如果用户输入正确的密码,程序将打印密码。
但是,当前程序仅在验证密码后退出,并且不打印它。我在做什么错了?
到目前为止,这是我的代码:
.model small
.stack 100h
.data
msg db 10,13, 'please insert a new password$'
msg1 db 10,13, 'confirm the password$'
msg2 db 10,13,'password is not the same whith first one ,re enter it!$'
msg3 db 10,13,'password is verfied$'
p1 dw ?
p2 dw ?
a db 10
b db 100
m1 db 10,13,'this program is created by firoo , for use of password verfication:$'
m2 db 10,13,'please input the correct password to proced:$'
m3 db 10,13,'invalid password$'
m4 db 10,13,'the password is correct congra!$'
p dw ?
count dw 3
.code
main proc
mov ax,@data
mov ds,ax
mov dx,offset msg
mov ah,09h
int 21h
mov ah,01h
int 21h
sub ax,30h
mul b
mov p1,ax
mov ah,01h
int 21h
sub ax,30h
mul a
add p1,ax
mov ah,01h
int 21h
sub ax,30h
add p1,ax
mov bx,p1
add bx ,30h
mov p,bx
l1:mov dx,offset msg1
mov ah,09h
int 21h
mov ah,01h
int 21h
sub ax,30h
mul b
mov p2,ax
mov ah,01h
int 21h
sub ax,30h
mul a
add p2,ax
mov ah,01h
int 21h
sub ax,30h
add p2,ax
mov bx,p2
add bx,30h
cmp bx,p
jne notv
mov dx,offset msg3
mov ah,09h
int 21h
jmp l2
notv:
mov dx,offset msg2
mov ah,09h
int 21h
jmp over
l2:mov cx,count
mov bx,[p]
mov dx,offset m1
mov ah,09h
int 21h
mov dx,offset m2
mov ah,09h
int 21h
again: mov ah,08
int 21h
cmp al,[bx]
jne error
inc bx
loop again
mov dx,offset m4
mov ah,09h
int 21h
jmp over
error:mov dx,offset m3
mov ah,09h
int 21h
over:mov ah,4ch
int 21h
main endp
end main
答案 0 :(得分:1)
该程序仅在验证密码后退出并且不打印它。
a。“不打印”
那是因为程序中没有代码可以真正打印出密码!
b。“仅在验证密码后退出”
由于计算不准确,您的程序可能会认为输入相同的密码会有所不同!
mov ah,01h int 21h sub ax,30h add p1,ax
当您要求输入字符时,DOS将在AL
中返回它。您始终使用AX
。在随后发生乘法的情况下,此错误会悄悄地消失,但对于第三个字符的输入,此错误可以显示出来,因为DOS(实现)可能会在AH
中返回垃圾。
mov ah, 01h
int 21h
sub al, 30h <<<< AL
mul b
mov p1, ax
mov ah, 01h
int 21h
sub al, 30h <<<< AL
mul a
add p1, ax
mov ah, 01h
int 21h
sub al, 30h <<<< AL
cbw <<<< This clears AH
add p1, ax
mov bx, p1
add bx, 30h <<<< Why do you add this ?
此时,代码BX
中包含一个从0到999的数字。向其添加30h毫无意义!
对确认密码的输入进行相同的更正。
notv: mov dx,offset msg2 mov ah,09h int 21h jmp over <<<< ???
如果(确认)密码与第一个密码不同,您告诉用户重新输入密码,但是,然后您跳至程序出口!要重新输入,您需要跳到 l1 标签。
again: mov ah,08 int 21h cmp al,[bx] jne error inc bx loop again
密码匹配时运行的代码几乎总是跳到错误,因为您将单个字符输入的结果与密码的低字节进行了比较>数字,范围为0-999。请记住,[bx]
处只有一个二进制值,当然也没有文本字符串。
mov bx,[p]
这会将密码的内容带到BX
中。因此,使用BX
来解决cmp al, [bx]
中的目的是没有意义的。