Введенную строку считать паролем. Проверить "сложность" пароля - Assembler
Формулировка задачи:
Добрый день. Помогите пожалуйста написать на Assembler... Может у кого нибудь есть что-нибудь подобное?
Введенную строку считать паролем. Проверить "сложность" пароля. Сложный пароль содержит не менее двух разных цифр и не менее трех разных букв. Если пароль содержит только буквы или только цифры, то это простой пароль. Иначе - обычный. Определить "сложность" пароля и оценку вывести на экран (простой, обычный или сложный).
Решение задачи: «Введенную строку считать паролем. Проверить "сложность" пароля»
textual
Листинг программы
.model tiny
.code
.startup
cld
mov si,offset Pwd ; адрес строки
call CheckPwd ; проверяем
; результат в al
mov dx,offset pwdEasy
cmp al,1
jb @@Print ; al < 1 - простой
mov dx,offset pwdStrong
ja @@Print ; al > 1 - сложный
mov dx,offset pwdNormal ; иначе нормальный
@@Print: mov ah,9
int 21h ; выводим
int 20h ; выходим
; Проверка пароля по адресу SI
; Результат: AL=0 - простой, 1 - нормальный, 2 - сложный
CheckPwd proc
mov di,offset Tbl
mov cx,lTbl/2
xor ax,ax
rep stosw ; Обнуляем Tbl
mov cl,lPwd
@@Next: lodsb ; al = буква
cmp al,'0'
jb @@Bad ; al < '0' - не цифра и не буква
cmp al,'9'
jbe @@Dig ; '0' <= al <= '9' - цифра!
and al,not 20h ; делаем букву заглавной
cmp al,'A'
jb @@Bad ; al < 'A' - не буква
cmp al,'Z'
ja @@Bad ; al > 'Z' - не буква
sub al,'A'-('9'+1) ; буква
@@Dig: sub al,'0'
cbw ; ax = смещение в таблице Tbl
xchg bx,ax ; bx = ax
mov byte ptr Tbl[bx],1 ; помечаем, что такой символ есть
@@Bad: loop @@Next
xor dx,dx
mov si,offset Tbl ; таблица (цифр)
mov cl,10
@@CDig: lodsb
add dl,al ; считаем кол-во разных цифр (dl)
loop @@CDig
mov cl,26 ; si = таблица букв
@@CLet: lodsb
add dh,al ; считаем кол-во разных букв (dh)
loop @@CLet
xor al,al ; al = 0 - думаем, что пароль простой
test dl,dl
jz @@Exit ; да, простой (цифр нет)
test dh,dh
jz @@Exit ; да, простой (букв нет)
inc ax ; al = 1 - теперь думаем, что нормальный
cmp dl,2
jb @@Exit ; да, нормальный (цифр меньше 2)
cmp dh,3
jb @@Exit ; да, нормальный (букв меньше 3)
inc ax ; иначе сложный
@@Exit: ret
CheckPwd endp
pwdEasy db 'Easy password!',13,10,'$'
pwdNormal db 'Normal password!',13,10,'$'
pwdStrong db 'Strong password!',13,10,'$'
Pwd db '1password'
lPwd = $-Pwd
Tbl:
TblDig db 10 dup (?)
TblLet db 26 dup (?)
lTbl = $-Tbl
end
Объяснение кода листинга программы
- В начале кода подключается модель памяти tiny и сегмент кода.
- Далее идет команда cld, которая выставляет флаг направления в 1, что означает, что при выполнении операций со строками (например, mov) данные будут читаться в обратном порядке.
- Затем идет команда mov si, offset Pwd, которая задает начальный адрес строки, которую мы проверяем, в регистр si.
- Далее происходит вызов процедуры CheckPwd, которая проверяет пароль.
- Результат проверки хранится в регистре al.
- После этого происходит проверка результата: если al < 1, то выводится сообщение
Это простой пароль, если al > 1, то выводится сообщениеЭто сложный пароль, иначе выводится сообщениеЭто нормальный пароль. - После этого происходит вызов процедуры int 21h, которая выводит сообщение на экран.
- Затем происходит вызов процедуры int 20h, которая выходит из программы.
- В процедуре CheckPwd происходит проверка пароля по адресу si.
- Сначала происходит обнуление таблицы Tbl с помощью команды rep stosw.
- Затем происходит сравнение каждого символа пароля с цифрами и буквами с помощью команд cmp и jb/jbe.
- Если символ является цифрой, то он помечается в таблице Tbl с помощью команды mov.
- Если символ не является цифрой или буквой, то происходит переход на следующую итерацию цикла с помощью команды loop.
- После проверки всех символов происходит подсчет количества разных цифр и букв с помощью команд lodsb, add и loop.
- Затем происходит сравнение полученных результатов с помощью команд cmp и jz.
- Если результаты меньше 2, то пароль считается нормальным, если результаты больше 3, то пароль считается сложным, иначе пароль считается простым.
- В конце процедуры происходит возврат в основную программу с помощью команды ret.
- В конце кода определены константы и переменные:
- pwdEasy, pwdNormal, pwdStrong - строки с примерами паролей.
- Pwd - строка, которую мы проверяем.
- lPwd - длина строки Pwd.
- TblDig, TblLet - таблицы цифр и букв для проверки пароля.
- lTbl - длина таблицы Tbl.