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

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

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

Запросить вначале логин (имя пользователя, задать его в программе), а затем пароль. При вводе пароля не отображать вводимые символы. Выдать сообщение "Ok", если введенное имя и пароль совпадают с заданными. Выдать соответствующее сообщение при несовпадении логина/пароля/логина и пароля. Код:
dseg    segment
user_log    db  17, ?, 'Your login'
std_log     db  'student'       
std_ln      =   $-std_log       
user_pwd    db  17, ?, 'Your password'
std_pwd     db  'qwerty1'       ; эталонный пароль
std_len     =   $-std_pwd       ; его длина
err_mes1    db  13, 10, 'Wrong password$'
err_mes2    db  13, 10, 'Wrong login$'
err_mes3    db  13, 10, 'Wrong login and password$'
log_mes     db  13, 10, 'Enter your login   $'
pas_mes     db  13, 10, 'Enter your password   $'
ok_mes      db  13, 10, 'OK$'
x       dw  3
z   db 3
y   db 3
dseg    ends
cseg    segment
        assume ds:dseg, cs:cseg
        extrn writer:near
start:      
        mov ax, dseg
        mov ds, ax      ; подготовка сегментов данных
        mov es, ax      ; обе обрабатываемые строки находятся в одном сегменте
log:
        mov ah, 9
        lea dx, log_mes
        int 21h
        mov ah, 0ah     ; буферизованный ввод строки
        lea dx, user_log
        int 21h         ; сравнение строк
        mov cx,6        ; число симолов для сравнения
        lea si, std_log ; адреса сравниваемых 
        lea di, user_log+2  ;  строк
        cld             ; направление обработки строк - вперед
        repe    cmpsb
        jne wrong1
        
pas:    
        mov ah, 9
        lea dx, pas_mes
        int 21h
        mov ah, 0ah     ; буферизованный ввод строки
        lea dx, user_pwd
        int 21h         ; сравнение строк
        mov cx, 7       ; число симолов для сравнения
        lea si, std_pwd     ; адреса сравниваемых 
        lea di, user_pwd+2  ;  строк
        cld             ; направление обработки строк - вперед
        repe    cmpsb
        jne wrong2
 
ok:     
        mov ah, 9           ; если совпали - вывод сообщения
        lea dx, ok_mes      ; 'Верно' с новой строки
        int 21h
        jmp exit

;wrong3 : 
;       cmp y,0
;       je error1
;       jne ok
wrong1:
        inc y
        jmp pas
wrong2:
        cmp y,0
        jne error3      

error2:     
        mov x, cx
        dec x
        mov ax, x
        mov ah, 9
        lea dx, err_mes1
        int 21h
        jmp log
error1:     
        mov x, cx
        dec x
        mov ax, x
        mov ah, 9
        lea dx, err_mes2
        int 21h
        jmp log
error3: 
        mov x, cx
        dec x
        mov ax, x
        mov ah, 9
        lea dx, err_mes3
        int 21h
        jmp log             
 
exit:
        mov ax, 4c00h
        int 21h
cseg    ends
        end start
При вводе неправильного логина и правильного пароля выдает "Ок", хотя должна быть ошибка. И почему-то на одном компе не отображает символы, а на другом отображает. Заранее благодарен.
С сообщением разобрался, но как сделать, чтобы при вводе не отображался пароль?

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

textual
Листинг программы
;fasm-code
;--------------------
org  100h
jmp  start
 
m0     db   13,10,'Login: $'
m1     db   13,10,'Pass : $'
o      db   '  <- OK! $'
e      db   7,' <- ERROR! $'
 
log    db   'user'          ; зашитый логин
llen   =    $-log           ;   ..(его длина)
pas    db   '12345'         ; зашитый пасс
plen   =    $-pas           ;   ..(просто подставляй свои значения)
flag   db   0               ; флаг ошибки
 
;//---- Ввод\Проверка логина
;//-------------------------------
start:  mov   ah,9          ;
        mov   dx,m0         ;
        int   21h           ;
 
        mov   bp,llen       ;
        mov   bx,log        ;
@00:    mov   ah,1          ; ввод символа с эхом
        int   21h           ;
        cmp   al,13         ;   ..пока не Enter
        je    @01           ;
        xor   al,byte[bx]   ; сразу проверяем его
        jz    next          ; совпало!
        inc   [flag]        ; иначе: флаг ошибки
next:   or    bp,bp         ; защита от переполнения
        jns   ok1           ;   ..(если длина больше)
        inc   [flag]        ;
ok1:    inc   bx            ; сл.байт
        dec   bp            ;
        jmp   @00           ; мотаем до Enter'а...
 
;//---- Ввод\Проверка пароля (всё тоже-самое)
;//----------------------------------------------
@01:    mov   ah,9          ;
        mov   dx,m1         ;
        int   21h           ;
 
        mov   bp,plen       ;
        mov   bx,pas        ;
@02:    mov   ah,8          ; только ввод без эха
        int   21h           ;
        cmp   al,13         ;
        je    @rezz         ;
        xor   al,byte[bx]   ;
        jz    next2         ;
        inc   [flag]        ;
next2:  or    bp,bp         ;
        jns   ok2           ;
        inc   [flag]        ;
ok2:    inc   bx            ;
        dec   bp            ;
        mov   al,'*'        ; звёздочки вместо пароля
        int   29h           ;
        jmp   @02           ;
 
;//---- Выводим результ
;//---------------------------------------
@rezz:  mov   ah,9          ;
        mov   dx,o          ;
        cmp   [flag],0      ; ошибки были?
        je    @prn          ; нет!
        mov   dx,e          ;
@prn:   int   21h           ;
 
        xor   ax,ax         ; пауза..
        int   16h           ;
        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
Похожие ответы