N
|
смещение
|
название
|
Размер, байт
|
дополнительная
информация
|
1
|
00h
|
manuf
|
1
|
Изготовитель
|
2
|
01h
|
hard
|
1
|
Информация о
версии
|
3
|
02h
|
encod
|
1
|
Способ
кодирования
|
4
|
03h
|
bitpx
|
1
|
Бит на точку
|
5
|
04h
|
x1
|
2
|
Размеры образа
|
6
|
06h
|
y1
|
2
|
|
7
|
08h
|
x2
|
2
|
|
8
|
0Ah
|
y2
|
2
|
|
9
|
0Ch
|
hres
|
2
|
Разрешение
дисплея по горизонтали
|
10
|
0Eh
|
vres
|
2
|
Разрешение
дисплея по вертикали
|
11
|
0Fh
|
clrma
|
48
|
Палитра
|
12
|
40h
|
reserved
|
1
|
Резервный байт
|
13
|
41h
|
nplanes
|
1
|
Количество
слоев
|
14
|
42h
|
bplin
|
2
|
Байтов на
строку
|
15
|
44h
|
palinfo
|
2
|
Тип палитры
|
16
|
46h
|
shres
|
2
|
Разрешение
сканера по горизонтали
|
17
|
48h
|
svres
|
2
|
Разрешение
сканера по вертикали
|
18
|
4Ah
|
xtra
|
54
|
Обычно не
используется
|
Рассмотрим подробнее каждое из полей заголовка:
Поле 01 (manuf) содержит некоторое число (например 10 для
"PC Paintbrush" Zsoft Corp.), говорящее о том, в каком из редакторов
создан этот PCX-файл.
Поле 02 (hard) - информация о версии формата.
= версия 2.5
= версия 2.8 с информацией о палитре
= версия 2.8 без информации о палитре
= версия 3.0
Поле 03 (encod) позволяет определить, изменился или нет
способ сжатия данных. До сих пор большинство редакторов заполняет это поле
значением равным 01, свидетельствующим о том, что используется метод
кодирования длинными сериями или метод группового кодирования.
Поле 04 (bitpx) показывает, сколько бит отводится для
сохранения информации о яркости пикселя в слое. Является достаточно удобным
признаком определения (в дополнение к другим признакам) содержит ли данный файл
256-цветную палитру. При значении равном 08 - содержит.
Слой (plan) - совокупность байтов видео-памяти. Количество
слоев зависит от номера установленного видеорежима и, естественно, от
физической организации видеопамяти.
Поля 05.08 (x1, y1, x2, y2) определяют геометрические размеры
картинки в пикселах. Например, если размер картинки 640 пикселов по горизонтали
и 350 по вертикали, то в этих полях будут записаны следующие числа: 0, 0, 639,
349.
Поля 09,10 (hres, vres) позволят узнать разрешающую
способность дисплея, при "участии" которого создавалась та или иная
картинка.
Поле 11 (clrma) хранит информацию о палитре картинки. Данные
хранятся 16-ю триплетами, определяющими значение каждого из 16 регистров
палитры.
Для 256-цветных режимов количество байтов, необходимое для
хранения всей палитры, равно 768, и понятно, что в поле 11 не хватает места для
размещения этого массива. Поэтому эти триплеты располагаются в конце файла
после байта-"маяка", равного 0Ch.
Для того, чтобы попасть на это поле, необходимо:
установить указатель в конец файла;
передвинуть его на 769 байтов назад;
проверить, равен ли адресуемый байт значению 0Сh или 0Ah
(зависит от программы, формировавшей pcx-файл).
Делать это, конечно, необходимо в том случае, если вы
уверены, что pcx-файл содержит 256-цветную палитру.
Байты RGB поля 11 могут принимать значения в диапазоне от 0
до 255.
Поле 13 (nplanes) позволит определить, сколько слоев
видеопамяти в этом режиме, и алгоритм вывода данных на экран.
Подразумевается, что возникает необходимость отслеживания
ситуации заполнения строки и переключения вывода на другой слой.
Поле 14 (bplin) определяет количество байтов на строку внутри
слоя. Под строкой подразумевается последовательность байтов, содержащих
графические данные, из которых строится изображение.
Поле 15 (palinfo) интерпретирует палитру. Если байт равен 01,
то палитра цветная, если 00 - то передаются градации серого.
Поля 16,17,18 (shres, svres, xtra) могут содержать различного
рода дополнительную информацию, которая сильно специфична и, как правило, не
нужна для простых программ, выводящих рекламные картинки. Обычно эти поля
заполняются нулями.
Как было уже сказано, при упаковке данных изображения
используется метод, носящий название "кодирование длинных серий".
Суть метода довольно проста. Каждой повторяющейся последовательности байтов
можно поставить в соответствие код, состоящий из двух байт. Первый из них
является счетчиком повторений байта, стоящего вторым в этом коде. Например,
если есть последовательность из 34 (22h) байтов типа 55h, то вместо этих 34
(22h) байтов в закодированном файле будут стоять два числа: 22h,55h:
Рис.1 Кодирование длинных серий
В файлах PCX возникает необходимость различать
байт-повторитель и байт-эталон. Это связано с тем, что отдельные части
изображения могут состоять из неповторяющихся данных и байт-повторитель в этом
случае отсутствует. Поэтому он должен быть каким-либо способом помечен. Это
можно сделать, установив два старших бита в 11, а оставшиеся 6 битов будут
хранить значение счетчика. Следовательно в файле PCX та же последовательность
из 34 (22h) байтов будет представлена как 0E2h,55h.
Очевиден и способ декодирования данных:
Проверить, равны ли оба старших бита считанного байта 11.
Если равны, то следующий байт необходимо повторить столько раз, сколько
получится из байта-повторителя после обнуления двух его старших битов.
В противном случае это - байт-эталон, и его нужно повторить
один раз.
Отметим, что в случае, когда байт-эталон имеет установленные
стаpшие биты в единицу, то из-за этого он похож на байт-повторитель, и его
пpедваpяют байтом-повтоpителем, pавным единице. Этим снимается неоднозначность
опpеделения типа данных.
Для доступа к 256-цветной палитре следует:
) Прочитать в заголовке поле Version. Если оно равно 5,
палитра должна быть. Или прочитать в заголовке поле Bits per pixel. Если оно
равно 8, 256-цветная палитра должна быть.
) Прочитать конец файла и отсчитать назад 769 байт. Найденное
вами значение должно равняться 12, что указывает на присутствие 256-цветной
палитры.
5. Алгоритм
Рис.1 Блок-схема алгоритма программы
Основные шаги алгоритма представлены в блок-схеме, в тексте
программы есть подробные комментарии.
В процедуре processed проверяются данные в заголовке
исходного файла. если они не удовлетворяют нашим параметрам программа выдаёт
соответствующую ошибку и устанавливает CF =1, по этому флагу в
основной программе анализируется была ли ошибка в процедуре или нет.
Так же происходит запись заголовка из исходного в конечный
файл. Дальше происходит зеркальная запись строки изображения из исходного файла
в конечный.
И в конце процедуры записывается конец исходного файла в
конец конечного. И устанавливается флаг CF=0.
Процедура зеркального отражения строки. В счетчик помещается
длина закодированной строки, посчитанная предварительно. Программа считывает
первый байт строки и проверяет, это байт-эталон или байт-повторитель. Если
эталон - то он сразу помещается в конец новой, инвертированной строки. Из
счетчика вычитается единица. Если же это байт-повторитель, то считывается
следующий байт - байт-эталон. И уже эта пара байт переписывается в конец новой
строки. Счетчик уменьшается на 2. Таким образом, способ кодирования остается
неизменным, так же как и порядок следования пары "эталон -
повторитель".
6.
Тестирование и отладка
Тест №1. Успешное выполнение программы.
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx:
. pcx
Имя выходного файла: <Имя диска>: \<Имя
директории>: \.: \Имя_файла. рсх
или Имя_файла. pcx: 7. pcx
Файл зеркально отображён
Создан выходной файл 7. pcx с зеркально отраженным
изображением
Тест №2. Ошибка открытия исходного файла (введен неверный
адрес).
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx: df. pcx
ошибка открытия исходного файла.
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx:
Тест №3. Ошибка открытия исходного файла (введен неверный
адрес), далее повторный ввод правильного адреса.
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx: df. pcx
ошибка открытия исходного файла.
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx:
. pcx
Имя выходного файла: <Имя диска>: \<Имя
директории>: \.: \Имя_файла. рсх
или Имя_файла. pcx: 7. pcx
Файл зеркально отображён
Создан выходной файл 7. pcx с зеркально отраженным
изображением
Тест №4. Ошибка: введен адрес файла не PCX формата.
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx: auto. jpg
Имя выходного файла: <Имя диска>: \<Имя
директории>: \.: \Имя_файла. рсх
или Имя_файла. pcx: 2. pcx
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx:
Тест №5. Создадим на диске файл формата pcx, не имеющий 256-цветную
палитру.
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx: not256. pcx
Имя выходного файла: <Имя диска>: \<Имя
директории>: \.: \Имя_файла. рсх
или Имя_файла. pcx: 4. pcx
Ошибка, в файле PCX не 256-цветная палитра.
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx:
Тест №6. Создадим на диске файл формата pcx, закодированного
длинными сериями.
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx: rle. pcx
Имя выходного файла: <Имя диска>: \<Имя директории>:
\.: \Имя_файла. рсх
или Имя_файла. pcx: t. pcx
Ошибка, PCX файл закодирован длинными сериями.
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx:
Тест №8. Создадим на диске файл формата pcx, не 3.0 версии.
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx: novers3. pcx
Имя выходного файла: <Имя диска>: \<Имя
директории>: \.: \Имя_файла. рсх
или Имя_файла. pcx: 32. pcx
Ошибка, PCX файл не 3 версии.
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx:
Тест №9. Ошибка создания файла (введен неверный адрес)
Введите имя исходного файла пример:
<Имя диска>: \<Имя директории>: \.: \Имя_файла.
рсх
или Имя_файла. pcx:
. pcx
Имя выходного файла: <Имя диска>: \<Имя
директории>: \.: \Имя_файла. рсх
или Имя_файла. pcx: T: \1. pcx
ошибка создания конечного файла.
Имя выходного файла: <Имя диска>: \<Имя
директории>: \.: \Имя_файла. рсх
или Имя_файла. pcx:
Заключение
В данном курсовом проекте была разработана программа,
реализующая зеркальное отражение изображения формата PCX относительно
вертикальной оси, что явно отображает структуру формата PCX. Программа может быть
улучшена за счет расширения диапазона обрабатываемых файлов: не только с
256-цветной палитрой, но и других: с большим количеством слоёв, а значит, и
цветов. Также можно немного дополнить код программы, введя отражение
относительно горизонтальной оси, реализовав это путем перестановки строк.
Список
используемой литературы
1.
Абель П. Ассемблер. Язык и программирование для IBM PC / Пер. с англ. - К.:
Век+, М.: ЭНТРОП, М.: Корона-ВЕК, 2007. - 736 с.
2.
http://www.wasm.ru/article. php? article=1008002
<http://www.wasm.ru/article.php?article=1008002> - описание формата РСХ
Приложение
Листинг
программы
;; -
-------------------------макроподстановки---------------------------------------_ARCHIVEequ
0; атрибут файла_READequ 0; только чтение файла_WRITEequ 1; запись
файла_RDWRequ 2; запись и чтение файла
FILE_BEGINequ 0; начало файла_ENDequ 2; конец файла.
; - -------------------------Основная
программа-------------------------------------
.286
. model small, stdcall; stdcall - тип оформления вызова
процедур
; по умолчанию (параметры передаються через стек в
; обратном порядке, и освобождаются выполняемой программой)
; Аргументы передаются через стек, справа налево.
; Очистку стека производит вызываемая подпрограмма.
. stack 100h
. datadb 'Введите имя исходного файла пример: ',13,10, '<Имя
диска>: \<Имя директории>: \.: \Имя_файла. рсх ',13,10,'или Имя_файла.
pcx: ',0db 'Ошибка, введен адрес файла не PCX формата',13,10,13,10,0db 'Ошибка,
PCX файл не 3 версии. ',13,10,13,10,0db 'Ошибка, PCX файл не закодирован
длинными сериями. ',13,10,13,10,0db 'Ошибка, в файле PCX не 256-цветная
палитра. ',13,10,13,10,0db 13,10,'Файл зеркально отображён!!! ',13,10, 'Для
выхода из программы нажмите любую клавишу',13,10,0db 'Ошибка открытия исходного
файла. ',13,10,13,10,0db 'Ошибка создания конечного файла. ',13,10,13,10,0db
'Имя выходного файла: <Имя диска>: \<Имя директории>: \.:
\Имя_файла. рсх ',13,10,'или Имя_файла. pcx: ',0
counterdw?; Счетчик байтdb 80 dup (0); Имя исходного
файлаdb 80 dup (0); Имя конечного файлаdb 128 dup (0); буферdb 0; буфер для 769
байта с конца файла_in dw?; Дескриптор исходного файла_count dw?; Счетчик для
количества строк_len dw?; Длина несжатой строки, байт_pos dw?; Счетчик байтов для
подсчета длины строкиdb 2000 dup (?); Исходная строкаdb 2000 dup (?);
Отраженная строка
. codeprocax, @data; стандартная иницилизация.
mov ds, ax
mov es, ax
lpa:
call asmout, offset m0; вывод приветстия
call asmin, offset bf1, 80; ввод имени файлаax, ax; не введено имя
файлаlpa; повтор ввода исх файла
call fopen, offset bf1, FILE_READ; открытия файлаq0; продолжениеasmout, offset
m7; Вывод ошибки no m1
jmp lpa; повтор запроса ввода:dx, ax; сохраняем в dx хэндл
входного файла:asmout, offset m9; вывод сообщения m9asmin, offset bf2, 80;
записываем в буфер bf адрес выходного файлаax, ax; проверкаl0; в случае ошибки
запрос на ввод файла
call fopen, offset bf2, FILE_WRITE; открытие файла для записиok; переход по метки
okfcreate, offset bf2, FILE_ARCHIVE; если файл нельзя открыть создаём файлok;
переход по метки okasmout, offset m8; вывод сообщения m8l0:cx, ax; сохраняем в
сx хэндл выходного файла
call processed, dx, cx; запуск функции processed с передачей
; хэндлов 2 файлов; сохранение регистра флагов в стекvs; если
CF=1 то переход по метке vsasmout, offset m6; вывод сообщения 'Файл зеркально
отображён':fclose, cx; закрытие файлов по хэндлуfclose, dx; востановление
регистра флагов в стекer; сканируя в прямом направленииsi, bf1; начиная с 1го
элемента BUFFER1di, bf2; и с 1го элемента BUFFER2,cmpsw; сравниваем их.ttt;
флаг ZF = 0, если сравниваемые строки не совпадаютfdelete, offset bf2; удаление
в случая ошибки в processed: jmp lpa:ah, 08h; ожиданеи нажатия клавишы
int 21h
xor al, al
call exit; Вызов процедуры exit
; in [par0 = хэндл исходного файла; par1 = хэндл выходного
файла]
; out [cf = сигнал ошибки]
; api []
; txt []
;; - -------------------------процедуры -
----------------------------------------------
processed proc
pusha; ax, cx, dx, bx, sp, bp, si, di
mov bp, sp
call fread, word ptr [bp+18], offset b1, 128; [bp+18] = хэндл файла;
чтение заголовка исх файла
call fseek, word ptr [bp+18], - 769, - 1, FILE_END; переход к 769 байта с
конца файла
call fread, word ptr [bp+18], offset tb, 1; чтение 769 байта в tbfseek, word ptr
[bp+18], 128, 0, FILE_BEGIN; переход в конец заголовка (128байт)
cmp b1 [0], 10; проверка на постоянный флагe0; если ошибка -
переход по метке e0b1 [1], 5; Проверка версии (3.0 - 256-цветная палитра)e1;
ошибка - переход по метке e1b1 [2], 1; проверка метода кодированияe2; ошибка -
переход по метке e2b1 [3], 8; проверка числа бит на пиксель (если 8, то
256-цветная палитра)e3; ошибка - переход по метке e3tb, 12; проверка числа 12
(если 12, то 256-цветная палитра)e3; ошибка - переход по метке e3fwrite, word
ptr [bp+20], offset b1, 128; [bp+20] = хэндл файла; запись заголовка в
; выходной файлdx, word ptr b1 [8]; dx = длина строкиcx, word
ptr b1 [10]; сx = кол-во строк
inc cxdxstr_len, dxax,word ptr [bp+18]descr_in,
ax_count,cx
fd: call Read_String; Вызов процедуры чтения строки и
подсчета ее длины
call Mirror
call fwrite, word ptr [bp+20], offset strout, counter; запись в файл
прочитаннгого числа байт (cx)_count; уменьшаем число оставшихся
строк_count,0; если строки не кончились - обрабатываем следующую
jnefdlp:asmout, offset m1; уставока кери флага (CF)
jmp ex:asmout, offset m2
stc; уставока кери флага (CF)
jmp ex:asmout, offset m3
stc; уставока кери флага (CF)
jmp ex:asmout, offset m4
stc; уставока кери флага (CF)
jmp ex:fread, word ptr [bp+18], offset b1, 128; читаем 128 байт cx, ax; cx=ax
test cx, cx; если cx =0 то ex
jz ex
call fwrite, word ptr [bp+20], offset b1, cx; запись в файл
прочитаннгого числа байт (cx)cx, 128; если прочитано 128 то повторитьlp;;
очистка cf флага
ex:
popa; di, si, bp, sp, bx, dx, cx, ax4; т.к. передавали 2 параметра в процедуру_String
proc; Процедура чтения строки и подсчета ее длиныbp,0; обнуляем счетчик байтов
закодированной строки,strin; В dx - адрес начала строки - буфера,str_len; В cх
- длина строки_pos,cx,descr_in; установка дескриптора входного файла: mov
ah,3Fh; функция чтения записи из файла (в bx - дескриптор,,1; количество
считываемых байт = 1h; в dx - адрес области ввода,dx, [si]; считываем байт
закодированной строки,11000000b; если 2 старших разряда - 11, то они
обнулятся,11000000b; если 0 (старшие биты были равны 11), то обрабатываем
повторитель
; если не 0, то это - байт-эталон,11000000b; восстанавливаем
старшие биты_pos; уменьшаем счетчик байтовdx; в dx - адрес следующего байта;
увеличиваем счетчик байтов закодированной строки_pos,0; если строка не
кончилась, то читаем следующий байт; если кончилась - выходим из процедуры:
xoral,11000000b; восстанавливаем старшие биты,00111111b; находим число
повторений,0_pos,ax; уменьшаем счетчик байтов на число повторенийdx; в dx -
адрес следующего байта (эталона); увеличиваем счетчик байтов закодированной
строкиah,3Fh; функция чтения записи из файлаh; читаем байт-эталон, следующий за
повторителемdx; в dx - адрес следующего байта; увеличиваем счетчик байтов
закодированной строки_pos,0; если строка не кончилась - обрабатываем следующий
байт:bp; возврат из процедуры_String endpproc; Процедура зеркального
отображения строки (инвертирования),strin; в si адрес начала исходной
строки,strout; в di адрес начала инвертированной строки,counter; в cx - длина
строки в байтах,cx; переходим в конец новой строки: moval, [si]; считываем байт
из исходной строки,11000000b; если 2 старших разряда равны 11, то они
обнулятся,11000000b; если 0 (старшие биты были равны 11), то обрабатываем
повторитель
; если не 0, то это - байт-эталон,11000000b; восстанавливаем
старшие биты[di],al; записываем байт в инвертированную строку; переходим к
следующему байту; обработка следующего байта, если строка не кончиласьexitp4;
если кончилась - выход: xoral,11000000b; восстанавливаем старшие биты, [si+1];
считываем байт-эталон в регистр ah[di-1],al; записываем 2 байта в
инвертированную строку[di],ah,2; сдвигаемся на 2 байта от конца инвертированной
строки,2; сдвигаемся на 2 байта от начала исходной строки; если строка не
кончилась, обрабатываем следующий байт: ret; возврат из процедурыendp
; in [par0 = адрес сообщения]
; out [cf = сигнал ошибки]
; api [DOS 40h]
; txt [вывод сообщения на экран используя файловый хэндлинг]
asmout procaxcxdxbxbpbp, spax, 4000h;
bx>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>bxdx,
[bp+12]; адрес сообщения dxbx, dx;
V--------------------------------0:al, [bx]; al=0, пока [bx]! =0 цикл
inc bxlbx, dx; bx - адрес послед. символа, - cx, [bx-1]; т.к.
считали 0.
mov bx, 0001h; в bx =121h
pop bpbxdx
pop cxax2
; in [par0 = адрес буфера; par1 = длина буфера]
; out [cf = сигнал ошибки; ax = код ошибки при cf = 1 или
количество символов в буфере при cf = 0]
; api [DOS 3Fh]
; txt [ввод в буфер с клавиатуры используя файловый
хэндлинг]proccx; извлекаем из стекаdx; извлекаем из стекаbp; извлекаем из
стекаbp, spah, 3Fh; чтение записи из файлаdx, [bp+8]; адрес буфераcx, [bp+10];
длина буфераbx,0; дескриптор клавиатуры21haxaxbx, [bp+8]; адрес буфера
pushfbx, axdx, dx[bx], dxbpdxcx4
; in [par0 = адрес имени файла; par1 = атрибуты]
; out [cf = сигнал ошибки; ax = код ошибки при cf = 1]
; api [DOS 3Ch]
; txt [создание файла используя файловый хэндлинг]
fcreate proccxdx
push bpbp, sp; сохраним указатель вершины стека в bpdx,
[bp+8]; указатель на имя файлаcx, [bp+10]; режим создания файла
mov ah, 3Ch21hbpdxcx4
endp
; in [par0 = адрес имени файла; par1 = режим доступа]
; out [cf = сигнал ошибки; ax = код ошибки при cf = 1 или
хэндл открытого файла при cf = 0]
; api [DOS 3Dh]
; txt [открытие файла используя файловый хэндлинг]
fopen procdxbp
mov bp, sp; сохраним указатель вершины стека в bpdx, [bp+6];
указатель на имя файлаax, [bp+8]; режим открытия файлаah, 3Dh; открытие
файла21h
pop bp
pop dx
retn 4
endp
; in [par0 = хэндл файла]
; out [cf = сигнал ошибки; ax = код ошибки при cf = 1]
; api [DOS 3Eh]
; txt [закрытие файла используя файловый хэндлинг]
fclose procbxbp
mov bp, sp; сохраним указатель вершины стека в bpbx, [bp+6];
хендл файлаah, 3Eh; закрытие файла
int 21hbpbx2
; in [par0 = хэндл файла, par1 = буфер в который читаем, par2 = кол-во байт,]
; out [cf = сигнал ошибки; ax = код ошибки при cf = 1 или
количество символов в буфере при cf = 0]
; api [DOS 3Fh]
; txt [Считываем из файла по хэндл файла в буфер нужное нам
кол-во байт]
fread proccxdxbxbpbp, spah, 3Fh; чтение файлаbx, [bp+10]; хэндл файла
mov cx, [bp+14]; количество байт для чтенияdx, [bp+12]; адрес
буфера в который читаем
int 21hbpbx
pop dxcx6
endp
; in [par0 = хэндл файла, par1 = буфер из которого
записываем, par2 = кол-во байт,]
; out [cf = сигнал ошибки; при cf = 1 ошибка, при cf = 0
количество записанных байт]
; api [DOS 40h]
; txt [Записываем в файл по хэндл файла из буфера нужное нам
кол-во байт]
fwrite proccxdxbxbpbp, sp
mov ah, 40h; запись в файлbx, [bp+10]; хэндл файлаcx,
[bp+14]; количество байт для записиdx, [bp+12]; адрес сообщения21h
pop bpbxdxcx6
; in [par0 = хэндл файла, par1 = младшая часть смещения, par2 = старшая часть смещения, par3 = смещение (0,1,2)]
; out [cf = сигнал ошибки; при CF = 1 и AX = 01 ошибка кода
отсчета или
; при AX = 06 ошибка файлового номера.]
; api [DOS 42h]
; txt [Записываем в файл по хэндл файла из буфера нужное нам
кол-во байт]
fseek proccxbx
push bpbp, spax, [bp+14]; режим установки указателяbx,
[bp+8]; хэндл файлаcx, [bp+12]; старшая часть.dx, [bp+10]; младшая часть.
;. смещенияah, 42h; Управление файловым указателем:
int 21hbpbx
pop cx8
; in [par0 = буфер]
; out [cf = сигнал ошибки; при CF = 1 и AX = 02 файл не
найден
; AX = 03 путь не найден. AХ = 05 доступ запрещен
; CF=0 файл удалён]
; api [DOS 41h]
; txt [Удаляем файл]procdxbpbp, spah, 41h; Функция 41h (Удалить файл)
mov dx, [bp+6]; [bp+6] адрес ASCIZ-строки с полным именем
файла
int 21hbpdx
retn 2
; in [al = код выхода]
; out [no return]
; api [DOS 4Ch]
; txt [завершение программы]procah, 4Ch21hmain