Тема :”Препроцессоры”
Цель работы: освоить принципы написания программ, обрабатывают исходный текст программы написанный на языке асемблера, содержащий директивы препроцессора и макрокоманды.
1. Постановка задачи для лабораторной работы.
Необходимо разработать программу, формирующую протакол работы препроцессора при обработки исходного текста программы на языке ассемблера. который содержит директивы препроцессора и макроко-манды.Протокол должен содержать файл такого же формата как и исход-ный, но не содержащий директивы препроцессора.
2. Постановка задачи.
Необходимо разработать программу, формирующую расширенный листенг фрагмента
Программы нп языке ассемблера с использыванием препроцессора.
3. Разроботка решения задачи.
3.1. Выбор переменных.
Именна переменных их тип и функциональное назначение приведены в табл.1
Ім'я |
Тип |
Призначення |
mnemonics[] directives[] registers[] opcode op1num op2num *mnem[] cop1[] cop2[] *F, *F1 |
char char char int int int char char char file |
Покажчик на елемент масиву mnemonics.Цей мас- сив містить найменування команд мови асемб- лера, що зустрічаються у вихідному файлі. Покажчик на елемент масиву directives.Цей мас- сивий містить найменування команд мови асемб- лера, що зустрічаються у вихідному файлі. -//- індекс для масиву mnemonics. -//- directives і registers. -//- registers. Покажчик на елемент масиву, що мiстить об'ект- ний код команд. -//- першого операнда команди. -//- іншого операнда команди. Покажчик на вихідний файл і файл розширеного листенга. |
3.1.1. Опис структури програми.
Імена функцій ,їхній тип і призначення приведені в табл.1.2.2
Табл.1.2.2
Ім'я |
Тип |
Призначення |
Strtoi Strupcase Strcomp *parse findstr findsym find_macro find_parametr macro_def main |
int void char char int int int int void void |
Порівняння виділеної лексеми з десятковим числом У випадку позитивного результату повертаеться зна- Чення 0. Перетворення рядкових символів у прописні Порівняння двох рядків. Виділення лексеми з рядка. Пошук рядка в мисiвi рядкiв. У випадку присутностi повертаеться індекс у масиві , у противному випадку –1 -//- таблиці символів -//- -//- таблице макросов - //- -//- в таблице формю параметров макроса -//- обработка включаемого в исходник файла головна програма. |
.
4. Описание алгоритма решения.
Пока не конец файла произврдим следующие действия:
Блок 1: Считываем строку из исходного файла.
Блок 2: Если эта строка содержит директиву INCLUDE, проверяем есть ли включаемый этой директивой файл.
Блок 3: Если есть,то вызываем процедуру обработки, если нет,то выход из программы с выдачей сообщения об этом.
Блок 4: Если эта строка содержит директиву условной компиляции, установить флаг условной компиляции.
Блок 5: Если эта сторока содержит вызов макроопределения, то если макрос вызван верно – формируем макрорасширение и в зависимости от флага условной компиляции выполняем ниже изложенные дествия.
Блок 6: Производим синтаксический анализ строки и в зависимости от флага условной компиляции заносим в протакол работы препроцессора строку и выводим в результирующй файл либо расширенный листенг этой строки либо строку.
Блок 7: Если конец исходного файла,то выводим а файл содержимое таблиц сегментов, символов и макросов.
5. Текст программы Preproc.cpp
char *macrodir[]={"MACRO","ENDM"}; /*
if (1==(opcode=findstr(prepr_dir,lexbuf))) //Проверка на лексему rept
{
int i=0;
char *mas[10];
int* povtor; // колличество повторов
parsep=parse(lexbuf,parsep); // выделение следующей лексемы
strtoi(lexbuf,povtor); // povtor – оператор мнемоники rept
do
{
hert:
fgets(cmdbuf,MAXSTR,F);
strupcase(cmdbuf);
if(strconsist("\n",cmdbuf[0])) // если строка - \n
goto hert;
parsep=parse(lexbuf,cmdbuf); // выделение лексемы
mas[i]=cmdbuf;
i++;
}
while (strstr(lexbuf,"ENDM")==0);
int kol=i;
// вывод в файл
for(int j=0;j<*povtor;j++)
{
for (i=0;i<kol;i++)
{
fprintf (F1,"1\t%10i%39s",number,mas[i]);
number++;
}
}
goto begin;
}
6. Результат работы программы.
6.1. Входные данные для работы программы.
Входными данными есть файл “text2.asm” и mymac.lib
include mymac.lib
DATA segment para
ifb <>
as dw 34
else
K DB 56
endif
W DW 4536
M DB 0
dfgha dw 87
DATA ends
CODE segment
rept 5
mov ax,7
inc ax
endm
inc dx
mym4 ax
MOV ax,cx
ddd: cmp cx,di
a db 0
mov bx,5
mym ax,bx,10,20
CMP cx,bx
MOV DX,w
ZN:
DEC ax
mym2 10,20
MOV Bx,cx
mym3 bx,cx
MOV AX,16
CMP AX,BX
CODE ends
END
6.2. Результатом работы данной программы является “t$ext2.asm”
DATA SEGMENT PARA
AS DW 34
W DW 4536
M DB 0
DFGHA DW 87
DATA ENDS
CODE SEGMENT
MOV AX,7
INC AX
ENDM
1
Содержащий результат работы препроцессора и подтверждающий правильность
aайл “text2.lst”
1 INCLUDE MYMAC.LIB
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.