Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf
Добавлен: 16.02.2019
Просмотров: 29215
Скачиваний: 1689
Глава 9. Работа с файлами
87
Рис. 9.2. Имя открываемого файла
Символ
'0'
после
c:\msdos.sys
будет отображен как пробел.
А для чего нужен
'0'
в строке (23)? При открытии файла пара регистров
ds:dx
должна содержать ссылку на имя файла. Строка должна завершаться символом
'0'
. Если этот символ убрать, то функция, скорее всего, вернет ошибку. Ведь фай-
ла с именем c:\msdos.sys!$ не существует!
Можем сделать и так, конечно. Только в этом случае мы потеряем байты:
Mess_error db 'Не удалось открыть (найти) файл c:\msdos.sys!$'
File_name db 'c:\msdos.sys',0
Обращаем ваше внимание, что мы будем постоянно использовать данный метод
в наших примерах.
9.2. Программа для практики
Теперь подробнее рассмотрим работу с файлами. В листинге 9.3 приведен при-
мер (\009\Prog09.asm).
Листинг 9.3. Открытие, чтение и вывод файла на экран
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
; -------------- Начало -------------
Begin:
mov dx,offset File_name
call Open_file
jc Error_file
Часть II. Усложняем задачи
88
; -------------- Открыли файл -----------
mov bx,ax
mov ah,3Fh
mov cx,offset Finish-100h
mov dx,offset Begin
int 21h
; ------------- Прочитали файл ----------------
call Close_file
; ------------ Выводим сообщение --------------
mov ah,9
mov dx,offset Mess_ok
int 21h
ret
; ---------- Не смогли найти файл -----------------
Error_file:
mov ah,2
mov dl,7
int 21h
ret
; Процедуры
; --- Открытие файла ---
Open_file proc
cmp Handle,0FFFFh
jne Quit_open
mov ax,3D00h
int 21h
mov Handle,ax
ret
Quit_open:
stc
ret
Handle dw 0FFFFh
Open_file endp
; --- Закрытие файла ---
Close_file proc
mov ah,3Eh
Глава 9. Работа с файлами
89
mov bx,Handle
int 21h
ret
Close_file endp
; Данные
File_name db 'Prog09.com',0
Mess_ok db 'Все нормально!', 0Ah, 0Dh, '$'
Finish equ $
CSEG ends
end Begin
В
Н И МА Н И Е
!
Этот файл нужно обязательно сохранить как Prog09.asm!
Эта программа также с подвохом. Попробуйте самостоятельно разобраться
с принципом ее работы. Отладчик в данном случае мало поможет, поэтому вам
нужно будет разбирать программу без его помощи.
Принцип работы данной программы будет подробно рассмотрен в главе 10.
Ч А С Т Ь I I I
Файловая оболочка,
вирус, резидент
Глава 10
Введение в вирусологию.
Обработчик прерываний
10.1. Программа из прошлой главы
В главе 9 наша программа перезагружала сама себя (загружалась поверх своего
кода) в оперативной памяти. Мы не зря просили вас присвоить ей имя именно
Prog09.asm. Если программа не найдет файл с данным именем, то она просто за-
вершит работу, при этом издаст звуковой сигнал. Ничего сложного в ней нет. Дан-
ная программа наглядно показывает, что в ассемблере можно проделывать неверо-
ятные вещи, которые языкам высокого уровня попросту недоступны. Далее
приведен код программы с некоторыми пояснениями ее работы (листинг 10.1).
Листинг 10.1. Программа Prog09.asm из главы 9
;Программа выполняет запись самой себя в то место памяти, куда она
;уже загружена
CSEG segment
assume CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
org 100h
Begin:
;Открываем файл с помощью спецпроцедуры (см. ниже).
mov dx,offset File_name
call Open_file ;Открываем файл с именем Prog09.com
jc Error_file ;Переходим на метку Error_file при неудаче
mov bx,ax ;Сохраняем идентификатор файла
;Чтение файла
mov ah,3Fh
;Загружаем длину нашей программы (количество читаемых байтов) в регистр cx...
mov cx,offset Finish-100h
mov dx,offset Begin ;И читаем файл в память,
int 21h ;начиная с метки Begin.
call Close_file ;Закрываем файл с помощью спецпроцедуры