Зеркальное отображение изображения, хранящегося в файле PCX (256 цветов)

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    344,1 Кб
  • Опубликовано:
    2013-05-17
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Зеркальное отображение изображения, хранящегося в файле PCX (256 цветов)

МОСКОВСКИЙ ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ

(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)

ИНСТИТУТ АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ

Кафедра ВМСС







КУРСОВАЯ РАБОТА

по Системному программному обеспечению.

"Зеркальное отображение изображения, хранящегося в файле PCX (256 цветов)”



Выполнил: студент Мельник Д.О.

Проверил: Гольцов А.Г.




Москва, 2010 г.

Содержание

Введение

1. Анализ задания

2. Проектирование пользовательского интерфейса

2.1 Выбор способа осуществления ввода-вывода, наиболее соответствующего решаемой задаче

2.2 Особенности программной реализации

3. Выбор формата представления данных

4. Описание формата РСХ

5. Алгоритм

6. Тестирование и отладка

Заключение

Список используемой литературы

Приложение

Введение


Задача зеркального отражения изображения - это одна из подзадач многих программ, работающих с изображениями (Paint, Adobe Photoshop, ACDSee - самые распространенные из них).

И хотя формат. PCX в настоящее время не так часто используется, как, например,. JPG,. BMP и. GIF, но работа с форматом. PCX дает представление о методах сжатия графических файлов и, безусловно, полезна в плане приобретения новых навыков программирования на языке ассемблера и демонстрации навыков, приобретенных в течение семестра. В данной программе использованы различные функции для работы с файлами, процедуры.

зеркальное отражение изображение пользовательский

1. Анализ задания


Необходимо написать программу, выполняющую зеркальное отображение изображения, хранящегося в файле PCX (256 цветов). Данные остаются в старом файле или записываются в новый.

Поскольку в формате. PCX используется кодирование по строкам, то зеркальное отображение изображения означает инверсию каждой строки.

Так как кодирование происходит не длинными сериями мы можем сразу узнать длину каждой строки. Она у нас будет одинаковая.

Нужно учитывать что пользователь может в программе ввести некорректный адрес файла (отсутствия файла на диске), неверной информации о палитре и др. исключения, описанные ниже.

Разобьем нашу задачу на подзадачи:

         Открытие входного файла.

-        Открытие выходного файла.

         Создание выходного файла, в случае если он отсутствует.

         Анализ входного файла.

         Запись заголовка в выходной файл.

         Побайтовое считывание строки исходного файла

         Инвертирование строки

         Побайтовая запись строки в конечный файл

         Чтение информации о палитре из исходного файла и запись их в конец выходного файла

         Закрытие файлов

Для данной программы необходимо установить следующие ограничения:

) Т.к. адрес указателя в файле не может занимать больше 32 бит, то файл может быть не больше 232=4Гб. Это очень много для файлов PCX формата, так что можно считать, что ограничений на размер нет

В адресе файла должен быть указан полный путь к нему в формате:

<Имя диска>: \<Имя директории>: \.: \Имя_файла. рсх

) Если файл лежит в том же каталоге, что и исполняемая программа, то путь указывать не нужно. Длина строки не должна превышать 80 символов. Это объясняется тем, что максимальная длина строки в DOS - 80 символов. В адресе файла не должно содержаться пробелов.

) Изображение должно быть с 256-цветной палитрой (8 бит на пиксель и один слой) без кодирования.

 


2. Проектирование пользовательского интерфейса


2.1 Выбор способа осуществления ввода-вывода, наиболее соответствующего решаемой задаче


В данной задаче входными данными являются адреса входного и выходного файлов, а выходными - отраженный файл - в случае успешного выполнения программы - или сообщение об ошибке. Для удобства пользователя ввод адреса осуществляется с клавиатуры. Сообщения об ошибке формируются, если:

         Если исходного файла не существует

-        В файле нет признака РСХ формата

         Файл с неправильным способом кодирования

         Палитра не соответствует условию задачи (не 256 цветов)

         Произошла ошибка при создании выходного файла

 

.2 Особенности программной реализации


Как было сказано выше, программа работает с файлами, а также ведется диалог с пользователем посредством вывода сообщений на экран и ввода данных с клавиатуры. Для выполнения этих действий в программе используются различные функции прерывания 21h.

1. Вывод Z-строки на экран

Функция 40h прерывания INT 21h.

В bx указываем 0001h (STDOUT) для вывода на экран.

В dx помещается адрес выводимой строки, завершающийся знаком ‘0’.

В cx дину строки без учёта знака Z строки.

2. Чтение адреса с экрана

Функциия 3Fh прерывания INT 21h.

Для ввода адреса с клавиатуры в bx нужно поместить 0 - дескриптор клавиатуры, в сх - число считанных байт (максимальное для строки 80), в dx - адрес области ввода.

3. Создание файла

Функция 3Сh прерывания INT 21h.

Для создания файла необходимо в dx поместить адрес файла, cx - атрибут файла.

4. Открытие файла

Функция 3Dh прерывания INT 21h.

Для открытия файла необходимо в al поместить режим доступа:, dx - адрес файла.

5. Закрытие файла.

Функция 3Eh прерывания INT 21h.

Для закрытия файла необходимо в bx поместить идентификатор (хэндл) файла.

6. Чтения файла.

Функция 3Fh прерывания INT 21h.

Для чтения файла необходимо в bx поместить идентификатор (хэндл) файла, cx - кол-во байт для считывания, dx - адрес буфера для приема данных.

7. Запись в файл.

Функция 40h прерывания INT 21h.

Для записи в файл необходимо в bx поместить идентификатор (хэндл) файла, cx - кол-во байт для записи, dx - адрес начала строки.

8. Перемещение указателя файла

Функция 42h прерывания INT 21h.

В bx помещается дескриптор требуемого файла, а требуемое смещение - в пару cx: dx. В al помещается код метода: с какой точки начинать смещение. в данной программе используются следующие значения этого кода: 00 - с начала файла и 02 - с конца файла. Новый адрес указателя помещается в dx: ax.

9. Удаление файла

Функция 41h прерывания INT 21h

Для удаления файла, в dx необходимо поместить адрес файла.

10. Завершить программу

Функция 4Ch прерывания INT 21h.

11. Пауза в конце программы.

Функция 08h прерывания INT 21h.

Считать символ из STDIN без эха, с ожиданием и проверкой на Ctrl+Break.

3. Выбор формата представления данных


Таблица 1

Сообщения, выводимые на экран

Имя переменной

Тип

Содержание

m0

byte

Введите имя исходного файла пример: <Имя диска>: \<Имя директории>: \.: \Имя_файла. рсх или Имя_файла. pcx:

m1

byte

Ошибка, введен адрес файла не PCX формата

m2

byte

Ошибка, PCX файл не 3 версии.

m3

byte

Ошибка, PCX файл не закодирован длинными сериями.

m4

byte

Ошибка, в файле PCX не 256-цветная палитра.

m6

byte

Файл зеркально отображён.

m7

byte

ошибка открытия исходного файла.

m8

byte

ошибка создания конечного файла.

m9

byte

Введите имя конечного файла пример: <Имя диска>: \<Имя директории>: \.: \Имя_файла. рсх или Имя_файла. pcx:


Таблица 2

Данные

Имя переменной

Тип

Назначение

bf1

word

Имя исходного файла

bf2

word

Имя конечного файла

b1

word

Буфер

tb

byte

Буфер для 769 байта с конца файла

descr_in

byte

Дескриптор исходного файла

str_count

byte

Счетчик для количества строк

str_len

byte

Длина несжатой строки, байт

str_pos

byte

Счетчик байтов для подсчета длины строки

strin

word

Исходная строка

strout

word

Отраженная строка

 

Остальные данные для работы программы хранятся в стеки.

Так же при написание программы были использованы макроподставновки

FILE_ARCHIVEequ 0 - атрибут файла

FILE_READequ 0 - только чтение файла

FILE_WRITEequ 1 - запись файла

FILE_RDWRequ 2 - запись и чтение файла

FILE_BEGINequ 0 - начало файла_ENDequ 2 - конец файла.

4. Описание формата РСХ


Формат PCX использует простейший способ сжатия изображений, позволяющий выполнять быструю перезапись изображения из файла в видеопамять и обратно.

Формат PCX постоянно совершенствуется, а также в зависимости от программного продукта может быть несколько модифицирован.

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

В 256-цветных форматах присутствует третья часть - информация о палитре. В таблице 3 представлена структура файла формата РСХ с 256-цветной палитрой.

Таблица 3

Структура файла

раздел файла

размер, байт

заголовок файла

128

упакованные данные

размер файла - (128+769)

дополнительные данные для 256-цветных режимов

769


Заголовок файла - это набор структурированных полей фиксированной длины. В таблице 4 представлен формат заголовка файла.

Таблица 4

Формат заголовка файла PCX

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

Похожие работы на - Зеркальное отображение изображения, хранящегося в файле PCX (256 цветов)

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!