Разработка программы, формирующей протокол работы препроцессора при обработки исходного текста программы на языке ассемблера

Страницы работы

Содержание работы

Лабораторна робота №2

Тема :”Препроцессоры”

Цель работы: освоить принципы написания программ, обрабатывают исходный текст программы написанный на языке асемблера, содержащий  директивы препроцессора и макрокоманды.

1.  Постановка задачи для лабораторной работы.

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

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

Необходимо разработать программу, формирующую расширенный листенг фрагмента

Программы нп языке ассемблера с использыванием препроцессора.

3.  Разроботка решения задачи.

3.1.  Выбор переменных.

Именна переменных их тип  и функциональное назначение приведены в табл.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

Похожие материалы

Информация о работе