Назад | Начало урока | Вперед
Содержание

Глава 3

Рассмотрим далее программу main.
После нажатия пользователем клавишы, скан-код которой равен 3Eh,
программа переходит на метку edit_cmos.

edit_cmos: ;редактирование CMOS ******************************************

pusha

mov ax,offset file_name2
call save_file

;ввод адрес
mov kolonka,0
mov stroka,47
call print_position

mov color,0Ah

mov bp,offset message4
mov cx,dlmessage4
call print_string

call read_int

mov al,chislo
push ax

mov bp,offset message5
mov cx,dlmessage5
call print_string

call press_key

;очистка текущей строки
mov kolonka,0
mov stroka,47
call clear_string
mov color,0Ah

;ввод нового значения по введенному адресу
mov bp,offset message7
mov cx,dlmessage7
call print_string

call read_int

mov al,chislo
push ax

mov bp,offset message5
mov cx,dlmessage5
call print_string

pop ax
mov tek_el,al

pop ax
mov svalue,al

call writeSR

call press_key

exit_nsk: ;очистка текущей строки

mov kolonka,0
mov stroka,47
mov color,0Ah
call clear_string

call scr_page

popa
jmp non_sys_key


;******************************************************************************

;**************************************************************
;востановление графического режима который был до запуска программы
exit_dos: call set_screeng_mode
;************************

;вызов стандартной функции DOS выход из программы
mov ax,4c00h
int 21h
;************************************************

main endp


;******************************************************************************

end main


Анализ кода:

pusha

mov ax,offset file_name2
call save_file

После сохранения в стеке регистра a вызывается функция save_file (запись файла). Эта функция создает новый файл по указанному в переменной file_name2 имени и записывает в него данные из памяти начиная с адреса 00h и заканчивая 40h.

file_name2 DB "CMOS.SAV",0

После этого на экран в координаты kolonka,0 и stroka,47 выводится сообщение:
message4 DB "Введите редактируемый адрес в hex форме - "

;ввод адрес
mov kolonka,0
mov stroka,47
call print_position

mov color,0Ah

mov bp,offset message4
mov cx,dlmessage4
call print_string

После этого вызывается процедура read_int

call read_int

В этой процедуре программа ждет ввода пользователя, затем обрабатывает этот ввод.
А именно считывает с клавиатуры 16-ричное число, введенное пользователем
и записывает это число в переменную chislo
(см.подробнее процедура read_int)

chislo DB 0 ;bcd число

Далее сохраняем значение из переменной chislo в стеке, и выводим сообщение, с предложением нажать любую клавишу: " О.К. Press any key". Вызываем функцию ожидания нажатия клавиши.

mov al,chislo
push ax

mov bp,offset message5
mov cx,dlmessage5
call print_string

call press_key

Далее очищаем предыдущую строку, для того чтобы на ее месте вывести новое сообщение. И выводим новое сообщение: "Введите значение в hex форме - "


;очистка текущей строки
mov kolonka,0
mov stroka,47
call clear_string
mov color,0Ah

;ввод нового значения по введенному адресу
mov bp,offset message7
mov cx,dlmessage7
call print_string

Снова вызываем процедуру read_int, которая сначала ожидает ввода пользователем клавиши, затем присваивает это значение опять же переменной chislo. Далее значение переменной chislo сохраняем в стеке, и выводим новое сообщение " О.К. Press any key"

call read_int

mov al,chislo
push ax

mov bp,offset message5
mov cx,dlmessage5
call print_string

После этого достаем из стека сначала значение (присваиваем его переменной tek_el), затем адрес (присваиваем значение адреса переменной svalue). После этого вызываем процедуру writeSR, которая запишет по указанному адресу это значение в память компа.

pop ax
mov tek_el,al

pop ax
mov svalue,al

call writeSR

call press_key

Далее очищаем строку сообщений, и при помощи процедуры scr_page
выводим на экран обновленную страницу, отражающую обновленное содержание CMOS-памяти компа.

exit_nsk: ;очистка текущей строки

mov kolonka,0
mov stroka,47
mov color,0Ah
call clear_string

call scr_page

Наконец восстанавливаем регистр из стека и переходим на метку non_sys_key:

popa
jmp non_sys_key

Таким образом программа работает в цикле задавая вопросы пользователю и обрабатывая клавиши, нажатые пользователем до тех пор, пока пользователь не нажмет клавишу F10 скан-код которой соответствует значению 44h, после чего прыжок на метку окончания программы exit_dos:

;**************************************************************
;востановление графического режима который был до запуска программы
exit_dos: call set_screeng_mode
;************************

;вызов стандартной функции DOS выход из программы
mov ax,4c00h
int 21h
;************************************************

main endp


;******************************************************************************

end main


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz