Выдать сообщение "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 (ошибок не было), выводится сообщение
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д