📄 assemble.c
字号:
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 + -