鸸鹋8086密码验证

emu 8086 password verfication

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

the program just exits after the password is verified and does not print it.

a. "Does not print it"

那是因为程序中没有实际打印密码的代码!

b. "just exits after the password is verified"

由于计算不准确,您的程序可能认为输入相同的密码不同!

mov ah,01h
int 21h
sub ax,30h
add p1,ax

当您请求一个字符时,DOS 将 return 它放在 AL 中。您一直使用 AX。在随后发生乘法的情况下,此错误会悄无声息地消失, 但是 对于第 3 个字符的输入,此错误可能会自行显示,因为 DOS(实现)可能 return 垃圾在 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

当密码应该匹配时运行的代码几乎总是跳转到 error 因为你将单个 character 输入的结果与您的密码的低字节 number 在 0-999 范围内。请记住,在 [bx] 处只有一个二进制值,当然不是文本字符串。

mov bx,[p]

这会带来 BX 中的密码内容。因此,将 BX 用于 cmp al, [bx].

中的寻址目的是没有意义的