Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf

ВУЗ: Не указан

Категория: Книга

Дисциплина: Программирование

Добавлен: 16.02.2019

Просмотров: 29215

Скачиваний: 1689

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Глава 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 


background image

 

Часть 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 


background image

Глава 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
 


background image

 

 

 

 

 

 

Ч А С Т Ь  I I I 

Файловая оболочка,  

вирус, резидент 

 


background image

 

 

 

Глава 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       ;Закрываем файл с помощью спецпроцедуры