Выдать сообщение "Ok", если введенное имя и пароль совпадают с заданными - Assembler

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

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

Запросить вначале логин (имя пользователя, задать его в программе), а затем пароль. При вводе пароля не отображать вводимые символы. Выдать сообщение "Ok", если введенное имя и пароль совпадают с заданными. Выдать соответствующее сообщение при несовпадении логина/пароля/логина и пароля. Код:
Листинг программы
  1. dseg segment
  2. user_log db 17, ?, 'Your login'
  3. std_log db 'student'
  4. std_ln = $-std_log
  5. user_pwd db 17, ?, 'Your password'
  6. std_pwd db 'qwerty1' ; эталонный пароль
  7. std_len = $-std_pwd ; его длина
  8. err_mes1 db 13, 10, 'Wrong password$'
  9. err_mes2 db 13, 10, 'Wrong login$'
  10. err_mes3 db 13, 10, 'Wrong login and password$'
  11. log_mes db 13, 10, 'Enter your login $'
  12. pas_mes db 13, 10, 'Enter your password $'
  13. ok_mes db 13, 10, 'OK$'
  14. x dw 3
  15. z db 3
  16. y db 3
  17. dseg ends
  18. cseg segment
  19. assume ds:dseg, cs:cseg
  20. extrn writer:near
  21. start:
  22. mov ax, dseg
  23. mov ds, ax ; подготовка сегментов данных
  24. mov es, ax ; обе обрабатываемые строки находятся в одном сегменте
  25. log:
  26. mov ah, 9
  27. lea dx, log_mes
  28. int 21h
  29. mov ah, 0ah ; буферизованный ввод строки
  30. lea dx, user_log
  31. int 21h ; сравнение строк
  32. mov cx,6 ; число симолов для сравнения
  33. lea si, std_log ; адреса сравниваемых
  34. lea di, user_log+2 ; строк
  35. cld ; направление обработки строк - вперед
  36. repe cmpsb
  37. jne wrong1
  38. pas:
  39. mov ah, 9
  40. lea dx, pas_mes
  41. int 21h
  42. mov ah, 0ah ; буферизованный ввод строки
  43. lea dx, user_pwd
  44. int 21h ; сравнение строк
  45. mov cx, 7 ; число симолов для сравнения
  46. lea si, std_pwd ; адреса сравниваемых
  47. lea di, user_pwd+2 ; строк
  48. cld ; направление обработки строк - вперед
  49. repe cmpsb
  50. jne wrong2
  51. ok:
  52. mov ah, 9 ; если совпали - вывод сообщения
  53. lea dx, ok_mes ; 'Верно' с новой строки
  54. int 21h
  55. jmp exit
  56.  
  57. ;wrong3 :
  58. ; cmp y,0
  59. ; je error1
  60. ; jne ok
  61. wrong1:
  62. inc y
  63. jmp pas
  64. wrong2:
  65. cmp y,0
  66. jne error3
  67.  
  68. error2:
  69. mov x, cx
  70. dec x
  71. mov ax, x
  72. mov ah, 9
  73. lea dx, err_mes1
  74. int 21h
  75. jmp log
  76. error1:
  77. mov x, cx
  78. dec x
  79. mov ax, x
  80. mov ah, 9
  81. lea dx, err_mes2
  82. int 21h
  83. jmp log
  84. error3:
  85. mov x, cx
  86. dec x
  87. mov ax, x
  88. mov ah, 9
  89. lea dx, err_mes3
  90. int 21h
  91. jmp log
  92. exit:
  93. mov ax, 4c00h
  94. int 21h
  95. cseg ends
  96. end start
При вводе неправильного логина и правильного пароля выдает "Ок", хотя должна быть ошибка. И почему-то на одном компе не отображает символы, а на другом отображает. Заранее благодарен.
С сообщением разобрался, но как сделать, чтобы при вводе не отображался пароль?

Решение задачи: «Выдать сообщение "Ok", если введенное имя и пароль совпадают с заданными»

textual
Листинг программы
  1. ;fasm-code
  2. ;--------------------
  3. org  100h
  4. jmp  start
  5.  
  6. m0     db   13,10,'Login: $'
  7. m1     db   13,10,'Pass : $'
  8. o      db   '  <- OK! $'
  9. e      db   7,' <- ERROR! $'
  10.  
  11. log    db   'user'          ; зашитый логин
  12. llen   =    $-log           ;   ..(его длина)
  13. pas    db   '12345'         ; зашитый пасс
  14. plen   =    $-pas           ;   ..(просто подставляй свои значения)
  15. flag   db   0               ; флаг ошибки
  16.  
  17. ;//---- Ввод\Проверка логина
  18. ;//-------------------------------
  19. start:  mov   ah,9          ;
  20.         mov   dx,m0         ;
  21.         int   21h           ;
  22.  
  23.         mov   bp,llen       ;
  24.         mov   bx,log        ;
  25. @00:    mov   ah,1          ; ввод символа с эхом
  26.         int   21h           ;
  27.         cmp   al,13         ;   ..пока не Enter
  28.         je    @01           ;
  29.         xor   al,byte[bx]   ; сразу проверяем его
  30.         jz    next          ; совпало!
  31.         inc   [flag]        ; иначе: флаг ошибки
  32. next:   or    bp,bp         ; защита от переполнения
  33.         jns   ok1           ;   ..(если длина больше)
  34.         inc   [flag]        ;
  35. ok1:    inc   bx            ; сл.байт
  36.         dec   bp            ;
  37.         jmp   @00           ; мотаем до Enter'а...
  38.  
  39. ;//---- Ввод\Проверка пароля (всё тоже-самое)
  40. ;//----------------------------------------------
  41. @01:    mov   ah,9          ;
  42.         mov   dx,m1         ;
  43.         int   21h           ;
  44.  
  45.         mov   bp,plen       ;
  46.         mov   bx,pas        ;
  47. @02:    mov   ah,8          ; только ввод без эха
  48.         int   21h           ;
  49.         cmp   al,13         ;
  50.         je    @rezz         ;
  51.         xor   al,byte[bx]   ;
  52.         jz    next2         ;
  53.         inc   [flag]        ;
  54. next2:  or    bp,bp         ;
  55.         jns   ok2           ;
  56.         inc   [flag]        ;
  57. ok2:    inc   bx            ;
  58.         dec   bp            ;
  59.         mov   al,'*'        ; звёздочки вместо пароля
  60.         int   29h           ;
  61.         jmp   @02           ;
  62.  
  63. ;//---- Выводим результ
  64. ;//---------------------------------------
  65. @rezz:  mov   ah,9          ;
  66.         mov   dx,o          ;
  67.         cmp   [flag],0      ; ошибки были?
  68.         je    @prn          ; нет!
  69.         mov   dx,e          ;
  70. @prn:   int   21h           ;
  71.  
  72.         xor   ax,ax         ; пауза..
  73.         int   16h           ;
  74.         ret                 ; выход в DOS

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

  1. Объявляются переменные:
    • m0 - сообщение для ввода логина
    • m1 - сообщение для ввода пароля
    • o - сообщение об успешном вводе
    • e - сообщение об ошибке
    • log - зашитый логин (в данном случае user)
    • llen - длина логина (user)
    • pas - зашитый пароль (в данном случае 12345)
    • plen - длина пароля (12345)
    • flag - флаг ошибки
  2. Ввод и проверка логина:
    • Выводится сообщение Login:
    • Вводится логин
    • Каждый введенный символ проверяется на соответствие зашитому логину.
    • Длина введенного логина сравнивается с длиной зашитого логина
    • Если символы совпадают и длина верна, устанавливается флаг ошибки (если не совпадают, флаг ошибки увеличивается)
  3. Ввод и проверка пароля:
    • Выводится сообщение Pass:
    • Вводится пароль
    • Каждый введенный символ проверяется на соответствие зашитому паролю.
    • Длина введенного пароля сравнивается с длиной зашитого пароля
    • Если символы совпадают и длина верна, устанавливается флаг ошибки (если не совпадают, флаг ошибки увеличивается)
    • Пароль заменяется звёздочками
  4. Вывод результата:
    • Если флаг ошибки равен 0 (ошибок не было), выводится сообщение <- OK!
    • Если флаг ошибки не равен 0, выводится сообщение <- ERROR!
    • Выполняется пауза перед выходом в DOS.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

9   голосов , оценка 3.889 из 5

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

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

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