主要的程序如下:
根据四元式产生汇编指令的关键是标号的生成
struct node6
{
int L;//判断是否需要标志符
int num;//标志符号
char op[10];//操作符
char arg1[10];//操作数1
char arg2[10];//操作数2
};
四元式的格式如下
输出格式:行号,四元式(操作,操作数,操作数,结果)。
(1): (=,3,-,i).
(2): (j<,i,7,4).
(3): (j,-,-,11).
(4): (j<,i,3,6).
(5): (j,-,-,8).
(6): (=,5,-,i).
(7): (j,-,-,10).
(8): (+,i,1,T1).
(9): (=,T1,-,i).
(10): (j,-,-,2).
int CCompiler::com_num(int x)
{
for(int i=0;i<quad_i;i++)
if(com_next_num[i].num==x)
return com_next_num[i].value;
return -1;
}
void CCompiler::equal(int num)
{
com_i_next++;
if (strcmp(quad[num].arg1,"-")!=0)
{
strcpy(com_next[com_i_next].op,"MOV");
strcpy(com_next[com_i_next].arg1,quad[num].result);
strcpy(com_next[com_i_next].arg2,quad[num].arg1);
}
else
{
strcpy(com_next[com_i_next].op,"MOV");
strcpy(com_next[com_i_next].arg1,quad[num].result);
strcpy(com_next[com_i_next].arg2,quad[num].arg2);
}
com_next[com_i_next].num=num;
}
void CCompiler::add(int i)
{
com_i_next++;
strcpy(com_next[com_i_next].op,"MOV");
strcpy(com_next[com_i_next].arg1,quad[i].result);
strcpy(com_next[com_i_next].arg2,quad[i].arg1);
com_next[com_i_next].num=i;
com_i_next++;
strcpy(com_next[com_i_next].op,"ADD");
strcpy(com_next[com_i_next].arg1,quad[i].result);
strcpy(com_next[com_i_next].arg2,quad[i].arg2);
//com_next[com_i_next].L=-1;
}
void CCompiler::sub(int i)
{
com_i_next++;
strcpy(com_next[com_i_next].op,"MOV");
strcpy(com_next[com_i_next].arg1,quad[i].result);
strcpy(com_next[com_i_next].arg2,quad[i].arg1);
com_next[com_i_next].num=i;
com_i_next++;
//com_next[com_i_next].L=-1;
strcpy(com_next[com_i_next].op,"SUB");
strcpy(com_next[com_i_next].arg1,quad[i].result);
strcpy(com_next[com_i_next].arg2,quad[i].arg2);
}
void CCompiler::mul(int i)
{
com_i_next++;
com_next[com_i_next].num=i;
strcpy(com_next[com_i_next].op,"MOV");
strcpy(com_next[com_i_next].arg1,quad[i].result);
strcpy(com_next[com_i_next].arg2,quad[i].arg1);
com_i_next++;
//com_next[com_i_next].L=-1;
strcpy(com_next[com_i_next].op,"MUL");
strcpy(com_next[com_i_next].arg1,quad[i].result);
strcpy(com_next[com_i_next].arg2,quad[i].arg2);
}
void CCompiler::div(int i)
{
com_i_next++;
com_next[com_i_next].num=i;
strcpy(com_next[com_i_next].op,"MOV");
strcpy(com_next[com_i_next].arg1,quad[i].result);
strcpy(com_next[com_i_next].arg2,quad[i].arg1);
com_i_next++;
//com_next[com_i_next].L=-1;
strcpy(com_next[com_i_next].op,"DIV");
strcpy(com_next[com_i_next].arg1,quad[i].result);
strcpy(com_next[com_i_next].arg2,quad[i].arg2);
}
void CCompiler::jnz(int i)
{
int number1;
int xx;
com_i_next++;
com_next[com_i_next].num=i;
strcpy(com_next[com_i_next].op,"CMP");
strcpy(com_next[com_i_next].arg1,quad[i].arg1);
strcpy(com_next[com_i_next].arg2,"0");
com_i_next++;
strcpy(com_next[com_i_next].op,"JNZ");
strcpy(com_next[com_i_next].arg2," ");
if(com_next[com_i_next].L!=1)com_next[com_i_next].L=-1;
number1=quad[i].result[0]-'0';
if((quad[i].result[1]<='9')&&(quad[i].result[1]>='0'))
number1=number1*10+quad[i].result[1]-'0';
//com_next[number1].L=1;
xx=com_num(number1);
com_next[xx].L=1;
com_next[com_i_next].num=number1;
}
void CCompiler::jmp(int i)
{
int number1;
int xx;
com_i_next++;
if(com_next[com_i_next].L!=1)
{
com_next[com_i_next].L=-1;
strcpy(com_next[com_i_next].op,"JMP");
strcpy(com_next[com_i_next].arg2," ");
number1=quad[i].result[0]-'0';
if((quad[i].result[1]<='9')&&(quad[i].result[1]>='0'))
number1=number1*10+quad[i].result[1]-'0';
xx=com_num(number1);
com_next[xx].L=1;
com_next[com_i_next].num=number1;
}
else
{
strcpy(com_next[com_i_next].op,"JMP");
strcpy(com_next[com_i_next].arg2," ");
com_next[com_i_next].arg1[0]='L';
com_next[com_i_next].arg1[1]='/0';
strcat(com_next[com_i_next].arg1,quad[i].result);
number1=quad[i].result[0]-'0';
if((quad[i].result[1]<='9')&&(quad[i].result[1]>='0'))
number1=number1*10+quad[i].result[1]-'0';
xx=com_num(number1);
com_next[xx].L=1;
com_next[com_i_next].num=i;
}
}
void CCompiler::jb(int i)
{
int number1;
com_i_next++;
com_next[com_i_next].num=i;
strcpy(com_next[com_i_next].op,"CMP");
strcpy(com_next[com_i_next].arg1,quad[i].arg1);
strcpy(com_next[com_i_next].arg2,quad[i].arg2);
com_i_next++;
//com_next[com_i_next].L=-1;
if(com_next[com_i_next].L!=1)com_next[com_i_next].L=-1;
strcpy(com_next[com_i_next].op,"JB");
strcpy(com_next[com_i_next].arg2," ");
number1=quad[i].result[0]-'0';
if((quad[i].result[1]<='9')&&(quad[i].result[1]>='0'))
number1=number1*10+quad[i].result[1]-'0';
//com_next[number1].L=1;
int xx;
xx=com_num(number1);
com_next[xx].L=1;
com_next[com_i_next].num=number1;
}
void CCompiler::jbe(int i)
{
int number1;
com_i_next++;
com_next[com_i_next].num=i;
strcpy(com_next[com_i_next].op,"CMP");
strcpy(com_next[com_i_next].arg1,quad[i].arg1);
strcpy(com_next[com_i_next].arg2,quad[i].arg2);
com_i_next++;
//com_next[com_i_next].L=-1;
if(com_next[com_i_next].L!=1)com_next[com_i_next].L=-1;
strcpy(com_next[com_i_next].op,"JBE");
strcpy(com_next[com_i_next].arg2," ");
number1=quad[i].result[0]-'0';
if((quad[i].result[1]<='9')&&(quad[i].result[1]>='0'))
number1=number1*10+quad[i].result[1]-'0';
//com_next[number1].L=1;
int xx;
xx=com_num(number1);
com_next[xx].L=1;
com_next[com_i_next].num=number1;
}
void CCompiler::ja(int i)
{
int number1;
com_i_next++;
com_next[com_i_next].num=i;
strcpy(com_next[com_i_next].op,"CMP");
strcpy(com_next[com_i_next].arg1,quad[i].arg1);
strcpy(com_next[com_i_next].arg2,quad[i].arg2);
com_i_next++;
com_next[com_i_next].L=-1;
strcpy(com_next[com_i_next].op,"JA");
strcpy(com_next[com_i_next].arg2," ");
number1=quad[i].result[0]-'0';
if((quad[i].result[1]<='9')&&(quad[i].result[1]>='0'))
number1=number1*10+quad[i].result[1]-'0';
int xx;
xx=com_num(number1);
com_next[xx].L=1;
com_next[com_i_next].num=number1;
}
void CCompiler::jae(int i)
{
int number1;
com_i_next++;
com_next[com_i_next].num=i;
strcpy(com_next[com_i_next].op,"CMP");
strcpy(com_next[com_i_next].arg1,quad[i].arg1);
strcpy(com_next[com_i_next].arg2,quad[i].arg2);
com_i_next++;
if(com_next[com_i_next].L!=1)com_next[com_i_next].L=-1;
strcpy(com_next[com_i_next].op,"JAE");
strcpy(com_next[com_i_next].arg2," ");
number1=quad[i].result[0]-'0';
if((quad[i].result[1]<='9')&&(quad[i].result[1]>='0'))
number1=number1*10+quad[i].result[1]-'0';
int xx;
xx=com_num(number1);
com_next[xx].L=1;
com_next[com_i_next].num=number1;
}
void CCompiler::je(int i)
{
int number1;
com_i_next++;
com_next[com_i_next].num=i;
strcpy(com_next[com_i_next].op,"CMP");
strcpy(com_next[com_i_next].arg1,quad[i].arg1);
strcpy(com_next[com_i_next].arg2,quad[i].arg2);
com_i_next++;
com_next[com_i_next].L=-1;
strcpy(com_next[com_i_next].op,"JE");
strcpy(com_next[com_i_next].arg2," ");
number1=quad[i].result[0]-'0';
if((quad[i].result[1]<='9')&&(quad[i].result[1]>='0'))
number1=number1*10+quad[i].result[1]-'0';
int xx;
xx=com_num(number1);
com_next[xx].L=1;
com_next[com_i_next].num=number1;
}
void CCompiler::jne(int i)
{
int number1;
com_i_next++;
com_next[com_i_next].num=i;
strcpy(com_next[com_i_next].op,"CMP");
strcpy(com_next[com_i_next].arg1,quad[i].arg1);
strcpy(com_next[com_i_next].arg2,quad[i].arg2);
com_i_next++;
com_next[com_i_next].L=-1;
strcpy(com_next[com_i_next].op,"JNE");
strcpy(com_next[com_i_next].arg2," ");
number1=quad[i].result[0]-'0';
if((quad[i].result[1]<='9')&&(quad[i].result[1]>='0'))
number1=number1*10+quad[i].result[1]-'0';
int xx;
xx=com_num(number1);
com_next[xx].L=1;
com_next[com_i_next].num=number1;
}