⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 assemble.c

📁 This is to build a 2 pass assembler in c language.
💻 C
📖 第 1 页 / 共 2 页
字号:
		    l++;c=0;
		    STATEMENT[l][c] = str[i];
		    l++;c=0;
	  break;
	  case ' ':
	  case '\t':
	  case '\n':
          case '\r':
	  case ',' :  STATEMENT[l][c] = 0;
	  break;
	  default:
	  STATEMENT[l][c++] = str[i];
	 }

      }
      numWords = l+1;
   }


unsigned indexMCT(char *s1, char *s2, char *s3)
{
    int i;
    for(i = 0 ; i < 300 ; i ++)
    {
       if(!stricmp(s1,MCT[i].mnemonic))
       {
	  if ( isRegister(s2))
	  {
	      for(;(stricmp(s2,MCT[i].operand1)!=0 && stricmp(s1,MCT[i].mnemonic )==0) ; i ++);

	      if(isRegister(s3))
	      {
		 for(;(stricmp(s3,MCT[i].operand2)!=0 && stricmp(s2,MCT[i].operand1)==0); i++);
		 return i;
	      }
	      else
	      {
		 return i;
	      }
	  }
	  else
	      return i;
       }
    }
    return -1;
}

SymbolTable Encode(char *str1,char *str2,char *str3)
{
   SymbolTable temp;
   char a[100],b[100],c[100];
   int i,n;
   strcpy(temp.symbol, str1);
   n =indexMCT(str1,str2,str3);
   temp.memory = MCT[n].memory;
   temp.type = MNEMONIC;
   return temp;
}
    int isPSOP(char *s)
    {
       int c1,c2,c3,c4;;
       c1 =stricmp(s,"DD");
       c2 =stricmp(s,"DB");
       c3 =stricmp(s,"DW");
       c4 =stricmp(s,"EQU");
       return !(c1*c2*c3*c4);

    }

int isMachineCode(char *str)
{
    int i;
    for(i = 0; i < 300 ; i ++)
     if(stricmp(str, MCT[i].mnemonic) == 0)
       return 1;

     return 0;
}
int isDataLabel(char *str)
{
     int i;
     for(i = 0 ; i < nData ; i ++)
	 if(stricmp(ST_Data[i].symbol,str)==0)
	    return 1;
     return 0;
}
int isRegister(char *s)
{    int i;
     static char regs[21][10] = {"ah","al","ax","bh","bl","bx","ch","cl","cx",
				 "dh","dl","dx","cs","ds","sp","si","di","es",
				 "ss","sp","bp"};
     for(i = 0 ; i < 21 ; i ++)
     if(stricmp(regs[i],s)==0)
	return 1;
     return 0;
}
int isPunctuation(char *s)
{
    switch(s[0])
    {
       case ',':
       case ':':
       return 1;
       default:
       return 0;

    }
}

int isLABEL_CODE_ADDR(char *s)
{
   if(!(isMachineCode (s) || isPunctuation(s) ||
	isRegister(s)     || isLABEL_DATA_ADDR(s)||
	isNumber(s)) ||strlen(s)==0)
      return 1;
   return 0;
}
int isLABEL_DATA_ADDR(char *st)
{
   char s[100];
   int i;
     strcpy(s,st+1);
     for(i=0;s[i];i++)
       if(s[i]==']')
	  s[i] = '\0';
   for(i = 0 ; i < nData ; i ++)
      if(strcmp(ST_Data[i].symbol, s)==0)
	return 1;
   return 0;
}
int isNumber(char *s)
{
   char t[100];
   unsigned n;
   sscanf(s,"%[^hH]s",t);
   return sscanf(t,"%x",&n);;
}
unsigned hexRead(char *s)
{
   char t[100];
   unsigned n;
   sscanf(s,"%[^hH]s",t);
   sscanf(t,"%x",&n);;
   return n;

}
void printcode(FILE *fp, Instruction val,unsigned lc)
{
    int i=1;
    fprintf(fp,"\n%04X : %02X",lc,val.code[0]);
    printf("\n%04X : %02X",lc,val.code[0]);
    for( ; i<val.num ; i ++)
       fprintf(fp,"%02X",val.code[i]);
       printf("%02X",val.code[i]);
}
  Instruction createInstruction(char *m, char *o1, char *o2)
  {
     Instruction ins;
     int n;
     n = indexMCT(m,o1,o2);
     if(MCT[n].memory == 1)
     {
	ins.num = 1;
	ins.code[0] = MCT[n].value ;
     }
     if(MCT[n].memory == 2)
     {
	ins.num = 2;
	if(MCT[n].operand1[0] != '\0')
	{
	     if(o2[0] == '\0')
	     {
		 ins.code[0] = MCT[n].value / 0x100;
		 ins.code[1] = MCT[n].value % 0x100;
	     }
	     else
	     {
		 ins.code[0]= MCT[n].value / 0x100;
		 ins.code[1] = MCT[n].value % 0x100;
	     }
	}
	else
	{
	    ins.code[0] = MCT[n].value ;
	    ins.code[1] = hexRead(o1);
	}
     }
     if(MCT[n].memory == 3)
     {
	 ins.num = 3;
	 ins.code[0] = MCT[n].value / 0x100 ;
	 ins.code[1] = MCT[n].value % 0x100 ;
         ins.code[2] = hexRead(o2);
     }
     return ins;

  }
 int stricmp( char *s1,  char *s2)
  {
	int i;
        if(strlen(s1)!=strlen(s2))
           return 5;
	for(i = 0 ; s1[i]!='\0' ; i ++)
	if(toupper(s1[i])!= toupper(s2[i]))
            return 2;
        return 0;

  }

   void pass1(char * fname)
   {
       FILE *fp;
       char str[100],temp[100];
       int i,inDataSeg=1;
       unsigned LCcount=0,snum=0,wc,val;
       fp = fopen(fname,"r");
       if(!fp)
{
    printf("\nError "); exit(1);
}
       while(fgets(str,100,fp)>0)
       {
	    parse(str);
	    wc = 0;
	    if(inDataSeg==1)
	    {
		if(stricmp(STATEMENT[1],"SEGMENT")==0)
		{
		    strcpy(ST_Data[snum].symbol, STATEMENT[0]);
		    ST_Data[snum].memory = 0;
		    ST_Data[snum].type = SEGMENT;
		    ST_Data[snum].LC = 0;
		    LCcount = 0;
		    snum=1;
		}
		if(stricmp(STATEMENT[1],"EQU")==0)
		{
		    strcpy(ST_Data[snum].symbol,STATEMENT[0]);
		    ST_Data[snum].memory = 1;
		    ST_Data[snum].type = CONSTANT;
		    ST_Data[snum].LC =LCcount;
		    LCcount +=1;
		    snum++;
		}
		if(stricmp(STATEMENT[1],"DW")==0)
		{
		    unsigned sz;
		    strcpy(ST_Data[snum].symbol,STATEMENT[0]);
		    ST_Data[snum].type = VARIABLE;
		    sscanf(STATEMENT[2],"%X", &sz);
		    ST_Data[snum].memory = 2 * sz;
		    ST_Data[snum].LC = LCcount;
		    LCcount +=ST_Data[snum].memory;
		    snum++;
		}
		if(stricmp(STATEMENT[1],"DB")==0)
		{
		    unsigned sz;
		    strcpy(ST_Data[snum].symbol,STATEMENT[0]);
		    ST_Data[snum].type = VARIABLE;
		    sscanf(STATEMENT[2],"%X", &sz);
		    ST_Data[snum].memory = sz;
		    ST_Data[snum].LC = LCcount;
		    LCcount +=ST_Data[snum].memory;
		    snum++;
		}
		if(stricmp(STATEMENT[1],"ENDS")==0)
		{
		     inDataSeg =0;
		     nData = snum;
		     snum = 0;
		}
	    }
	    else
	       if(stricmp(STATEMENT[0],"ORG")==0)
	       {
		    sscanf(STATEMENT[1],"%[^hH]s",&temp);
		    sscanf(temp,"%X",&val);
		    snum = 0;
		    LCcount = val;
	       }
	       else
	       {
		if(stricmp(STATEMENT[1],"SEGMENT")==0)
		{
		    strcpy(ST_Code[snum].symbol, STATEMENT[0]);
		    ST_Code[snum].memory = 0;
		    ST_Code[snum].type = SEGMENT;
		    ST_Code[snum].LC = LCcount;
		    snum=1;
		}
		if(stricmp(STATEMENT[1],"ENDS")==0)
		{
		     nCode = snum;
		}
		wc = 0;
		if(STATEMENT[1][0] == ':')
		{
		      strcpy(ST_Code[snum].symbol,STATEMENT[0]);
		      ST_Code[snum].memory = 0;
		      ST_Code[snum].LC = LCcount;
		      ST_Code[snum].type = LABEL_CODE_ADDR;

		      wc = 2;
		      snum++;
		}
		for( ; wc<=numWords ; wc++)
		{
		     if(!STATEMENT[0])
			break;
		     if(isMachineCode(STATEMENT[wc]))
		     {
			  ST_Code[snum] = Encode(STATEMENT[wc]  ,STATEMENT[wc+1],
						 STATEMENT[wc+2]);
			  ST_Code[snum].LC = LCcount;
			  LCcount +=ST_Code[snum].memory;
			  snum++;
		     }

		     if(isDataLabel(STATEMENT[wc]))
		     {
			  strcpy(ST_Code[snum].symbol, STATEMENT[wc]);
			  ST_Code[snum].LC = LCcount;
			  ST_Code[snum].type = LABEL_DATA;
			  ST_Code[snum].memory = 0;
			  snum++;
		     }

		     if(isLABEL_CODE_ADDR(STATEMENT[wc]))
		     {
			  if(strlen(STATEMENT[wc]) > 0)
			  {
			     strcpy(ST_Code[snum].symbol, STATEMENT[wc]);
			     ST_Code[snum].LC = LCcount;
			     ST_Code[snum].type = LABEL_CODE_ADDR;
			     ST_Code[snum].memory = 0;
			     snum++;
			  }

		     }
		     if(isLABEL_DATA_ADDR(STATEMENT[wc]))
		     {
			  strcpy(ST_Code[snum].symbol, STATEMENT[wc]);
			  ST_Code[snum].LC = LCcount;
			  ST_Code[snum].type = LABEL_DATA_ADDR;
			  ST_Code[snum].memory = 0;
			  snum++;
		     }

		}//for

	       }//else
       }//while
       nCode=snum;
   fclose(fp);
   }

   void pass2(char *fname,char *ofname)
   {
       FILE *fp,*obf;
       char str[100],temp[100];
       int i,inDataSeg=1;
       unsigned LCcount=0,snum=0,wc,val;
       Instruction tempins;

       fp  = fopen(fname,"r");
       obf = fopen(ofname,"w");
       while(fgets(str,100,fp)>0)
       {
	    parse(str);
	    wc = 0;
	    if(inDataSeg==1)
	    {
		if(stricmp(STATEMENT[1],"SEGMENT")==0)
		{
		      snum++;
		      LCcount = 0;
		}
		if(stricmp(STATEMENT[1],"EQU")==0)
		{
		      sscanf(STATEMENT[2],"%s",temp);
		      sscanf(temp,"%X",&val);
		      tempins.code[0] = val;
		      tempins.num = 1;
		      printcode(obf,tempins,ST_Data[snum].LC);
		      LCcount += ST_Data[snum].LC;
		      snum++;
		}
		if(stricmp(STATEMENT[1],"DW")==0)
		{
		      sscanf(STATEMENT[2],"%s",temp);
                      sscanf(temp,"%X",&val);
		      for(i = 0 ; i < ST_Data[snum].memory/2 ; i ++)
		      {
			  tempins.code[0] = val/0x100;
                          tempins.code[1] = val%0x100;
			  tempins.num = 2;
			  printcode(obf,tempins,ST_Data[snum].LC+i*2);
		      }
		      LCcount = ST_Data[snum].LC;
		      snum++;
		}

		if(stricmp(STATEMENT[1],"DB")==0)
		{

		      sscanf(STATEMENT[2],"%[^hH]s",temp);
		      for(i = 0 ; i < ST_Data[snum].memory ; i ++)
		      {

			  tempins.code[0] = 0;
			  tempins.num = 1;
			  printcode(obf,tempins,ST_Data[snum].LC+i);
		      }

		      LCcount = ST_Data[snum].LC;

		      snum++;
		}
		if(stricmp(STATEMENT[1],"ENDS")==0)
		{
		      snum=0;
		      inDataSeg = 0;
		}
	    }
	    else
	       if(stricmp(STATEMENT[0],"ORG")==0)
	       {
	       }
	       else
	       {

		    if(stricmp(STATEMENT[1],"SEGMENT")==0)
		    {
			  for(; LCcount < ST_Code[snum].LC; LCcount++)
			  {
			      tempins.code[0] = 0;
			      tempins.num =1;
			      printcode(obf,tempins,LCcount);
			  }
			  snum++;
		    }
		    if(stricmp(STATEMENT[1],"ENDS")==0)
		    {

		    }
		    if(STATEMENT[1][0] == ':')
		    {
			LCcount+=ST_Code[snum].memory;
			snum++;
		    }
		    for( ; wc<numWords ; wc++)
		    {
			 if(isMachineCode(STATEMENT[wc]))
			 {
			     tempins = createInstruction(STATEMENT[wc],
							STATEMENT[wc+1],
							STATEMENT[wc+2]);

				 printcode(obf, tempins,LCcount);
			     LCcount+=ST_Code[snum].memory;
			     snum++;


			 }
			 if(isDataLabel(STATEMENT[wc]))
			 {
			    LCcount+=ST_Code[snum].memory;
			    snum++;
			 }
			 if(isLABEL_CODE_ADDR(STATEMENT[wc]))
			 {

			       if(strlen(STATEMENT[wc]) > 0)
			       {
			       LCcount+=ST_Code[snum].memory;
			       snum++;
			       }
			 }
			 if(isLABEL_DATA_ADDR(STATEMENT[wc]))
			 {
			    snum++;
			 }
		    }//for
	       }//else
       }//while
       nCode=snum;

   fclose(fp);
   fclose(obf);

   }
   /*********************************************************************
			End of External Functions
   **********************************************************************/
   /********************************************************************
			  MAIN
   ********************************************************************/
   main(int argc, char *argv[])
   {

      if(argc>1)
      pass1(argv[1]);
      pass2(argv[1],argv[2]);

   }
   /********************************************************************
			    END OF MAIN
   ********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -