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