?? codegen.c
字號:
#include <stdlib.h>
#include "globals.h"
#include "parse.h"
#include "symtab.h"
static int label_num = 0;
TreeNode * Fun;
void insert()
{
fprintf(inter_code,"\tWRITE\tproc\tnear\n");
}
void write()
{
fprintf(inter_code,"\tWRITE\tproc\tnear\n");
fprintf(inter_code,"\tMOV\tCX , 10000\n");
fprintf(inter_code,"\tCMP\tBX , CX\n");
fprintf(inter_code,"\tJL\tw_label1\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tMOV\tCX , 1000\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tMOV\tCX , 100\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tMOV\tCX , 10\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tMOV\tCX , 1\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tJMP\tw_label5\n");
fprintf(inter_code,"w_label1:\n");
//----------------------------------------------------
fprintf(inter_code,"\tMOV\tCX , 1000\n");
fprintf(inter_code,"\tCMP\tBX , CX\n");
fprintf(inter_code,"\tJL\tw_label2\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tMOV\tCX , 100\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tMOV\tCX , 10\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tMOV\tCX , 1\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tJMP\tw_label5\n");
fprintf(inter_code,"w_label2:\n");
//----------------------------------------------------
fprintf(inter_code,"\tMOV\tCX , 100\n");
fprintf(inter_code,"\tCMP\tBX , CX\n");
fprintf(inter_code,"\tJL\tw_label3\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tMOV\tCX , 10\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tMOV\tCX , 1\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tJMP\tw_label5\n");
fprintf(inter_code,"w_label3:\n");
//----------------------------------------------------
fprintf(inter_code,"\tMOV\tCX , 10\n");
fprintf(inter_code,"\tCMP\tBX , CX\n");
fprintf(inter_code,"\tJL\tw_label4\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tMOV\tCX , 1\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"\tJMP\tw_label5\n");
fprintf(inter_code,"w_label4:\n");
//----------------------------------------------------
fprintf(inter_code,"\tMOV\tCX , 1\n");
fprintf(inter_code,"\tCALL\tWRITE_SUB\n");
fprintf(inter_code,"w_label5:\n");
fprintf(inter_code,"\tRET\n");
fprintf(inter_code,"\tWRITE\tendp\n\n");
}
void write_sub()
{
fprintf(inter_code,"\tWRITE_SUB\tproc\tnear\n");
fprintf(inter_code,"\tMOV\tAX , BX\n");
fprintf(inter_code,"\tMOV\tDX , 0\n");
fprintf(inter_code,"\tDIV\tCX\n");
fprintf(inter_code,"\tMOV\tBX , DX\n");
fprintf(inter_code,"\tMOV\tDL , AL\n");
fprintf(inter_code,"\tADD\tDL , '0'\n");
fprintf(inter_code,"\tMOV\tAH , 02h\n");
fprintf(inter_code,"\tINT\t21h\n");
fprintf(inter_code,"\tRET\n");
fprintf(inter_code,"\tWRITE_SUB\tendp\n\n");
}
void GenLabel(char lab[LABEL_SIZE]) //生成標號的函數(shù)
{
static int i=1;
char temp[LABEL_SIZE];
strcpy(lab,"L");
_itoa(i,temp,10);
strcat(lab,temp);
i++;
}
void StackSegment(void) //堆棧段
{
fprintf(inter_code,";*******************************************************\n");
fprintf(inter_code,"Stack_seg\tsegment\n");
fprintf(inter_code,"\tdw\t200h dup(?)\n");
fprintf(inter_code,"Stack_seg_top\tlabel\tword\n");
fprintf(inter_code,"Stack_seg\tends\n");
}
void DataSegmentBegin(void) //數(shù)據(jù)段
{
fprintf(inter_code,";*******************************************************\n");
fprintf(inter_code,"Data_seg\tsegment\n");
}
void DataSegmentEnd(void)
{
fprintf(inter_code,"Data_seg\tends\n");
fprintf(inter_code,";*******************************************************\n");
}
void CodeSegmentBegin(void) //代碼段
{
fprintf(inter_code,"Code_seg\tsegment\n");
fprintf(inter_code,"\tassume\tCS:Code_seg, DS:Data_seg, SS:Stack_seg\n");
}
void CodeSegmentEnd(void)
{
fprintf(inter_code,"Code_seg\tends\n");
fprintf(inter_code,"\tend\tstart\n");
fprintf(inter_code,";*******************************************************\n");
}
//--------------------------------------------------------------------------對不同的變量定義進行處理
void VarDec_ini(char *name, int value)
{
ValEntry * pEntry = malloc(sizeof(ValEntry));
Lookup_Var(pTable, pTable ->funEntry, name, pEntry);
if(pEntry->type==Integer)
{
fprintf(inter_code,"%s\tdw\t",pEntry->name);
fprintf(inter_code,"%d\t\n",value);
}
if(pEntry->type==Char)
{
int i=0;
char j;
fprintf(inter_code,"%s\tdb\t",pEntry->name);
if(value-64)
while(i<26)
{
if(i==value-65)
{
j=(char)('A'+i);
fprintf(inter_code,"'%c'\t\n",j);
}
i++;
}
i=0;
if(value-96)
while(i<26)
{
if(i==value-97)
{
j=(char)('a'+i);
fprintf(inter_code,"'%c'\t\n",j);
}
i++;
}
}
}
void VarDec(char *name)//local variable declaration without initial value
{
ValEntry * pEntry = malloc(sizeof(ValEntry));
Lookup_Var(pTable, pTable ->funEntry, name, pEntry);
if(pEntry->type==Integer)
{
fprintf(inter_code,"%s\tdw\t",pEntry->name);
fprintf(inter_code,"?\t\n");
}
if(pEntry->type==Char)
{
fprintf(inter_code,"%s\tdb\t",pEntry->name);
fprintf(inter_code,"?\t\n");
}
}
void ArrDec(char *name, int entitynum)
{
ValEntry * pEntry = malloc(sizeof(ValEntry));
Lookup_Var(pTable, pTable ->funEntry, name, pEntry);
if(pEntry->type==Integer)
{
fprintf(inter_code,"%s\tdw\tdup(",pEntry->name);
fprintf(inter_code,"%d)\n",entitynum);
}
if(pEntry->type==Char)
{
fprintf(inter_code,"%s\tdb\tdup(",pEntry->name);
fprintf(inter_code,"%d)\n",entitynum);
}
}
//------------------------------------------------------------------------------------一些輔助函數(shù)
void ent(char *name, int para, int retvalue)
{
if(!strcmp("main",name)){//main function
fprintf(inter_code,"start:\n");
fprintf(inter_code,"\t%s\tproc\tfar\n",name);
fprintf(inter_code,"\tPUSH\tDS\n"); //DS壓棧
fprintf(inter_code,"\tSUB\tAX , AX\n"); //0壓棧
fprintf(inter_code,"\tPUSH\tAX\n");
fprintf(inter_code,"\tMOV\tAX , Data_seg\n");
fprintf(inter_code,"\tMOV\tDS , AX\n");
}
//其余函數(shù)的輸出
else fprintf(inter_code,"\t%s\tproc\tfar\n",name);//to code file
}
void compound_exit(void)
{
pTable = pTable->parent;
}
void leave(char *name)
{
fprintf(inter_code,"\t%s\tendp\n",name);
}
void ixa_elem_size(char *name1,int n)
{
fprintf(inter_code,"\tMOV\tSI , %d\n",n);
fprintf(inter_code,"\tPOP\t%s[",name1);
fprintf(inter_code,"SI]\n");
}
void ldl(char value)
{
fprintf(inter_code,"\tMOV\tAX , %d\n",(int)value);
fprintf(inter_code,"\tPUSH\tAX\n");
}
void lda(char *name)
{
fprintf(inter_code,"\tMOV\tAX , %s\n",name);
}
void ldc(int value)
{
fprintf(inter_code,"\tMOV\tAX , %d\n",value);
fprintf(inter_code,"\tPUSH\tAX\n");
}
void ldd(int value)
{
int i=0;
char j;
if(value-64)
while(i<26)
{
if(i==value-65)
{
j=(char)('A'+i);
fprintf(inter_code,"\tMOV\tAX , '%c'\n",j);
}
i++;
}
i=0;
if(value-96)
while(i<26)
{
if(i==value-97)
{
j=(char)('a'+i);
fprintf(inter_code,"\tMOV\tAX , '%c'\n",j);
}
i++;
}
fprintf(inter_code,"\tPUSH\tAX\n");
}
void lod(char *name)
{
fprintf(inter_code,"\tMOV\tAX , %s\n",name);
fprintf(inter_code,"\tPUSH\tAX\n");
}
void pop(void)
{
fprintf(inter_code,"\tPOP\tAX\n");
}
void ret(int r,char * name)
{
if(r)
{
fprintf(inter_code,"\tPOP\tDX\n");
}
if(strcmp("main",name))
{
fprintf(inter_code,"\tPOP\tCX\n");
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
}
fprintf(inter_code,"\tRET\n");
}
void stn(char *name)
{
fprintf(inter_code,"\tPOP\t%s\n",name);
}
//------------------------------------------------------------算術運算(+,-,*,/(%),++,--,&,|,^,~,<<,>>)
void adi(void) //對"+"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tADD\tAX , BX\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
void subi(void) //對"-"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tSUB\tAX , BX\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
void multi(void) //對"*"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tIMUL\tBX\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
void divi(void) //對"/"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tCWD\n");
fprintf(inter_code,"\tIDIV\tBX\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
void modi(void) //對"%"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tCWD\n");
fprintf(inter_code,"\tIDIV\tBX\n");
fprintf(inter_code,"\tPUSH\tDX\n");
}
void inci(void) //對"++"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tINC\tAX\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
void deci(void) //對"--"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tDEC\tAX\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
void b_andi(void) //對"&"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tAND\tAX , BX\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
void b_ori(void) //對"|"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tOR\tAX , BX\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
void b_xori(void) //對"^"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tXOR\tAX , BX\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
void b_noti(void) //對"~"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tNOT\tAX\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
void b_lefti(void) //對"<<"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tCX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tSHL\tAX , CL\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
void b_righti(void) //對">>"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tCX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tSHR\tAX , CL\n");
fprintf(inter_code,"\tPUSH\tAX\n");
}
//---------------------------------------------------------------------------關系運算(==,>,<,>=,<=,!=)
void equi(void) //對"=="進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tCMP\tAX , BX\n");
fprintf(inter_code,"\tJE\tLabel%d\n",label_num);
fprintf(inter_code,"\tMOV\tAX , 0\n");
fprintf(inter_code,"\tPUSH\tAX\n");
fprintf(inter_code,"\tJMP\tLabel%d\n",label_num + 1);
fprintf(inter_code,"Label%d:",label_num);
fprintf(inter_code,"\tMOV\tAX , 1\n");
fprintf(inter_code,"\tPUSH\tAX\n");
fprintf(inter_code,"Label%d:",label_num + 1);
label_num += 2;
}
void greater(void) //對">"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tCMP\tAX , BX\n");
fprintf(inter_code,"\tJG\tLabel%d\n",label_num);
fprintf(inter_code,"\tMOV\tAX , 0\n");
fprintf(inter_code,"\tPUSH\tAX\n");
fprintf(inter_code,"\tJMP\tLabel%d\n",label_num+1);
fprintf(inter_code,"Label%d:",label_num);
fprintf(inter_code,"\tMOV\tAX , 1\n");
fprintf(inter_code,"\tPUSH\tAX\n");
fprintf(inter_code,"Label%d:",label_num+1);
label_num += 2;
}
void less(void) //對"<"進行翻譯的函數(shù)
{
fprintf(inter_code,"\tPOP\tBX\n");
fprintf(inter_code,"\tPOP\tAX\n");
fprintf(inter_code,"\tCMP\tAX , BX\n");
fprintf(inter_code,"\tJL\tLabel%d\n",label_num);
fprintf(inter_code,"\tMOV\tAX , 0\n");
fprintf(inter_code,"\tPUSH\tAX\n");
fprintf(inter_code,"\tJMP\tLabel%d\n",label_num+1);
fprintf(inter_code,"Label%d:",label_num);
fprintf(inter_code,"\tMOV\tAX , 1\n");
fprintf(inter_code,"\tPUSH\tAX\n");
fprintf(inter_code,"Label%d:",label_num+1);
label_num += 2;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -