Асемблери.
Ціль роботи: засвоїти принципи написання та функціонування компіляторів програм та придбати практичні навички в розробці програм компіляції (асемблювання) на прикладі написання компілятора початкового модулю (файла), написаного на мові асемблера.
Постановка задачі: необхідно розробити програму, формуючу розширений листинг фрагменту програми на мові асемблера.
пока ((s!='\t')&&(s!=' ')&&(s!='\n') &&(s!=',')&&(s!=':'))
Текст програми:
#incl ude <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#define dw int
#define db char
#define clearbuf {\ //очищение переменной buf
for (int t=0;t<10;t++)\
buf[t]=0;}
#define loadreg char *reg[18];\
reg[5]="ax";\
reg[6]="bx";\
reg[7]="cx";\
reg[8]="dx";\
reg[9]="ds";\
reg[10]="al";\
reg[11]="ah";\
reg[12]="bl";\
reg[13]="bh";\
reg[14]="cl";\
reg[15]="ch";\
reg[16]="dl";\
reg[17]="dh";\
FILE *file_r,*file_w; //файлы для чтения, записи
char *label[5],oldname[12]; //oldname хранит начальный argv[1]
int r=1,t=1,z=0,as=0,t1=1,t2=1,t3=0,q=0,y=0, xc=0,b=0,offset=0,disp=0,sa=0,sb=0,f1=0,f2=0,f3=0,dis=0,nstr=0,sd=0,prohod=0;
struct namek { //хранит имена переменных, их тип, значение и смещение
char name[10];
char type[5];
int chislo;
int smesh;
namek *next;
} *n,*n1,*n2,*ret,*qw;
struct loadcode { //хранит комманды, операнды(1,2), коды комманд
char com[6];
int op1;
int op2;
unsigned char code;
loadcode *next;
} *k,*k1,*k2;
struct byte2 {
char r[3];
char c;
char x;
} byte[15];
struct labels { //хранит название меток
char label[10];
char labname[10];
int labdisp;
labels *next;
} *lab,*lab1,*lab2;
struct segnam { //хранит назв. сегментов(data,code)
char segmname[10];
int segdisp;
segnam *next;
} *u,*u1,*u2;
// prototypes
void ScanString(char *str);
void LoadDir(char *buf);
void AnalizDir(char *buf,char *str,char *dir[6]);
namek *LoadName(char *str);
loadcode *LoadCode();
void LoadByte2();
void cmp(char buf[5],char *str);
void print(int sw,char *str,loadcode *k1,unsigned char ws);
void CodeCmp(char *str);
char genbyte2(char *str);
void AnalizSegment(char *str);
void AnalizEnd(char *str);
void error(int er,char *buf,char *str);
void proverka(char *buf,char *str);
void progon(void);
void AnalizRegister(char *str);
void NamePrint(void);
char MakeList(char **argv); //замена .asm или др. в argv[1] на .lst
int segsearch(char *buf);
void timedat(void);
int main(int argc, char **argv)
{
int zt=0,flag=0,i=0;
char buf[24],buf1[12],str[42],s,*dir[7];
clrscr();
if (argc<2) {
printf("Invalid parameter\n");
return 1; }
if ((file_r=fopen(argv[1],"rb"))==NULL){
printf("Cannot open file 'code.asm'\n");
return 1; }
MakeList(argv); // *.asm -> *.lst
if ((file_w=fopen(argv[1],"wt"))==NULL){
printf("Cannot open output file\n");
exit(0); }
// проход 1
if (prohod==0) {
while (!feof(file_r))
{ fgets(str,40,file_r); //чтение с file_r в str
nstr++; //счетчик строк
if (strstr(str,";")) continue; //если в str есть ";"
//т.е. пропускаем строку
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.