Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
задачи(решённые)2.3.4 лабы.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
103 Кб
Скачать
☆
  1. Дополните программу: ввод пароля пока не будет введено правильное слово. При каждом неверном вводе выводите сообщение об этом.

csg segment para

assume cs:csg, ds:csg, es:csg, ss:csg

org 100h

start:

jmp main

main proc near

call clrscr

mov ah, 0bh

mov bh, 01h ; Применять палитру 1.

mov bl, 01h ; Установить белый цвет для сообщений

int 10h

lea bp, [msg]

mov cx, 09h ; В выводимой строке 9 букв.

mov dx, 0000h ; Вывод в 0-ю строку, 0-й столбец.

mov bl, 07h ; Белый цвет.

call puts

again:

lea si, inpas ; Загрузить адрес строки для сохранения символов.

input:

mov ah, 02h

mov dh, 01h ; Установить курсор в 1-ю строку.

mov dl, col ; Установить курсор в нужный столбец.

mov bh, 00h ; Установить курсор на 0-й видеостранице.

int 10h

mov ah, 00h ; Ожидание появления символа в буфере клавиатуры.

int 16h

cmp al, 0dh

je check_pass

mov [si], al ; Сохранение текущего символа.

inc si

mov ah, 09h

mov al, '*' ; Выводимый символ.

mov bh, 00h ; Номер видеостраницы.

mov bl, 04h

mov cx, 01h ; Количество повторений.

int 10h

inc cnt

inc col

cmp cnt, 06h

je check_pass

jmp input

check_pass:

lea si, inpas

lea di, pass

xor cx, cx

xor bx, bx

dec cnt

l1:

mov ah, [si+bx]

mov al, [di+bx]

cmp ah, al

jne pass_error

cmp bl, 05h

je exit_ok

inc bl

jmp l1

pass_error:

call err_msg

mov col, 00h

mov cnt, 00h

jmp again

exit_ok:

call ok

exit:

mov ah, 04ch

int 21h

ret

main endp

; Процедура err_msg

err_msg proc near

call clrscr

lea bp, [errmsg]

xor cx, cx

mov cl, 18h

mov dx, 0000h

mov bl, 04h ; Красный цвет.

call puts

ret

err_msg endp

; Процедура OK

ok proc near

call clrscr

lea bp, [okmsg]

xor cx, cx

mov dx, 0000h

mov cl, 02h

mov bl, 02h ; Зеленый цвет.

call puts

mov ah, 00h

int 16h

ret

ok endp

; Процедура puts

puts proc near

mov ah, 13h

mov al, 01h ; Курсор в конец строки.

mov bh, 00h ; Вывод на 0-ю видеостраницу.

int 10h

ret

puts endp

; Процедура clrscr

clrscr proc near

mov ah, 06h

mov al, 00h ; Число прокручиваемых строк.

mov cl, 00h ; Номер столбца верхнего левого угла.

mov ch, 00h ; Номер строки верхнего левого угла.

mov dl, 4fh ; Номер столбца правого нижнего угла.

mov dh, 18h ; Номер строки правого нижнего угла.

mov bh, 07h

int 10h

ret

clrscr endp

msg db "Password: "

okmsg db "OK"

errmsg db "Error, Please try again:"

pass db '111111'

row db 0

col db 0

cnt db 0

inpas db 6 dup("?")

csg ends

end start

  1. Дополните программу. При верном вводе пароля он появляется на экране через временную задержку разного цвета.

codesg segment para 'code'

assume cs:codesg, ds:codesg, ss:codesg, es:codesg

org 100h

begin: jmp main

main proc near

call clear_scrin

; вывод сообщения на экран

mov row,09

mov col,10

lea bp, [message] ; адрес строки

mov cx, 15 ;длина строки

call write_string

;Cмещение курсора на конец выведеного сообщения

add col, 18

lea si, cout

wr:

; Установка позиции курсора

mov ah, 02h

mov bh, 00

mov dl, col

int 10h

;ожидание ввода с клавиатуры без эхоотображения

mov ah, 00h

int 16h

cmp al, 0dh ; конец ввода «Enter»

je wr1

; Введенный символ из al записывается в строку cout

mov [si], al

inc si

; выводится на экран в текущую позицию курсора символ '*'

mov ah, 09

mov al, '*'

mov bh, 00

mov cx, 1

int 10h

inc col

inc coun

cmp coun, 5 ;вводится только 5 символов

jne wr ;повторяем ввод символа

lea si, parol

lea bp, [cout]

wr1:

mov ah, [si]

mov al, [bp]

cmp ah, al

jne q ;выход из программы

cmp cl, coun

je wr2

inc si

inc bp

inc cl

jmp wr1

;выход из программы

MOV ah, 8h

int 21h

q:

call clear_scrin

mov ah, 13h ;установка курсора

mov bh, 0

mov bl, 12

mov dh, 6

mov dl, 6

lea bp, mess1

mov cl, 10

mov ch, 0

mov al, 1

int 10h

ret

wr2:

call ok

main endp

;вывод на экран сообщения о правильном вводе пароля

ok proc near

call clear_scrin

k:

lea bp,[mess] ;адрес строки

mov cl, 5

call write_hello

jmp k

ret

ok endp

clear_scrin proc near

; Очистка экрана

mov ax, 0600h ; ah=06-прокрутка экрана

; al=00-весь экран

mov bh, 07

mov cx, 0000

mov dx, 184fh

int 10h

ret

clear_scrin endp

write_string proc near

mov ah, 13h

mov al,1

mov bh, 00 ; номер видео страницы

mov bl, 12

mov dh, 6 ;координаты по строке

mov dl, 6 ;координаты по столбцу

int 10h

ret

write_string endp

write_hello proc near

mov ah, 13h

mov al,1

mov bh, 00 ;номер видео страницы

call cveta

mov dh, 6 ;координаты по строке

mov dl, 6 ;координаты по столбцу

int 10h

ret

write_hello endp

cveta proc near

inc bl

cmp bl, 0eh

jb m1

mov bl, 02h

m1: ret

cveta endp

message db 'Vvedite parol: '

mess db 'hello'

mess1 db 'Vi owiblis!'

str1 label byte

row db 00

col db 00

cout db 6 dup (' ')

parol db 'hello'

count db ?

coun db 0

codesg ends

end begin