Министерство образования Российской Федерации
Волжский университет им. Татищева
Факультет «Информатика и телекоммуникации»
Кафедра «Информатика и системы управления»
УТВЕРЖДАЮ
Проректор по учебной работе
_____________Е.В. Филатова
«_____»____________ 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. Программа ввода символа с клавиатуры