Препроцесори. Принципи написання програм, що обробляють вхідний текст програми, написаної мовою асемблера

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

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

Міністерство освіти і науки України

Національний технічний університет “ХПІ”

Кафедра “Обчислювальної техніки та програмування”

Дисципліна

“Системне програмування”

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

“Препроцесори”

Виконав:

студент групи КІТ-21Б

Хорощак Б.В.

Перевірив:

Межерицький С.Г.

            М. Харків, 2003 рік

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

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

Мета: Засвоїти принципи написання програм, що обробляють вхідний текст програми, написаної мовою асемблера, в якому містяться директиви препроцесора та макрокоманди.

Індивідуальне завдання: На основі демо-програми, що обробляє команди макропроцесора мови асемблера, реалізувати наступні можливості:

1.  Обробка команди IFNB.

2.  Обробко команди REPT.

1. Розробка алгоритмувирішення задачі

1)  Зчитати строку вхідного файлу

2)  Якщо в ній присутня директива INCLUDE, то перевірити, чи існує файл, що в ній прописаний

3)  Якщо присутній, то визвати процедуру обобки, якщо ні – вийти із програми з повідомленням про помилку

4)  Якщо в строці присутня директива умовної компіляціїї, то підняти флаг умовної компіляції

5)  Якщо присутній визов макросу, то якщо описано правильно – сформувати макророзширення та в залежності від флагу умовної компіляції виконати нижче описані дії

6)  Провести синтаксичний аналіз строки та в залежності від флага умовної компіляції занести до протоколу роботи препроцесора строку та вивести у результуючий файл строку, або ж її розширений лістинг

7)  Якщо кінець вхідного файлу, то виводимо таблиці сегментів, символів та макросів

2. Приведення фрагментів тексту програми

     1) Реалізація обробки REPT

  if (OP_REPT==(opcode=findstr(mnemonics,lexbuf)))

        {  if (!seg_open_flag)

            {

           printf("\nline %d:Not open segment",number);

           exit(0);

            }

           parsep=parse(lexbuf,parsep);

           if (strtoi(lexbuf,&nn))

            {

           printf("\nline %d:Error in \"REPT\"!",number);

           exit(0);

            }

           fprintf(F1,"\t%10i               \t%-s",number,cmdbuf);

           kol=0;

           while (!feof(F))

            {fgets(cmdbuf,MAXSTR,F);

           strupcase(cmdbuf);

           parsep = cmdbuf;

           while (parsep[0]==' ') parsep++;

           if(strconsist("\n",parsep[0])) continue;

           parsep=parse(lexbuf,parsep);

           if (OP_ENDM==findstr(macrodir,lexbuf)) break;

           strcpy(buff[kol],cmdbuf);

           if (++kol>LEN)

             {printf("\nline %d:REPT very large!",number);

              exit(0);

             }

            }

           strcpy(buff[LEN],cmdbuf);

           a=0;

           while (a<nn)

            {z=0;

           rept1:

           while (z<kol)

             {number++;

              strcpy(cmdbuf,buff[z]);

              parsep=buff[z];

              z++;

              fprintf(F1,"1");

              goto restart;

             }

           a++;

            }

            z=0;

            fprintf(F1,"\t%10i              \t%-s",++number,buff[LEN]);

            goto begin;

        }

2) Реалізація обробки IFNB

 if (OP_IFNB==(opcode=findstr(mnemonics,lexbuf)))

         {if (!seg_open_flag)

            {

           printf("\nline %d:Not open segment",number);

           exit(0);

            }

          fprintf(F1,"\t%10i              \t%-s",number,cmdbuf);

          parsep=parse(lexbuf,parsep);

          if (lexbuf[0]!='<')

          {

           printf("line %i:Must be '<'",source_number);

           exit(0);

          }

          parsep=parse(lexbuf,parsep);

          if (lexbuf[0]=='>')

            if (parsetyp==PT_WORD) goto ifgets;

          goto ifgets1;

         }

3. Вхідний файл

Mymac.lib

mym  macro l1,l2,l3,l4

     mov ax,l1

     mov cx,l1

     dec l1

     endm

mym2 macro p3,kk

     mov ax,p3

     mov cx,kk

     endm

mym3 macro c1,c2

     dec c1

     inc c2

     endm

mym4 macro c1

     ifb <ax>

     mov c1,ax

     mov dx,c1

     else

     dec c1

     mov dx,c1

     endif

    endm

text2.asm

include mymac.lib

 DATA segment para

  ifnb < A >

  as  dw 34

  else

  K   DB 56

  endif

  W   DW 4536

  M   DB 0

  dfgha dw 87

 DATA ends

 CODE segment

    rept 3

     inc cx

     mov ax,bx

    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

    rept 2

     inc bx

     dec ax

    endm

    mym3 bx,cx

    MOV AX,16

    CMP AX,BX

  CODE ends

 END

4. Результати роботи програми

$text2.asm

DATA SEGMENT PARA

  AS  DW 34

  W   DW 4536

  M   DB 0

  DFGHA DW 87

 DATA ENDS

 CODE SEGMENT

     INC CX

     MOV AX,BX

     INC CX

     MOV AX,BX

     INC CX

     MOV AX,BX

     INC DX

 DEC AX

 MOV DX, AX

    MOV AX,CX

   DDD: CMP CX,DI

    A DB 0

    MOV BX,5

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

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