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