mu 8086密码验证

时间:2018-10-30 11:39:48

标签: assembly user-input emu8086

我想制作一个程序,要求用户输入密码并要求确认。然后它将输入的值保存到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

1 个答案:

答案 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]中的目的是没有意义的。