Національний Технічний Університет
«Харківський Політехнічний Інститут»
Звіт
з лабораторної роботи № 8
з дисципліни «системного програмування»
Виконав: студент
групи КІТ-14в
Богачов О. С.
Викладачі:
Межерицький С. Г.
Харків-2006 р.
Препроцесор
Ціль роботи: розробити програму-препроцесор, який виконує розбір тексту .ASM файлу на рівні макросів та условної компіляції (формування ASM файлу).
Текст програми pre.cpp:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PT_EOST 0
#define PT_SIGN 1
#define PT_WORD 2
#define PT_LABEL 3
#define MAXSTR 64
#define DIR_SEG 0
#define DIR_DB 1
#define DIR_DW 2
#define DIR_ENDS 3
#define DIR_MACRO 0
#define OP_DEC 1
#define OP_ENDM 1
#define OP_IFB 10
#define OP_ELSE 11
#define OP_ENDIF 12
#define OP_IFNB 13
char *directories[] = {
"SEGMENT",
"DB",
"DW",
"ENDS",
} ;
char *registers[] = {
"AX",
"CX",
"DX",
"BX",
"SP",
"BP",
"SI",
"DI",
};
char *mnemonics[] = {
"MOV","DEC","INC","ADD",
"SUB","CMP","OR","XOR",
"AND","END","IFB","ELSE",
"ENDIF","IFNB"
};
struct seg_tab
{
char name[MAXSTR];
int length;
};
struct sym_tab
{
char mnem[MAXSTR];
char type[MAXSTR];
char atrib[MAXSTR];
int ef_adr;
};
struct label_tab
{
char mnem[MAXSTR];
char type[MAXSTR];
char atrib[MAXSTR];
int ef_adr;
};
struct formal_parameters
{
char name[MAXSTR];
char buf[MAXSTR];
};
struct fact_parameters
{
char name[MAXSTR];
char buf[MAXSTR];
};
struct macro_tab
{
char name[MAXSTR];
struct formal_parameters param[10];
struct fact_parameters fact_param[10];
int param_count;
int fact_param_count;
int str_count;
};
struct seg_tab segtab[20];
struct sym_tab symtab[20];
struct label_tab labeltab[20];
struct macro_tab macrotab[10];
char *mnem[]={"8B","4","4","03","2B","3D","OB","33","23"};
char cop1[]={'C','C','D','D','E','E','F','F'};
char cop2[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int operandcount[]={2,1,1,2,2,2,2,2,2,0};
char signs[] = "~!@#$%^&*()_)+|`\\=-,/<>?;':\"";
char signs1[] = "~!@#$%^&*()_)+|`\\=-,/<>?;'\"";
char *sym[]={"NEAR","BYTE","WORD","NEAR"};
char *macrodir[]={"MACRO","ENDM"}; /* Директивы препроцессора */
char *seg_registr[]={"DS:","CS:","SS:"};
char *prepr_dir[]={"INCLUDE","REPT"}; /* Директивы препроцессора*/
char separators[] = "\t \r\n";
char parsetyp = 0;
char lexbuf[MAXSTR];
char cmdbuf[MAXSTR];
char *parsep;
int idx=0;
int opcode,cmdidx;
int j=0;
int n,number=0,offs;
FILE *F,*F1,*F2,*F3;
int strtoi(char *s, int *i)
{
int sign,val=0;
if(!*s)return -1;
if(*s == '-'){
sign = -1;s++;}
else sign = 1;
while(*s)
{
if(*s < '0') return -1;
if(*s > '9') return -1;
val *= 10;val += *s - '0';*s++;
}
*i = val * sign;
return 0;
}
void strupcase(char *s)
{ while(*s){
if((*s > ('a' - 1)) && (*s < ('z'+1)))
*s -= ('z' - 'Z');s++;}}
char strcomp(char *s1, char *s2){
while(*s1){
if(*s1 != *s2) return 0;
s1++;s2++;}
if(*s2) return 0;
return 1;
}
int strconsist(char *s, char c){
while(*s) if(*s++ == c) return 1; return 0;}
char *parse(char *buf, char *str)
{
char c;
while(*str)
{
c=*str;
if (!strconsist(separators,c))
{
if (strconsist(signs,c))
{
buf[0]=c;
buf[1]=0;
return str+1;
}
while ((*str)&&(!strconsist(separators,*str))&&
(!strconsist(signs1,*str)))
{
*buf++=*str++;
if (*str==':')
{
parsetyp=PT_LABEL;
return str+1;
}
}
*buf=0;
parsetyp=PT_WORD;
return str;
}
str++;
}
*buf=0;
parsetyp=PT_EOST;
return str;
}
int findstr(char *tab[], char *it)
{
int cmdidx;
cmdidx = 0;
while(tab[cmdidx])
{
if(strcomp(tab[cmdidx], it))
return cmdidx;
cmdidx++;
}
return -1;
}
/* Обработка директивы macro */
void macro_def()
{
read:
while (!feof(F2))
{
number++;
fgets(cmdbuf,MAXSTR,F2);
strupcase(cmdbuf);
if (!cmdbuf[0])
{
fprintf(F1,"1\t%10i",number);
number++;
goto read;
}
parsep=cmdbuf;
parsep=parse(lexbuf,parsep);
if (0>(opcode=findstr(mnemonics,lexbuf)))
parsep=parse(lexbuf,parsep);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.