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

Задача зеркального отражения изображения как одна из подзадач многих программ. Анализ создания программы, выполняющей зеркальное отображение изображения, который хранится в файле формата .pcx (256 цветов). Проектирование пользовательского интерфейса.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 17.05.2013
Размер файла 625,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

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

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

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

Кафедра ВМСС

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

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

"Зеркальное отображение изображения, хранящегося в файле 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 используется кодирование по строкам, то зеркальное отображение изображения означает инверсию каждой строки.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.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 - начало файла

FILE_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) - информация о версии формата.

0 = версия 2.5

2 = версия 2.8 с информацией о палитре

3 = версия 2.8 без информации о палитре

5 = версия 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-цветной палитре следует:

1) Прочитать в заголовке поле Version. Если оно равно 5, палитра должна быть. Или прочитать в заголовке поле Bits per pixel. Если оно равно 8, 256-цветная палитра должна быть.

2) Прочитать конец файла и отсчитать назад 769 байт. Найденное вами значение должно равняться 12, что указывает на присутствие 256-цветной палитры.

5. Алгоритм

Рис.1 Блок-схема алгоритма программы

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

В процедуре processed проверяются данные в заголовке исходного файла. если они не удовлетворяют нашим параметрам программа выдаёт соответствующую ошибку и устанавливает CF =1, по этому флагу в основной программе анализируется была ли ошибка в процедуре или нет.

Так же происходит запись заголовка из исходного в конечный файл. Дальше происходит зеркальная запись строки изображения из исходного файла в конечный.

И в конце процедуры записывается конец исходного файла в конец конечного. И устанавливается флаг CF=0.

Процедура зеркального отражения строки. В счетчик помещается длина закодированной строки, посчитанная предварительно. Программа считывает первый байт строки и проверяет, это байт-эталон или байт-повторитель. Если эталон - то он сразу помещается в конец новой, инвертированной строки. Из счетчика вычитается единица. Если же это байт-повторитель, то считывается следующий байт - байт-эталон. И уже эта пара байт переписывается в конец новой строки. Счетчик уменьшается на 2. Таким образом, способ кодирования остается неизменным, так же как и порядок следования пары "эталон - повторитель".

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

Тест №1. Успешное выполнение программы.

Введите имя исходного файла пример:

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

или Имя_файла. pcx:

1. pcx

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

или Имя_файла. pcx: 7. pcx

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

Создан выходной файл 7. pcx с зеркально отраженным изображением

Тест №2. Ошибка открытия исходного файла (введен неверный адрес).

Введите имя исходного файла пример:

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

или Имя_файла. pcx: df. pcx

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

Введите имя исходного файла пример:

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

или Имя_файла. pcx:

Тест №3. Ошибка открытия исходного файла (введен неверный адрес), далее повторный ввод правильного адреса.

Введите имя исходного файла пример:

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

или Имя_файла. pcx: df. pcx

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

Введите имя исходного файла пример:

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

или Имя_файла. pcx:

1. pcx

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

или Имя_файла. pcx: 7. pcx

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

Создан выходной файл 7. pcx с зеркально отраженным изображением

Тест №4. Ошибка: введен адрес файла не PCX формата.

Введите имя исходного файла пример:

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

или Имя_файла. pcx: auto. jpg

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

или Имя_файла. pcx: 2. pcx

Ошибка, введен адрес файла не 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:

1. pcx

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

или Имя_файла. pcx: T: \1. pcx

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

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

или Имя_файла. pcx:

Заключение

В данном курсовом проекте была разработана программа, реализующая зеркальное отражение изображения формата PCX относительно вертикальной оси, что явно отображает структуру формата PCX. Программа может быть улучшена за счет расширения диапазона обрабатываемых файлов: не только с 256-цветной палитрой, но и других: с большим количеством слоёв, а значит, и цветов. Также можно немного дополнить код программы, введя отражение относительно горизонтальной оси, реализовав это путем перестановки строк.

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

1. Абель П. Ассемблер. Язык и программирование для IBM PC / Пер. с англ. - К.: Век+, М.: ЭНТРОП, М.: Корона-ВЕК, 2007. - 736 с.

2. http://www.wasm.ru/article. php? article=1008002 - описание формата РСХ

Приложение

Листинг программы

;; - -------------------------макроподстановки---------------------------------------

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

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

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

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

FILE_BEGINequ 0; начало файла

FILE_ENDequ 2; конец файла.

; - -------------------------Основная программа-------------------------------------

.286

. model small, stdcall; stdcall - тип оформления вызова процедур

; по умолчанию (параметры передаються через стек в

; обратном порядке, и освобождаются выполняемой программой)

; Аргументы передаются через стек, справа налево.

; Очистку стека производит вызываемая подпрограмма.

. stack 100h

. data

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

m1 db 'Ошибка, введен адрес файла не PCX формата',13,10,13,10,0

m2 db 'Ошибка, PCX файл не 3 версии. ',13,10,13,10,0

m3 db 'Ошибка, PCX файл не закодирован длинными сериями. ',13,10,13,10,0

m4 db 'Ошибка, в файле PCX не 256-цветная палитра. ',13,10,13,10,0

m6 db 13,10,'Файл зеркально отображён!!! ',13,10, 'Для выхода из программы нажмите любую клавишу',13,10,0

m7 db 'Ошибка открытия исходного файла. ',13,10,13,10,0

m8 db 'Ошибка создания конечного файла. ',13,10,13,10,0

m9 db 'Имя выходного файла: <Имя диска>: \<Имя директории>: \.: \Имя_файла. рсх ',13,10,'или Имя_файла. pcx: ',0

counterdw?; Счетчик байт

bf1 db 80 dup (0); Имя исходного файла

bf2 db 80 dup (0); Имя конечного файла

b1 db 128 dup (0); буфер

tb db 0; буфер для 769 байта с конца файла

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

str_count dw?; Счетчик для количества строк

str_len dw?; Длина несжатой строки, байт

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

strin db 2000 dup (?); Исходная строка

strout db 2000 dup (?); Отраженная строка

. code

main proc

mov ax, @data; стандартная иницилизация.

mov ds, ax

mov es, ax

lpa:

call asmout, offset m0; вывод приветстия

call asmin, offset bf1, 80; ввод имени файла

test ax, ax; не введено имя файла

jz lpa; повтор ввода исх файла

call fopen, offset bf1, FILE_READ; открытия файла

jnc q0; продолжение

call asmout, offset m7; Вывод ошибки no m1

jmp lpa; повтор запроса ввода

q0:

mov dx, ax; сохраняем в dx хэндл входного файла

l0:

call asmout, offset m9; вывод сообщения m9

call asmin, offset bf2, 80; записываем в буфер bf адрес выходного файла

test ax, ax; проверка

jz l0; в случае ошибки запрос на ввод файла

call fopen, offset bf2, FILE_WRITE; открытие файла для записи

jnc ok; переход по метки ok

call fcreate, offset bf2, FILE_ARCHIVE; если файл нельзя открыть создаём файл

jnc ok; переход по метки ok

call asmout, offset m8; вывод сообщения m8

jmp l0

ok:

mov cx, ax; сохраняем в сx хэндл выходного файла

call processed, dx, cx; запуск функции processed с передачей

; хэндлов 2 файлов

pushf; сохранение регистра флагов в стек

jc vs; если CF=1 то переход по метке vs

call asmout, offset m6; вывод сообщения 'Файл зеркально отображён'

vs:

call fclose, cx; закрытие файлов по хэндлу

call fclose, dx

popf; востановление регистра флагов в стек

jnc er

cld; сканируя в прямом направлении

lea si, bf1; начиная с 1го элемента BUFFER1

lea di, bf2; и с 1го элемента BUFFER2,cmpsw; сравниваем их.

je ttt; флаг ZF = 0, если сравниваемые строки не совпадают

call fdelete, offset bf2; удаление в случая ошибки в processed

ttt: jmp lpa

er:

mov ah, 08h; ожиданеи нажатия клавишы

int 21h

xor al, al

call exit; Вызов процедуры exit

endp

; 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 байта в tb

call fseek, word ptr [bp+18], 128, 0, FILE_BEGIN; переход в конец заголовка (128байт)

cmp b1 [0], 10; проверка на постоянный флаг

jnz e0; если ошибка - переход по метке e0

cmp b1 [1], 5; Проверка версии (3.0 - 256-цветная палитра)

jnz e1; ошибка - переход по метке e1

cmp b1 [2], 1; проверка метода кодирования

jnz e2; ошибка - переход по метке e2

cmp b1 [3], 8; проверка числа бит на пиксель (если 8, то 256-цветная палитра)

jnz e3; ошибка - переход по метке e3

cmp tb, 12; проверка числа 12 (если 12, то 256-цветная палитра)

jnz e3; ошибка - переход по метке e3

call fwrite, word ptr [bp+20], offset b1, 128; [bp+20] = хэндл файла; запись заголовка в

; выходной файл

mov dx, word ptr b1 [8]; dx = длина строки

mov cx, word ptr b1 [10]; сx = кол-во строк

inc cx

inc dx

mov str_len, dx

mov ax,word ptr [bp+18]

mov descr_in, ax

movstr_count,cx

fd: call Read_String; Вызов процедуры чтения строки и подсчета ее длины

call Mirror

call fwrite, word ptr [bp+20], offset strout, counter; запись в файл прочитаннгого числа байт (cx)

decstr_count; уменьшаем число оставшихся строк

cmpstr_count,0; если строки не кончились - обрабатываем следующую

jnefd

jmp lp

e0:

call asmout, offset m1

stc; уставока кери флага (CF)

jmp ex

e1:

call asmout, offset m2

stc; уставока кери флага (CF)

jmp ex

e2:

call asmout, offset m3

stc; уставока кери флага (CF)

jmp ex

e3:

call asmout, offset m4

stc; уставока кери флага (CF)

jmp ex

lp:

call fread, word ptr [bp+18], offset b1, 128; читаем 128 байт

mov cx, ax; cx=ax

test cx, cx; если cx =0 то ex

jz ex

call fwrite, word ptr [bp+20], offset b1, cx; запись в файл прочитаннгого числа байт (cx)

cmp cx, 128; если прочитано 128 то повторить

jz lp;

clc; очистка cf флага

ex:

popa; di, si, bp, sp, bx, dx, cx, ax

retn 4; т.к. передавали 2 параметра в процедуру

endp

Read_String proc; Процедура чтения строки и подсчета ее длины

push bp

movcounter,0; обнуляем счетчик байтов закодированной строки

leadx,strin; В dx - адрес начала строки - буфера

movcx,str_len; В cх - длина строки

movstr_pos,cx

movbx,descr_in; установка дескриптора входного файла

read1: mov ah,3Fh; функция чтения записи из файла (в bx - дескриптор,

movcx,1; количество считываемых байт = 1

int21h; в dx - адрес области ввода

movsi,dx

moval, [si]; считываем байт закодированной строки

xoral,11000000b; если 2 старших разряда - 11, то они обнулятся

testal,11000000b

jzread2; если 0 (старшие биты были равны 11), то обрабатываем повторитель

; если не 0, то это - байт-эталон

xoral,11000000b; восстанавливаем старшие биты

decstr_pos; уменьшаем счетчик байтов

inc dx; в dx - адрес следующего байта

inccounter; увеличиваем счетчик байтов закодированной строки

cmpstr_pos,0

jneread1; если строка не кончилась, то читаем следующий байт

jmpexitp3; если кончилась - выходим из процедуры

read2: xoral,11000000b; восстанавливаем старшие биты

andal,00111111b; находим число повторений

movah,0

substr_pos,ax; уменьшаем счетчик байтов на число повторений

inc dx; в dx - адрес следующего байта (эталона)

inccounter; увеличиваем счетчик байтов закодированной строки

mov ah,3Fh; функция чтения записи из файла

int21h; читаем байт-эталон, следующий за повторителем

inc dx; в dx - адрес следующего байта

inccounter; увеличиваем счетчик байтов закодированной строки

cmpstr_pos,0

jneread1; если строка не кончилась - обрабатываем следующий байт

exitp3:

pop bp

ret; возврат из процедуры

Read_String endp

Mirror proc; Процедура зеркального отображения строки (инвертирования)

leasi,strin; в si адрес начала исходной строки

leadi,strout; в di адрес начала инвертированной строки

movcx,counter; в cx - длина строки в байтах

adddi,cx; переходим в конец новой строки

decdi

mir1: moval, [si]; считываем байт из исходной строки

xoral,11000000b; если 2 старших разряда равны 11, то они обнулятся

testal,11000000b

jzmir2; если 0 (старшие биты были равны 11), то обрабатываем повторитель

; если не 0, то это - байт-эталон

xoral,11000000b; восстанавливаем старшие биты

mov [di],al; записываем байт в инвертированную строку

decdi; переходим к следующему байту

incsi

loopmir1; обработка следующего байта, если строка не кончилась

jmp exitp4; если кончилась - выход

mir2: xoral,11000000b; восстанавливаем старшие биты

movah, [si+1]; считываем байт-эталон в регистр ah

mov [di-1],al; записываем 2 байта в инвертированную строку

mov [di],ah

subdi,2; сдвигаемся на 2 байта от конца инвертированной строки

addsi,2; сдвигаемся на 2 байта от начала исходной строки

loopmir1; если строка не кончилась, обрабатываем следующий байт

exitp4: ret; возврат из процедуры

Mirror endp

; in [par0 = адрес сообщения]

; out [cf = сигнал ошибки]

; api [DOS 40h]

; txt [вывод сообщения на экран используя файловый хэндлинг]

asmout proc

push ax

push cx

push dx

push bx

push bp

mov bp, sp

mov ax, 4000h; bx>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>bx

mov dx, [bp+12]; адрес сообщения dx

mov bx, dx; V--------------------------------0

l:

cmp al, [bx]; al=0, пока [bx]! =0 цикл

inc bx

jc l

sub bx, dx; bx - адрес послед. символа, -

lea cx, [bx-1]; т.к. считали 0.

mov bx, 0001h; в bx =1

int 21h

pop bp

pop bx

pop dx

pop cx

pop ax

retn 2

endp

; in [par0 = адрес буфера; par1 = длина буфера]

; out [cf = сигнал ошибки; ax = код ошибки при cf = 1 или количество символов в буфере при cf = 0]

; api [DOS 3Fh]

; txt [ввод в буфер с клавиатуры используя файловый хэндлинг]

asmin proc

push cx; извлекаем из стека

push dx; извлекаем из стека

push bp; извлекаем из стека

mov bp, sp

mov ah, 3Fh; чтение записи из файла

mov dx, [bp+8]; адрес буфера

mov cx, [bp+10]; длина буфера

mov bx,0; дескриптор клавиатуры

int 21h

dec ax

dec ax

mov bx, [bp+8]; адрес буфера

pushf

add bx, ax

xor dx, dx

mov [bx], dx

popf

pop bp

pop dx

pop cx

retn 4

endp

; in [par0 = адрес имени файла; par1 = атрибуты]

; out [cf = сигнал ошибки; ax = код ошибки при cf = 1]

; api [DOS 3Ch]

; txt [создание файла используя файловый хэндлинг]

fcreate proc

push cx

push dx

push bp

mov bp, sp; сохраним указатель вершины стека в bp

mov dx, [bp+8]; указатель на имя файла

mov cx, [bp+10]; режим создания файла

mov ah, 3Ch

int 21h

pop bp

pop dx

pop cx

retn 4

endp

; in [par0 = адрес имени файла; par1 = режим доступа]

; out [cf = сигнал ошибки; ax = код ошибки при cf = 1 или хэндл открытого файла при cf = 0]

; api [DOS 3Dh]

; txt [открытие файла используя файловый хэндлинг]

fopen proc

push dx

push bp

mov bp, sp; сохраним указатель вершины стека в bp

mov dx, [bp+6]; указатель на имя файла

mov ax, [bp+8]; режим открытия файла

mov ah, 3Dh; открытие файла

int 21h

pop bp

pop dx

retn 4

endp

; in [par0 = хэндл файла]

; out [cf = сигнал ошибки; ax = код ошибки при cf = 1]

; api [DOS 3Eh]

; txt [закрытие файла используя файловый хэндлинг]

fclose proc

push bx

push bp

mov bp, sp; сохраним указатель вершины стека в bp

mov bx, [bp+6]; хендл файла

mov ah, 3Eh; закрытие файла

int 21h

pop bp

pop bx

retn 2

endp

; in [par0 = хэндл файла, par1 = буфер в который читаем, par2 = кол-во байт,]

; out [cf = сигнал ошибки; ax = код ошибки при cf = 1 или количество символов в буфере при cf = 0]

; api [DOS 3Fh]

; txt [Считываем из файла по хэндл файла в буфер нужное нам кол-во байт]

fread proc

push cx

push dx

push bx

push bp

mov bp, sp

mov ah, 3Fh; чтение файла

mov bx, [bp+10]; хэндл файла

mov cx, [bp+14]; количество байт для чтения

mov dx, [bp+12]; адрес буфера в который читаем

int 21h

pop bp

pop bx

pop dx

pop cx

retn 6

endp

; in [par0 = хэндл файла, par1 = буфер из которого записываем, par2 = кол-во байт,]

; out [cf = сигнал ошибки; при cf = 1 ошибка, при cf = 0 количество записанных байт]

; api [DOS 40h]

; txt [Записываем в файл по хэндл файла из буфера нужное нам кол-во байт]

fwrite proc

push cx

push dx

push bx

push bp

mov bp, sp

mov ah, 40h; запись в файл

mov bx, [bp+10]; хэндл файла

mov cx, [bp+14]; количество байт для записи

mov dx, [bp+12]; адрес сообщения

int 21h

pop bp

pop bx

pop dx

pop cx

retn 6

endp

; in [par0 = хэндл файла, par1 = младшая часть смещения, par2 = старшая часть смещения, par3 = смещение (0,1,2)]

; out [cf = сигнал ошибки; при CF = 1 и AX = 01 ошибка кода отсчета или

; при AX = 06 ошибка файлового номера.]

; api [DOS 42h]

; txt [Записываем в файл по хэндл файла из буфера нужное нам кол-во байт]

fseek proc

push cx

push bx

push bp

mov bp, sp

mov ax, [bp+14]; режим установки указателя

mov bx, [bp+8]; хэндл файла

mov cx, [bp+12]; старшая часть.

mov dx, [bp+10]; младшая часть.

;. смещения

mov ah, 42h; Управление файловым указателем:

int 21h

pop bp

pop bx

pop cx

retn 8

endp

; in [par0 = буфер]

; out [cf = сигнал ошибки; при CF = 1 и AX = 02 файл не найден

; AX = 03 путь не найден. AХ = 05 доступ запрещен

; CF=0 файл удалён]

; api [DOS 41h]

; txt [Удаляем файл]

fdelete proc

push dx

push bp

mov bp, sp

mov ah, 41h; Функция 41h (Удалить файл)

mov dx, [bp+6]; [bp+6] адрес ASCIZ-строки с полным именем файла

int 21h

pop bp

pop dx

retn 2

endp

; in [al = код выхода]

; out [no return]

; api [DOS 4Ch]

; txt [завершение программы]

exit proc

mov ah, 4Ch

int 21h

endp

end main

Размещено на Allbest.ru


Подобные документы

  • Считывание информации из файла, анализ заголовка. Установка видеорежима и анализ его параметров. Разработка процедуры вывода изображения на экран. Методы вывода сообщений. Разработка алгоритма, удовлетворяющего требованиям задания и интерфейса программы.

    курсовая работа [23,6 K], добавлен 17.05.2013

  • Преобразование графической информации из аналоговой формы в цифровую. Количество цветов, отображаемых на экране монитора. Расчет объема видеопамяти для одного из графических режимов. Способы хранения информации в файле. Формирование векторной графики.

    презентация [2,1 M], добавлен 22.05.2012

  • Проектирование пользовательского интерфейса. Выбор формата представления данных, используемые переменные. Список процедур и макросов, их назначение. Используемые в программе функции. Тестирование и отладка правильной работы программы, схема листинга.

    курсовая работа [28,6 K], добавлен 17.05.2013

  • Рассмотрение проблемы создания трехмерного динамического изображения вращения пирамиды. Особенности построения в среде Microsoft Visual Studio пользовательского интерфейса, позволяющего изменять параметры визуализации и взаимодействовать с программой.

    курсовая работа [221,7 K], добавлен 06.02.2013

  • Информация о графических форматах. Хранение изображения в программе. Очередь как вспомогательная структура данных. Загрузка изображения из двоичного файла. Операции с изображением. Уменьшение разрешающей способности. Увеличение размера изображения.

    курсовая работа [1,1 M], добавлен 29.06.2013

  • Разработка программы, предназначенной для сжатия или компрессии полутонового изображения международным стандартом JPEG. Описание метода JPEG, выдача результатов в виде декодированного изображения. Обзор методов компрессии полутонового изображения.

    курсовая работа [43,5 K], добавлен 14.10.2012

  • Графические режимы и пространственное разрешение экрана монитора. Измерение глубины цвета. Обзор палитры цветов в системах цветопередачи. Выбор графического режима в операционных системах. Палитра цветов, используемая при печати изображений на принтерах.

    презентация [521,4 K], добавлен 16.03.2015

  • Описание этапов создания анимированного GIF изображения мультипликационного героя "Винни-Пуха" в программе Adobe Photoshop CS6. Создание дубликата слоя изображения и подготовка кадров для GIF анимации. Настройка эффектов анимации и результат GIF-файла.

    лабораторная работа [1,2 M], добавлен 05.03.2015

  • Основные типы графических режимов, условия и принципы их использования. Функции VGA и VESA BIOS. Простые форматы графических файлов, их содержание и специфика. Формат BMP для несжатого RGB-изображения. Особенности формата PCX для 256-цветов изображений.

    контрольная работа [33,7 K], добавлен 28.05.2016

  • Интерфейс программы Adobe Photoshop. Внесение изменений в изображение. Инструменты изменения оттенка и искажения изображения. Последовательность формирования изображения. Тоновая и цветовая коррекция изображения, работа с фильтрами и функциями.

    курсовая работа [2,8 M], добавлен 14.12.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.