эму 8086 проверка пароля - PullRequest
       15

эму 8086 проверка пароля

0 голосов
/ 30 октября 2018

Я хочу сделать программу, которая просит пользователя ввести пароль и запросить подтверждение. Затем он сохраняет введенное значение в регистре bx и помещает 3 в цикл cx for.

Затем программа снова запросит у пользователя только что созданный пароль. Если пользователь вводит правильный пароль, программа должна напечатать пароль.

Однако в настоящее время программа завершает работу после проверки пароля и не печатает его. Что я делаю не так?

Это мой код:

.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 голосов
/ 02 ноября 2018

программа завершает работу после проверки пароля и не печатает его.

a."Не печатает"

Это потому, что в программе нет кода, который на самом деле печатает пароль!

b."просто выходит после проверки пароля"

Из-за неточностей вычислений ваша программа может подумать, что пароли отличаются, если входные данные идентичны!

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

Когда вы запрашиваете символ, DOS возвращает его в AL. Вы постоянно используете AX. В тех случаях, когда происходит последующее умножение, эта ошибка проходит молча, , но для ввода 3-го символа, эта ошибка может проявиться, поскольку 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

Код, который запускается, когда пароли должны совпадать, почти всегда будет переходить на ошибку , потому что вы сравниваете результат ввода одного символа с младшим байтом вашего пароля * число 1051 * в диапазоне 0-999. Помните, что в [bx] есть только двоичное значение и, конечно, не текстовая строка.

mov bx,[p]

Содержит содержимое пароля в BX. Поэтому нет смысла использовать BX для адресации, как в cmp al, [bx].

...