#include <iostream.h>
#include <stdio.h>
#include <string.h>
extern int sym_count;
extern long int loc_ctr;
class symtab
{
char name[50][10];
long int addr[50];
char w[50][3];
public:
symtab()
{
}
void insert(char [],char []);
long int get_addr(char []);
int check_sym(char []);
int check_key(char []);
char *get_w(char []);
char * get_loctr(long int l);
}sy;
void symtab::insert(char n[],char a[])
{
strcpy(name[sym_count],n);
addr[sym_count]=loc_ctr;
strcpy(w[sym_count],a);
sym_count++;
}
long int symtab::get_addr(char n[])
{
for(int i=0;i<=sym_count;i++)
if(strcmp(name[i],n)==0)
return addr[i];
return -1;
}
int symtab::check_sym(char n[])
{
for(int i=0;i<sym_count;i++)
if(strcmp(n,name[i])==0) return 0;
return 1;
}
char * symtab::get_w(char n[])
{
for(int i=0;i<sym_count;i++)
if(strcmp(n,name[i])==0) {return w[i];}
}
int symtab::check_key(char a[])
{
int i;
char k[205][10]={
"aaa","aad","aam","aas","add","adc","and","assume", "call","cbw","cmp","clc","cld","cmps",
"cwd","cli","daa","das","db","dw","dq","dt","dec","div","end","endp","ends","even","equ",
"extrn","group","global", "hlt", "idiv","imul","into","inc","in","iret","into","jne",
"jnz","je","jz","jl","jnge","ja","jnbe","jb","jnae","jbe","jna","jo","jp","jpe","jmp","js",
"jnb","jae","jns","jcxz","jle","jng","jnp","jpo","jno","jnle","jg","jnl","jge","lea", "label",
"length","local", "lds","les","lahf","lock","loop","loopz","loope","loopne","loopnz","mov", "movs","mul","name","neg","not","offset","or","org","out","popf","proc","ptr","public","pushf",
"push","pop","rep","ret","rcl","rcr","rol","ror","sahf","sar","seg","segment","short","shl", "shr","scas","sub","sbb",
"sti","std","test","type","wait","xlat","xor"};
for(i=0;i<150;i++)
if(strcmp(k[i],a)==0) return 0;
return 1;
}
char * symtab :: get_loctr(long int l)
{
char x[20],y[30];
int i=0,a;
while(l>0)
{
a=l%2;
x[i++]=a+48;
l=l/2;
}
x[i]='\0';
for(i=strlen(x);i<16;i++)
x[i]='0';
x[i]='\0';
for(i=0;i<strlen(x);i++)
y[i]=x[strlen(x)-i-1];
y[i]='\0';
return y;
}