Міністерство освіти і науки України
Національний технічний університет “ХПІ”
Кафедра “Обчислювальної техніки та програмування”
Дисципліна
“Системне програмування”
Лабораторні робота №2
Виконав:
студент групи КІТ-21Б
Хорощак Б.В.
Перевірив:
Межерицький С.Г.
М. Харків, 2003 рік
Тема: “Препроцесори”
Мета: Засвоїти принципи написання програм, що обробляють вхідний текст програми, написаної мовою асемблера, в якому містяться директиви препроцесора та макрокоманди.
Індивідуальне завдання: На основі демо-програми, що обробляє команди макропроцесора мови асемблера, реалізувати наступні можливості:
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. Вхідний файл
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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.