Смекни!
smekni.com

Программирование контроллера приоритетных прерываний (стр. 1 из 8)

Министерство образования Российской Федерации

Волжский университет им. Татищева

Факультет «Информатика и телекоммуникации»

Кафедра «Информатика и системы управления»

УТВЕРЖДАЮ

Проректор по учебной работе

_____________Е.В. Филатова

«_____»____________ 200 г.

МЕТОДИЧЕСКОЕ УКАЗАНИЕ

для проведения лабораторной работы по теме

''Программирование контроллера приоритетных прерываний''

по курсу ''Организация ЭВМ''

для студентов специальностей 220100, 071900

Тольятти


Создание и компиляция программ на ассемблере

Процесс разработки программы на ассемблере состоит из пяти этапов:

1. Создание файла с исходным текстом программы в любом текстовом редакторе. Расширение файла с исходным текстом может быть .asm, или .txt, или .doc.

2. Создание объектного модуля. В среде DOS или NORTON или FAR в командной строке набираете следующую команду:

tasm name.asm

или

tasm.exe name.asm name.obj

name.asm файл с исходным текстом программы. При этом файлы tasm.exe и name.asm должны находится в одном каталоге. После запуска этой команды мы получаем объектный файл с расширением .obj. Если объектный файл не появился, то в программе содержатся ошибки. Перечень ошибок можно посмотреть, отключив панели (ctrl+o или Ctrl+f1 и ctrl+f2).

3. Создание исполнительного файла. В командной строке набираем следующую команду:

tlink name.obj

или

tlink.exe name.obj name exe

При этом файлы tlink.exe и name.obj должны находится в одном каталоге. После запуска этой команды мы получаем запускной файл с расширением .exe. Если запускной файл не появился в этом каталоге, то в данном каталоге не хватает некоторых библиотек. Перечень файлов можно посмотреть, отключив панели (ctrl+o или Ctrl+f1 и ctrl+f2).

4. Тестирование программы. Запустите исполнительный файл.

5. Пошаговая отладка. В командной строке набираем следующую команду:

tdname.exe

Структура программы на ассемблере

Modelsmall ;модель программы, или же количество памяти на сегмент

.data;сегмент данных

;описание переменных

.stack 100h;сегмент стека

.code ;сегмент данных

;процедуры, макрокоманды

main:

mov ax,@datamovds,ax

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

movax,4c00hint 21h;выход из программы

endmain

Директивы резервирования памяти

Для описания простых типов данных в программе используются специальные директивы резервирования и инициализации данных, которые, по сути, являются указаниями транслятору на выделение определенного объема памяти. Если проводить аналогию с языками высокого уровня, то директивы резервирования и инициализации данных являются определениями переменных.

Машинного эквивалента этим директивам нет; просто транслятор, обрабатывая каждую такую директиву, выделяет необходимое количество байт памяти и при необходимости инициализирует эту область некоторым значением.

Директивы резервирования и инициализации данных простых типов имеют формат:

Рис. 1. Директивы описания данных простых типов

На рис. 1 использованы следующие обозначения:

· ? показывает, что содержимое поля не определено, то есть при задании директивы с таким значением выражения содержимое выделенного участка физической памяти изменяться не будет. Фактически, создается неинициализированная переменная;

· значение инициализации — значение элемента данных, которое будет занесено в память после загрузки программы. Фактически, создается инициализированная переменная, в качестве которой могут выступать константы, строки символов, константные и адресные выражения в зависимости от типа данных. Подробная информация приведена в приложении 1;

· выражение — итеративная конструкция с синтаксисом, описанным на рис. 5.17. Эта конструкция позволяет повторить последовательное занесение в физическую память выражения в скобках n раз.

· имя — некоторое символическое имя метки или ячейки памяти в сегменте данных, используемое в программе.

· db— резервирование памяти для данных размером 1 байт. Директивой db можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком –128...+127; для чисел без знака 0...255;

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

· dw — резервирование памяти для данных размером 2 байта.

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком –32 768...32 767; для чисел без знака 0...65 535;

o выражение, занимающее 16 или менее бит, в качестве которого может выступать смещение в 16-битовом сегменте или адрес сегмента;

o 1- или 2-байтовую строку, заключенная в кавычки.

· ddрезервирование памяти для данных размером 4 байта.

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком –2 147 483 648...+2 147 483 647;

для чисел без знака 0...4 294 967 295;

o относительное или адресное выражение, состоящее из 16-битового адреса сегмента и 16-битового смещения;

o строку длиной до 4 символов, заключенную в кавычки.

· df — резервирование памяти для данных размером 6 байт;

· dpрезервирование памяти для данных размером 6 байт. Директивами df и dp можно задавать следующие значения:

o выражение или константу, принимающую значение из диапазона:

для чисел со знаком –2 147 483 648...+2 147 483 647;

для чисел без знака 0...4 294 967 295;

o относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей микропроцессоров Intel);

o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;

o строку длиной до 6 байт, заключенную в кавычки.

· dq — резервирование памяти для данных размером 8 байт.

относительное или адресное выражение, состоящее из 32 или менее бит

o константу со знаком из диапазона –263...263–1;

o константу без знака из диапазона 0...264–1;

o строку длиной до 8 байт, заключенную в кавычки.

· dt — резервирование памяти для данных размером 10 байт.

относительное или адресное выражение, состоящее из 32 или менее бит

o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;

o константу со знаком из диапазона –279...279-1;

o константу без знака из диапазона 0...280-1;

o строку длиной до 10 байт, заключенную в кавычки;

o упакованную десятичную константу в диапазоне 0...99 999 999 999 999 999 999.

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

Для иллюстрации данного принципа рассмотрим пример 1, в котором определим сегмент данных. В этом сегменте данных приведено несколько директив описания простых типов данных.

Пример 1. Пример использования директив резервирования и инициализации данных. Результатом работы данной программы будет строка 'Привет, все работает'

modelsmall.stack 100h.datames db 'Привет, все работает',’$' ;определение строки perem_1 db 0ffh ;определение контстантыperem_2 dw 3a7fh ;определение контстантыperem_3 dd 0f54d567ah ;определение контстантыmasdb 10 dup (' ') ;определение пустого массива из 10 байтadrdwperem_3 ;переменная adr содержит адрес ;внутри сегмента переменной perem_3a_fullddperem_3 ;переменная a_full содержит полный ;адрес переменной perem_3fin db 'Конец сегмента данных программы $'.codestart:;занесение в сегментный регистр адреса сегмента данныхmov ax,@datamovds,axmov ah,09hmov dx,offset mesint 21h ;вывод на экран строки mesmovax,4c00hint 21h;выход из программы

endstart

Окончание работы программы сопровождается полной выгрузкой программы из оперативной памяти, это осуществляется функцией 4с00h прерывания int 21h.

Все что в данной программе выделено жирным шрифтом обязательно при написании любой программы.

При написании программ на ассемблере регистр букв не важен.

Организация ввода-вывода на ассемблере

Ввод-вывод данных в компьютер осуществляется посредством различных периферийных устройств. Общение процессора с различными периферийными происходит через систему прерываний. Для ввода-вывода данных служит прерывание int 21h.

Основная последовательность дей­ствий при использовании прерываний 2lh (DOS):

1. Поместить номер функции в регистр ah.

2. Поместить передаваемые функции параметры в определенные регистры (они приведены при описании каждой функции).

3. Вызвать прерывание 2lh (DOS) командой int 21h

4. Извлечь результаты работы функций из определенных регистров. Какие именно регистры и что они содержат после возврата управления из функ­ции программе пользователя, указывается при описании каждой функции.

Прерывание DOS 2lh предназначено для предоставления программисту раз­личных услуг со стороны операционной системы. Этими услугами является набор функций. Какая именно функция должна быть вызвана, указывается числом в регистре ah.

Некоторые функции DOS (int 21h)

Назначение Номер функции Вход Выход
Ввод символа с ожиданием и эхосопровождением ah-0lh аl- ASCII-код символа
Вывод символа ah-02h dl- ASCII-код символа
Вывод символа на принтер ah-05h dl- ASCII-код символа
Ввод символа с ожиданием и без эхосопровождения ah-07hah-08h al- ASCII-код символа (функция 08h при вводе проверяет, не нажато ли CTRL-BREAK)
Вывод строки на экран ah-09h ds:dx= адрес строки с символом <$> на конце Введенная строка в буфере
Ввод строки с клавиатуры ah-0ah ds:dx-anpec буфера с форматом:1 байт — размер буфера для ввода (формирует пользователь);2 байт — число фактически введенных символов (заполняет система по окончанию ввода — нажатию клавиши Enter (Odh)). Символ 0dh не учитывается во втором байте буфера;3 байт и далее — введенная строка с символом 0dh на конце
Проверка состояния буфера клавиатуры ah - 0bh al=0 — буфер пуст al = 0ffh - в буфере есть символы

Пример 2. Программа ввода символа с клавиатуры