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;
}
/* Функция поиска строки в массиве строк
если не найдено - принимает значение -1,
иначе - местоположение этой строки */
int findstr(char *tab[], char *it)
{
int cmdidx;
cmdidx = 0;
while(tab[cmdidx])
{
if(strcomp(tab[cmdidx], it))
return cmdidx;
cmdidx++;
}
return -1;
}
int find_sym (char buf[MAXSTR])
{
int index;
for (index=0;index < j; index++)
if (strcomp(buf,symtab[index].mnem))
return index;
return -1;
}
void main(int argc,char *argv[])
{
clrscr();
unsigned char ttt;
if(argc>2) { printf("Too many files"); exit(0);}
int opcode, op1num, op2num, i=0,k=0,index;
int seg_open_flag=0; /*Флаг открытия сегмента*/
int label_flag=0; /*Флаг метки*/
char codop1;
int Seg_Begin,Seg_End; /* Начало и конец сегмента соответственно */
char *segreg[]={"DS","CS","SS"};
char *parsep; /* Остаток от выделения лексемы */
number=0; /* Счетчик строк */
char* temp;
strcpy(argv[1],"test");
strcpy(temp,argv[1]);
strcat(temp,".asm");
F=fopen(temp,"r");
if (F==NULL)
{
printf("\nFile not found");
exit(0);
}
strcpy(temp,argv[1]);
strcat(temp,".lst");
F1=fopen(temp,"w");
if (F1==NULL)
{
printf("\nFile not created");
exit(0);
}
begin2:
while (!feof(F))
{
fgets(cmdbuf,MAXSTR,F);
number++;
strupcase(cmdbuf);
if(strconsist("\n",cmdbuf[0])) /* Если строка пуста */
goto begin2;
parsep = cmdbuf;
do
{
restart2:
parsep=parse(lexbuf,parsep);
if (parsetyp==PT_LABEL) /* Если команда с меткой */
{
if (label_flag) exit(0);
strcpy(labeltab[k].mnem,lexbuf); /* Занесение метки в таблицу символов */
strcpy(labeltab[k].type,sym[0]);
strcpy(labeltab[k].atrib,segreg[i]);
labeltab[k].ef_adr=offs;
k++;
if (strconsist("\n",parsep[0]))
goto begin2;
label_flag=1;
goto restart2;
}
if (0>(opcode=findstr(mnemonics,lexbuf))) /* Если это не команда
то следующая лексема должна быть директивой */
{
if( 4== ( op1num=findstr(directives,lexbuf) ) ) break;
parsep=parse(lexbuf,parsep);
if (0>(op1num=findstr(directives,lexbuf))) exit(0);
else
{
/* Формирование листинга по директивам */
switch (op1num)
{
case DIR_SEG: /* Директива - segment */
seg_open_flag=1;
offs=0;
Seg_Begin=offs;
cmdbuf[0]=0;
break;
case DIR_ENDS: /* Директива - ends */
if (!seg_open_flag)
exit(0);
seg_open_flag=0;
Seg_End=offs;
parsep=parse(segtab[i].name,cmdbuf);
segtab[i].length=Seg_End-Seg_Begin;
i++;
break;
default: /* db или dw */
if (!seg_open_flag) exit(0);
parsep=parse(lexbuf,parsep);
if (strtoi(lexbuf,&n)) exit(0);
parsep=cmdbuf;
parsep=parse(symtab[j].mnem,parsep);
strcpy(symtab[j].type, sym[op1num]);
strcpy(symtab[j].atrib,segreg[i]);
symtab[j].ef_adr=offs;
offs=offs+op1num;
j++;
break;
}
goto begin2;
}
}
if (!operandcount[opcode]) /* Если директива end */
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.