Выдать сообщение "Ok", если введенное имя и пароль совпадают с заданными - Assembler
Формулировка задачи:
Запросить вначале логин (имя пользователя, задать его в программе), а затем пароль. При вводе пароля не отображать вводимые символы. Выдать сообщение "Ok", если введенное имя и пароль совпадают с заданными. Выдать соответствующее сообщение при несовпадении логина/пароля/логина и пароля.
Код:
При вводе неправильного логина и правильного пароля выдает "Ок", хотя должна быть ошибка. И почему-то на одном компе не отображает символы, а на другом отображает. Заранее благодарен.
dseg segment
user_log db 17, ?, 'Your login'
std_log db 'student'
std_ln = $-std_log
user_pwd db 17, ?, 'Your password'
std_pwd db 'qwerty1' ; эталонный пароль
std_len = $-std_pwd ; его длина
err_mes1 db 13, 10, 'Wrong password$'
err_mes2 db 13, 10, 'Wrong login$'
err_mes3 db 13, 10, 'Wrong login and password$'
log_mes db 13, 10, 'Enter your login $'
pas_mes db 13, 10, 'Enter your password $'
ok_mes db 13, 10, 'OK$'
x dw 3
z db 3
y db 3
dseg ends
cseg segment
assume ds:dseg, cs:cseg
extrn writer:near
start:
mov ax, dseg
mov ds, ax ; подготовка сегментов данных
mov es, ax ; обе обрабатываемые строки находятся в одном сегменте
log:
mov ah, 9
lea dx, log_mes
int 21h
mov ah, 0ah ; буферизованный ввод строки
lea dx, user_log
int 21h ; сравнение строк
mov cx,6 ; число симолов для сравнения
lea si, std_log ; адреса сравниваемых
lea di, user_log+2 ; строк
cld ; направление обработки строк - вперед
repe cmpsb
jne wrong1
pas:
mov ah, 9
lea dx, pas_mes
int 21h
mov ah, 0ah ; буферизованный ввод строки
lea dx, user_pwd
int 21h ; сравнение строк
mov cx, 7 ; число симолов для сравнения
lea si, std_pwd ; адреса сравниваемых
lea di, user_pwd+2 ; строк
cld ; направление обработки строк - вперед
repe cmpsb
jne wrong2
ok:
mov ah, 9 ; если совпали - вывод сообщения
lea dx, ok_mes ; 'Верно' с новой строки
int 21h
jmp exit
;wrong3 :
; cmp y,0
; je error1
; jne ok
wrong1:
inc y
jmp pas
wrong2:
cmp y,0
jne error3
error2:
mov x, cx
dec x
mov ax, x
mov ah, 9
lea dx, err_mes1
int 21h
jmp log
error1:
mov x, cx
dec x
mov ax, x
mov ah, 9
lea dx, err_mes2
int 21h
jmp log
error3:
mov x, cx
dec x
mov ax, x
mov ah, 9
lea dx, err_mes3
int 21h
jmp log
exit:
mov ax, 4c00h
int 21h
cseg ends
end start
С сообщением разобрался, но как сделать, чтобы при вводе не отображался пароль?
Решение задачи: «Выдать сообщение "Ok", если введенное имя и пароль совпадают с заданными»
textual
Листинг программы
;fasm-code ;-------------------- org 100h jmp start m0 db 13,10,'Login: $' m1 db 13,10,'Pass : $' o db ' <- OK! $' e db 7,' <- ERROR! $' log db 'user' ; зашитый логин llen = $-log ; ..(его длина) pas db '12345' ; зашитый пасс plen = $-pas ; ..(просто подставляй свои значения) flag db 0 ; флаг ошибки ;//---- Ввод\Проверка логина ;//------------------------------- start: mov ah,9 ; mov dx,m0 ; int 21h ; mov bp,llen ; mov bx,log ; @00: mov ah,1 ; ввод символа с эхом int 21h ; cmp al,13 ; ..пока не Enter je @01 ; xor al,byte[bx] ; сразу проверяем его jz next ; совпало! inc [flag] ; иначе: флаг ошибки next: or bp,bp ; защита от переполнения jns ok1 ; ..(если длина больше) inc [flag] ; ok1: inc bx ; сл.байт dec bp ; jmp @00 ; мотаем до Enter'а... ;//---- Ввод\Проверка пароля (всё тоже-самое) ;//---------------------------------------------- @01: mov ah,9 ; mov dx,m1 ; int 21h ; mov bp,plen ; mov bx,pas ; @02: mov ah,8 ; только ввод без эха int 21h ; cmp al,13 ; je @rezz ; xor al,byte[bx] ; jz next2 ; inc [flag] ; next2: or bp,bp ; jns ok2 ; inc [flag] ; ok2: inc bx ; dec bp ; mov al,'*' ; звёздочки вместо пароля int 29h ; jmp @02 ; ;//---- Выводим результ ;//--------------------------------------- @rezz: mov ah,9 ; mov dx,o ; cmp [flag],0 ; ошибки были? je @prn ; нет! mov dx,e ; @prn: int 21h ; xor ax,ax ; пауза.. int 16h ; ret ; выход в DOS
Объяснение кода листинга программы
- Объявляются переменные:
m0- сообщение для ввода логинаm1- сообщение для ввода пароляo- сообщение об успешном вводеe- сообщение об ошибкеlog- зашитый логин (в данном случаеuser)llen- длина логина (user)pas- зашитый пароль (в данном случае12345)plen- длина пароля (12345)flag- флаг ошибки
- Ввод и проверка логина:
- Выводится сообщение
Login: - Вводится логин
- Каждый введенный символ проверяется на соответствие зашитому логину.
- Длина введенного логина сравнивается с длиной зашитого логина
- Если символы совпадают и длина верна, устанавливается флаг ошибки (если не совпадают, флаг ошибки увеличивается)
- Выводится сообщение
- Ввод и проверка пароля:
- Выводится сообщение
Pass: - Вводится пароль
- Каждый введенный символ проверяется на соответствие зашитому паролю.
- Длина введенного пароля сравнивается с длиной зашитого пароля
- Если символы совпадают и длина верна, устанавливается флаг ошибки (если не совпадают, флаг ошибки увеличивается)
- Пароль заменяется звёздочками
- Выводится сообщение
- Вывод результата:
- Если флаг ошибки равен 0 (ошибок не было), выводится сообщение
<- OK! - Если флаг ошибки не равен 0, выводится сообщение
<- ERROR! - Выполняется пауза перед выходом в DOS.
- Если флаг ошибки равен 0 (ошибок не было), выводится сообщение