Глава 2
Далее в процедуре main идет предложение нажать системную клавишу,
и идет проверка - какая клавиша нажата?
non_sys_key: call press_key
;нажата не системная клавиша
;обработка системных клавиш
cmp scan_code,49h
cmp scan_code,44h
cmp scan_code,3Dh
cmp scan_code,3Eh
jmp non_sys_key
;************************************************************
PgUp: cmp svalue,0Dh
jmp non_sys_key
load_cmos: ;загрузка CMOS из файла ***************************************
edit_cmos: ;редактирование CMOS ******************************************
;цикл обработки сообщений с клавиатуры **********************
;перехват скан-кода нажатой клавиши и его анализ ************
cmp ascii_code,00
jne non_sys_key
cmp scan_code,51h
je PgDn
je PgUp
je exit_dos
cmp scan_code,3Ch
je save_cmos
je load_cmos
je edit_cmos
;действия выполняемые в ответ на нажатую клавишу
PgDn: cmp svalue,40h
inc page_index
mov si,page_index
call scr_page
jmp non_sys_key
dec page_index
mov si,page_index
mov ah,mas_svalue[si]
mov svalue,ah
call scr_page
jmp non_sys_key
save_cmos: mov ax,offset file_name
;**************************************************************
call load_file
jmp non_sys_key
Проанализируем теперь этот фрагмент главной процедуры main программы.
Программа ждет нажатия клавиши:
non_sys_key: call press_key
После нажатия, анализирует нажата ли одна из шести запланированных системных клавиш.
А запланировано отреагировать на нажатие клавиш, скан-код которых 51h,49h,44h,3ch,3Dh,3Eh.
Вот например реакция на нажатие клавиши PgUp(51h):
PgDn: cmp svalue,40h
inc page_index
mov si,page_index
call scr_page
jmp non_sys_key
Сначала идет сравнение svalue со значением 40h. Если svalue равна этому значению, значит
надо сделать прыжок на non_sys_key. Так как уже все данные выведены на экран, это была последняя 4-я страница. Последнее значение массива mas_evalue равно 3Fh:
mas_evalue DB 0Ch, 10h, 20h, 3Fh
Если значение svalue не равно 40h, то инекремент page_index, присвоение регистру si
этого же значения. И вызов процедуры scr_page, которая выведет на экран новую страницу
(одну из четырех). Мы помним начало процедуры scr_page, в котором присваиваются значения начальному и конечному значению адреса для чтения и инициируется (настраивается) указатель bp на адрес сообщения:
mov si,page_index
mov al,mas_svalue[si]
mov bx,si
mov al,mas_evalue[si]
mov evalue,al ;конечный адрес в памяти
mov svalue,al ;начальный адрес в памяти
add bx,bx
mov bp,mes_adr[bx] ;адрес сообщения (пояснения)
mov cx,mes_dl[bx] ;длина сообщения (пояснения)
В результате того, что page_index была инкременирована (допустим она получила значение 1), соответственно переменные используемые в процедуре scr_page получат следующие значения:
evalue получит значение 10h
svalue получит значение 0Dh
bp будет указывать на адрес mes0D
cx получит значение dl0D = $-mes0D
Короче говоря будет выведена очередная (в данном конкретном случае вторая) страница.
Те же рассуждения верны и в отношении нажатия клавиши PgUp:
PgUp: cmp svalue,0Dh
dec page_index
mov si,page_index
mov ah,mas_svalue[si]
mov svalue,ah
call scr_page
jmp non_sys_key
Прыжок на остальные метки будет рассмотрен нами далее.
Назад |
Начало урока |
Вверх |
Вперед
Содержание