Введенную строку считать паролем. Проверить "сложность" пароля - Assembler

Узнай цену своей работы

Формулировка задачи:

Добрый день. Помогите пожалуйста написать на Assembler... Может у кого нибудь есть что-нибудь подобное? Введенную строку считать паролем. Проверить "сложность" пароля. Сложный пароль содержит не менее двух разных цифр и не менее трех разных букв. Если пароль содержит только буквы или только цифры, то это простой пароль. Иначе - обычный. Определить "сложность" пароля и оценку вывести на экран (простой, обычный или сложный).

Решение задачи: «Введенную строку считать паролем. Проверить "сложность" пароля»

textual
Листинг программы
  1. .model tiny
  2. .code
  3. .startup
  4.  
  5.                 cld
  6.  
  7.                 mov     si,offset Pwd   ; адрес строки
  8.                 call    CheckPwd        ; проверяем
  9.                 ; результат в al
  10.                 mov     dx,offset pwdEasy
  11.                 cmp     al,1
  12.                 jb      @@Print         ; al < 1 - простой
  13.                 mov     dx,offset pwdStrong
  14.                 ja      @@Print         ; al > 1 - сложный
  15.                 mov     dx,offset pwdNormal     ; иначе нормальный
  16. @@Print:        mov     ah,9
  17.                 int     21h             ; выводим
  18.  
  19.                 int     20h             ; выходим
  20.  
  21. ; Проверка пароля по адресу SI
  22. ; Результат: AL=0 - простой, 1 - нормальный, 2 - сложный
  23. CheckPwd        proc
  24.                 mov     di,offset Tbl
  25.                 mov     cx,lTbl/2
  26.                 xor     ax,ax
  27.                 rep stosw               ; Обнуляем Tbl
  28.  
  29.                 mov     cl,lPwd
  30.         @@Next: lodsb                   ; al = буква
  31.                 cmp     al,'0'
  32.                 jb      @@Bad           ; al < '0' - не цифра и не буква
  33.                 cmp     al,'9'
  34.                 jbe     @@Dig           ; '0' <= al <= '9' - цифра!
  35.                 and     al,not 20h      ; делаем букву заглавной
  36.                 cmp     al,'A'
  37.                 jb      @@Bad           ; al < 'A' - не буква
  38.                 cmp     al,'Z'
  39.                 ja      @@Bad           ; al > 'Z' - не буква
  40.                 sub     al,'A'-('9'+1)  ; буква
  41.         @@Dig:  sub     al,'0'
  42.                 cbw                     ; ax = смещение в таблице Tbl
  43.                 xchg    bx,ax           ; bx = ax
  44.                 mov     byte ptr Tbl[bx],1      ; помечаем, что такой символ есть
  45.         @@Bad:  loop    @@Next
  46.  
  47.                 xor     dx,dx
  48.                 mov     si,offset Tbl   ; таблица (цифр)
  49.                 mov     cl,10
  50.         @@CDig: lodsb
  51.                 add     dl,al           ; считаем кол-во разных цифр (dl)
  52.                 loop    @@CDig
  53.                 mov     cl,26           ; si = таблица букв
  54.         @@CLet: lodsb
  55.                 add     dh,al           ; считаем кол-во разных букв (dh)
  56.                 loop    @@CLet
  57.  
  58.                 xor     al,al           ; al = 0 - думаем, что пароль простой
  59.                 test    dl,dl
  60.                 jz      @@Exit          ; да, простой (цифр нет)
  61.                 test    dh,dh
  62.                 jz      @@Exit          ; да, простой (букв нет)
  63.  
  64.                 inc     ax              ; al = 1 - теперь думаем, что нормальный
  65.                 cmp     dl,2
  66.                 jb      @@Exit          ; да, нормальный (цифр меньше 2)
  67.                 cmp     dh,3
  68.                 jb      @@Exit          ; да, нормальный (букв меньше 3)
  69.  
  70.                 inc     ax              ; иначе сложный
  71.         @@Exit: ret
  72. CheckPwd        endp
  73.  
  74. pwdEasy         db      'Easy password!',13,10,'$'
  75. pwdNormal       db      'Normal password!',13,10,'$'
  76. pwdStrong       db      'Strong password!',13,10,'$'
  77.  
  78. Pwd             db      '1password'
  79. lPwd            =       $-Pwd
  80.  
  81. Tbl:
  82. TblDig          db      10 dup (?)
  83. TblLet          db      26 dup (?)
  84. lTbl            =       $-Tbl
  85.  
  86. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы