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

Объяснение кода листинга программы

  1. В начале кода подключается модель памяти tiny и сегмент кода.
  2. Далее идет команда cld, которая выставляет флаг направления в 1, что означает, что при выполнении операций со строками (например, mov) данные будут читаться в обратном порядке.
  3. Затем идет команда mov si, offset Pwd, которая задает начальный адрес строки, которую мы проверяем, в регистр si.
  4. Далее происходит вызов процедуры CheckPwd, которая проверяет пароль.
  5. Результат проверки хранится в регистре al.
  6. После этого происходит проверка результата: если al < 1, то выводится сообщение Это простой пароль, если al > 1, то выводится сообщение Это сложный пароль, иначе выводится сообщение Это нормальный пароль.
  7. После этого происходит вызов процедуры int 21h, которая выводит сообщение на экран.
  8. Затем происходит вызов процедуры int 20h, которая выходит из программы.
  9. В процедуре CheckPwd происходит проверка пароля по адресу si.
  10. Сначала происходит обнуление таблицы Tbl с помощью команды rep stosw.
  11. Затем происходит сравнение каждого символа пароля с цифрами и буквами с помощью команд cmp и jb/jbe.
  12. Если символ является цифрой, то он помечается в таблице Tbl с помощью команды mov.
  13. Если символ не является цифрой или буквой, то происходит переход на следующую итерацию цикла с помощью команды loop.
  14. После проверки всех символов происходит подсчет количества разных цифр и букв с помощью команд lodsb, add и loop.
  15. Затем происходит сравнение полученных результатов с помощью команд cmp и jz.
  16. Если результаты меньше 2, то пароль считается нормальным, если результаты больше 3, то пароль считается сложным, иначе пароль считается простым.
  17. В конце процедуры происходит возврат в основную программу с помощью команды ret.
  18. В конце кода определены константы и переменные:
    • pwdEasy, pwdNormal, pwdStrong - строки с примерами паролей.
    • Pwd - строка, которую мы проверяем.
    • lPwd - длина строки Pwd.
    • TblDig, TblLet - таблицы цифр и букв для проверки пароля.
    • lTbl - длина таблицы Tbl.

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы