Разработка резидентной программы для сохранения в файле копии текстового экрана дисплея

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

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

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

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

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

Содержание

Введение

Постановка задачи

Описание используемых команд

Список используемых директив

Блок-схема программы

Текст программы

Список литературы

Введение

Сердце персонального компьютера - микропроцессор, выполняющий арифметические, логические и вспомогательные операции, необходимые для решения задач. Каждое семейство процессоров имеет собственный уникальный набор инструкций, используемый для выполнения операций, например, для ввода с клавиатуры, вывода данных на экран и выполнения арифметических вычислений. Этот набор инструкций (машинный язык) слишком сложен для понимания и непосредственного использования при создании программ. Поэтому для процессоров существуют языки ассемблеров, представляющие инструкции машинных языков в более доступной для человеческого понимания символьной форме.

Машинный язык - представляет собой совокупность машинных инструкций, непосредственно исполняемых процессором. Последовательность таких инструкций составляет операционную систему и встроенное в аппаратную часть компьютера программное обеспечение. Низкоуровневые языки программирования (ассемблеры) - предназначаются для конкретных семейств процессоров. Символьные инструкции этих языков непосредственно соответствуют инструкциям машинных языков, и программы на ассемблере легко транслируются в машинный код.

Написание программы на языке ассемблера требует знания об аппаратуре компьютера (его архитектуре) и деталях его набора инструкций. Основные составляющие аппаратной части компьютера - процессор, память и регистры (регистры - специальные компоненты процессора, предназначенные для хранения адресов и данных). Внешние устройства компьютера (периферия) - это клавиатура, дисплей, винчестер, привод компакт дисков и другие устройства. Программное обеспечение состоит из операционной системы, различных прикладных программ и файлов данных, хранящихся на диске.

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

Определенные события могут вынудить процессор приостановить выполнение текущей программы и заставить его отреагировать на эти события. Обычно эти события нормальны и предсказуемы, как, например, запрос на ввод с клавиатуры. Процессор прерывает текущую операцию, вызывает BIOS - подпрограмму для обработки запроса с клавиатуры и возвращается к выполнению прерванной программы. Другой тип прерываний - программные прерывания. Их вызывает программа, например, для вывода информации на экран.

Резидентные программы. Некоторые программы построены так, чтобы постоянно находиться в памяти и выполнять какие-то действия в ответ на определенные события, например, нажатие указанных сочетаний клавиш. Эти программы, называемые резидентными, можно загружать перед другими, работающими в обычном режиме, программами. Они почти всегда являются программами типа .COM.

Программы типа .COM. Преимущества программ типа .COM - меньший размер по сравнению с программами типа .EXE и более легкая адаптация к применению в качестве резидентных программ. Формат программ .COM возник на раннем этапе развития микрокомпьютеров, когда размер программы был ограничен 64 килобайтами.

Программа типа .COM использует единый сегмент для инструкций и данных, изначально ограниченный размером 64 Кб, включая префикс сегмента программы (PSP). PSP - это 256-байтный блок, который загрузчик программ вставляет непосредственно перед программами при загрузке в память с диска. Программа .COM - точное отображение исполняемой программы без информации о перемещаемых адресах.

Задание

Разработать резидентную программу, осуществляющую по нажатии клавиши F5 сохранение в файле копии текстового экрана дисплея.

Описание использованных команд

микропроцессор инициализация резидентный ассемблер

Функция 3CH прерывания INT21H: создать файл.

Для создания нового файла или перезаписи старого файлом с таким же именем (например, при копировании) используется функция 3CH прерывания INT 21H. Загрузите требуемые для создаваемого файла атрибуты в регистр CX. В регистр DX загрузите адрес ASCII - строки, содержащей путь для создания файла.

Функция 3EH прерывания INT21H: закрыть в файл.

Закончив работать с файлом, программа должна закрыть его. Для этого загружаем дескриптор файла в ВХ и вызовите функцию 3ЕН прерывания INT21H:

Корректная операция закрытия файла записывает все данные, остающиеся в буфере, в файл, обновляет записи о файле в FAT и структуре директорий о размере файла, дате и времени. После чего освобождается указанный дескриптор. Неудачная операция устанавливает флаг CF в 1 и возвращает единственный возможный код ошибки - 06 (некорректный дескриптор).

Функция 25H прерывания INT21H: установить вектор прерывания.

Для установки нового адреса обработчика прерывания нужно загрузить номер требуемого обработчика в AL, а новый адрес - в DX:

Операция заменяет текущий адрес в таблице новым адресом. После этого, когда вызывается соответствующее прерывание, обработка передается резидентной программе, а не обычно используемому обработчику.

Функция 35H прерывания INT21H: получить вектор прерывания.

Чтобы получить адрес определенного обработчика прерывания из таблицы векторов прерываний, нужно загрузить в AL требуемый номер обработчика и вызвать эту функцию:

Операция помещает запрошенный адрес в пару регистров ES:BX в форме сегмент: смещение.

Функция 40H прерывания INT21H: записать в файл.

Функция 40H прерывания INT21H используется для сохранения отдельных записей в файл на диске. Загружаем в регистр BX дескриптор файла, в который нужно произвести запись, в регистр CX - число записываемых байтов, а в DX - адрес области вывода.

Корректная операция записывает все указанные байты на диск, увеличивает значение указателя файла, устанавливает флаг CF в 0 и записывает в AX число действительно записанных байтов. Переполнение диска может привести к тому, что не все байты будут записаны. С точки зрения системы такая ситуация не является ошибкой, поэтому программа должна проверять число записанных байтов. Некорректная операция устанавливает флаг CF в 1 и помещает в AX код ошибки - 05 (в доступе отказано) или 06 (некорректный дескриптор).

Функция 42H прерывания INT21H: переместить указатель файла.

Операция открытия файла инициализирует указатель файла значением 0. Последующие операции последовательного чтения и записи увеличивают его с каждой прочитанной записью. Для установки указателя в произвольную точку файла можно использовать функцию 42Н прерывания INT21H (перемещение указателя файла), после чего использовать другие функции для чтения и изменения данных в файле.

Для обращения к функции 42Н загружаем дескриптор требуемого файла в ВХ, а требуемое значение смещение (в байтах) - в пару СХ:DX. Для смещения вплоть до 65535 байтов устанавливаем в СХ 0, а смещение задаем в DX.Кроме того, устанавливается код метода в AL - он указывает операции, с какой точки начинать отсчет смещения:

00 - с начала файла;

01 - от текущей позиции указателя, которая может соответствовать любой точке файла, включая его начало;

02 - от конца файла; этот метод можно применить для добавления новых записей к концу файла; или для определения размера файла устанавливают СХ:DX в 0 и используют метод 02.

Успешная операция устанавливает флаг CF в 0 и помещает новый адрес указателя в пару DX:AX. Программа может использовать этот адрес для дальнейших операций произвольного доступа. Некорректная операция устанавливает CF в 1 и возвращает в АХ код ошибки 01 (неправильный код метода) или 06 (некорректный дескриптор).

Список используемых директив

Директива ORG 100Н.

Поскольку PSP имеет размер 100Н байтов, адресация начинается со смещения 100Н байт. Мы должны ввести в текст программы директиву ORG 100H сразу за предложением SEGMENT или .CODE в сегменте кода. Эта директива приказывает ассемблеру установить счетчик положения в значение 100Н. После этого ассемблер начнет генерировать объектный код, начиная с ячейки с адресом 100Н (сразу после PSP), располагая там код программы типа .COM. Из-за этого первое предложение, следующее за ORG должно быть исполняемой инструкцией.

Директива SEGMENT.

Директива для определения сегментов, SEGMENT и ENDS, имеют следующий формат:

Имя сегмента SEGMENT [выравнивание], [совмещение][`класс']

Имя сегмента ENDS

Предложение SEGMENT определяет начало сегмента. Имя сегмента должно присутствовать, быть уникальным и соответствовать соглашениям об именах, принятым в Ассемблере. Предложение ENDS указывает на конец сегмента и содержит тоже имя, что и предложение SEGMENT. Максимальный размер сегмента в реальном режиме - 64 Кб.

Директива ASSUME.

Эта директива устанавливает соответствие между именами сегментов и сегментными регистрами CS, SS, DS и ES. Её формат:

ASSUME сегментный регистр: имя сегмента [,…].

Директива PROC.

Процедура - это участок кода, начинающийся с директивы PROC и заканчивающийся директивой ENDP. Хотя теоретически можно непосредственно переходить к процедуре инструкцией JMP при последовательном выполнении команд программы, обычно процедуры вызываются инструкциями CALL, а возврат из них выполняется инструкциями RETN или FAR.

Процедура, расположенная в том же сегменте, что и вызывающая процедура - это процедура типа NEAR, и она вызывается простым изменением смещения в регистре IP. Отсутствующий спецификатор NEAR добавляется по умолчанию. Если вызываемая процедура находится за пределами текущего сегмента, она должна быть объявлена как PUBLIC и вызывается с помощью CALL.

Директива END.

Директива END помещается в конце исходного текста. Её формат - END [начальный адрес ]. Необязательный начальный адрес указывает на размещение сегмента кода (обычно, его первой инструкции), с которого должно начинаться выполнение программы. Системный загрузчик использует этот адрес для инициализации регистра CS. Если программа состоит только из одного модуля, для него необходимо определить стартовый адрес. Если в программе несколько модулей, начальный адрес нужно определить только для одного (обычного первого) модуля.

Блок-схема программы

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

Блок схема тела резидента

Текст программы

CSEG segment

assume cs:CSEG, ds:CSEG, ss:CSEG, es:CSEG

org 100h

Begin:

jmp Init ;На метку инициализации

; Инициализация (подготовка и настройка резидента)

Init:

mov ax,3509h

int 21h ;Получим и сохраним адрес (вектор) 21h прерывания

mov word ptr Int_09h_vect,bx ;Вначале младшее слово (смещение)

mov word ptr Int_09h_vect+2,es ;Затем старшее (сегмент)

mov ax,2509h ;устанавливаем вектор прерывания

mov dx,offset Int_09h_proc

int 21h ;"Повесим" нашу процедуру на 09h прерывание

mov dx,offset Init

int 27h ;Оставим программу резидентной в памяти.

In_memory db 'Мы уже в памяти!!!!$'

Int_09h_proc proc

pushf ; сохраним флаги и регистры

push ax

push bx

push cx

push dx

push es

push ds

in al, 60h ; читать кнопку

cmp al, 42h ; это F5?

jne go_09h ; если нет - на оригинальный обработчик

in al, 61h ; взять значение порта управления клавиатурой

mov ah, al ; сохранить его

or al, 80h ; установить бит разрешения для клавиатуры

out 61h, al ; и вывести его в управляющий порт

xchg ah, al ; извлечь исходное значение порта

out 61h, al ; и записать его обратно

mov al, 20h ; послать сигнал "конец прерывания

out 20h, al ; контроллеру прерываний 8259

mov ax, 0b800h ; в ax - начальный адрес видеопамяти для текстовых режимов

mov es, ax ; оттуда в es, напрямую с es работать нельзя

xor di, di ; обнуляем di

mov si, offset logfile ; в si - адрес массива, в который будем писать символы с экрана

wr: ; начало цикла записи

movsb ; записать данные из ячейки es:[di] в ячейку ds:[si]

inc si ; si++

inc di ; di++

cmp si, 0b800h ; еще не конец массива?

jne wr ; тогда в цикл

mov ah, 3ch ; создание файла

mov cx, 0 ; атрибут файла - доступен для чтения/записи

mov dx, offset filename ; в dx - адрес переменной, в которой лежит имя файла

int 21h ; прерывание

mov bx, ax ; описатель файла сохраним в bx, потом понадобится

mov cx, 0 ; в cx - смещение указателя

mov dx, 0 ; в dx - база указателя

mov al, 2 ; атрибуты открытия файла

mov ah, 42h ; установка указателя для записи в файл

int 21h ; прерывание

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

mov dx, offset logfile ; в dx - адрес массива данных, который будем записывать

mov cx, 0b800h ; в cx - объем записяваемых данных

int 21h ; прерывание

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

int 21h ; прерывание

Go_09h:

pop ds ; восстановим регистры

pop es ;

pop ds ;

pop cx ;

pop bx ;

pop ax ;

popf ;Выровняем стек

jmp dword ptr cs:[Int_09h_vect] ;"Прыгаем" на оригинальный обработчик

iret

Int_09h_vect dd ? ;Здесь хранится адрес оргинального обработчика

filename db 'res.txt', 0 ; имя файла, если не указан путь - создается в директории исполняемого файла

logfile db 0b800h dup (0) ; массив данных для записи

Int_09h_proc endp

CSEG ends

end Begin

Литература

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

2. Джордан Программирование на ассемблере. М.:

3. Ризаев И.С. Лекционный курс по дисциплине: «Системное программное обеспечение». Казань: КАИ, 2004.

4. Старостин Д.А. Лабораторные работы по дисциплине: «Системное программное обеспечение». Казань: КАИ, 2004.

5. Юров В., Хорошенко С. Ассемблер: учебный курс - СПб: Издательство “Питер”, 1999. - 672 с.

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


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

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