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

Глава 2

При нажатии пользователем клавиши 3Ch и соответственно прыжке на метку save_cmos вызывается функция save_file (запись файла). Эта функция создает новый файл по указанному в переменной file_name имени и записывает в него данные из памяти начиная с адреса 00h и заканчивая 40h. Эта процедура необходима для копирования содержимого CMOS перед редактированием.

Вверх

;запись файла *****************************************************************
;ВХОДНЫЕ ПАРАМЕТРЫ
;svalue
;ax - имя файла

save_file proc
mov dl,svalue
pusha

;создание файла
mov dx,ax
mov ah,3Ch
mov cx,00h
int 21h
mov handle,ax
jc error_file

;копирование CMOS в файл
mov svalue,00h


cycl1: call readSR

mov ah,40h
mov bx,handle
mov cx,1
mov dx,offset tek_el
int 21h

inc svalue
cmp svalue,40h
jne cycl1
call close_file

;вывод сообщения
mov kolonka,0
mov stroka,47
call print_position
mov color,0Ah
mov bp,offset message6
mov cx,dlmessage6
call print_string
call press_key
call clear_string

popa
mov svalue,dl
ret


save_file endp

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

Анализ:

Для создания файла используется функция 3Ch DOS прерывания 21h.

DOS Fn 3cH: Создать файл через описатель
Вход AH 3cH
DS:DX адрес строки ASCIIZ с именем файла
CX атрибут файла
Выход AX код ошибки если CF установлен
описатель файла если ошибки нет

Описание:

DS:DX указывает на строку ASCIIZ в формате: "d:\путь\имяфайла",0.
Если диск и/или путь опущены, они принимаются по умолчанию.


;создание файла
mov dx,ax ;в dx имя файла
mov ah,3Ch ;создать файл
mov cx,00h ;атрибут
int 21h
mov handle,ax ;сохранить описатель handle
jc error_file

Продолжим рассмотрение процедуры save_file.
После того, как файл создан, в цикле будет произведена запись в него данных из памяти. Для этого используется рассмотренная нами ранее процедура записи одной ячейки readSR, и функция DOS 40h. Для контроля того, сколько именно данных считано из памяти и записано в файл служит переменная svalue, значение которой после каждой итерации цикла инкременируется и сравнивается с 40h.

;копирование CMOS в файл
mov svalue,00h


cycl1: call readSR

mov ah,40h
mov bx,handle
mov cx,1
mov dx,offset tek_el
int 21h

inc svalue
cmp svalue,40h
jne cycl1

Для записи в файл используется функция 40h DOS прерывания 21h.

DOS Fn 40H: Писать в файл через описатель
Вход AH 4bH
BX описатель файла
DS:DX адрес буфера, содержащего записываемые данные
CX число записываемых байт
Выход AX код ошибки если CF установлен
AL число реально считанных байт <===== лучший тест для ошибок

Описание:

CX байт данных записывается в файл или на устройство с описателем,
заданным в BX. Данные берутся из буфера, адресуемого через DS:DX.
Данные записываются, начиная с текущей позиции указателя
чтения/записи файла.

Используйте функцию 42H LSEEK, чтобы установить указатель файла,
если необходимо (OPEN сбрасывает указатель в 0).

Обновляет указатель чтения/записи файла, чтобы подготовиться
к последующим операциям последовательного чтения или записи.

Вы должны всегда сравнивать возвращаемое значение AX (число запи санных байт)
с CX (запрошенное число байт для записи).

Замечание:
Эта функция превосходит сложные и неудобные FCB-функции.
Она эффективно сочетает произвольный и последовательный доступ,
позволяя пользователю осуществлять собственное блокирование.

Удобно использовать эту функцию для вывода на умалчиваемые устройства,
такие как Стандартный Вывод, взамен использования различных
функций вывода текста.


Далее файл закрывается и выводится сообщение о том, что данные из памяти скопированы в файл.

call close_file

;вывод сообщения
mov kolonka,0
mov stroka,47
call print_position
mov color,0Ah
mov bp,offset message6
mov cx,dlmessage6
call print_string
call press_key
call clear_string

popa
mov svalue,dl
ret


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

Hosted by uCoz