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