www.pudn.com > hsgbiyiyuanli.rar > toasm.h
/*==================产生汇编码==========================*/
int tran_to_asm()
{
out = fopen("target.asm","wa");
if (!out)
{
printf("can't write the asm file!\n");
return 1;
}
fprintf(out,";program %s\n",FLAGTAB[quad[0].ag1].name);
fprintf(out,"data segment\n");
for (int i = 1; i < f_amount ; i++ )
{
if(FLAGTAB[i].name[0] != '\0')
{
fprintf(out,"\t%s\t dw \t ? \n", FLAGTAB[i].name );
}
else
{
fprintf(out,"\ttemp\t dw \t ? \n");
fprintf(out,"data ends\n");
break;
}
}
fprintf(out,"code segment\n");
fprintf(out,"main \t proc far\n");
fprintf(out,"\t assume \t cs:code,\t ds:data \n");
fprintf(out,"start: \n");
fprintf(out,"\tmov ax,data\n");
fprintf(out,"\tmov ds,ax\n");
for ( i = 1; i < quad_index ; i++ )
{
fprintf(out,"p%d:\n",i);
switch (quad[i].opcode)
{
case 43:// +
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag1].name);
fprintf(out,"\tmov ax,[bx]\n");
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag2].name);
fprintf(out,"\tadd ax,[bx]\n");
fprintf(out,"\tmov bx,offset temp\n");
fprintf(out,"\tmov [bx],ax\n");
break;
case 45:// -
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag1].name);
fprintf(out,"\tmov ax,[bx]\n");
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag2].name);
fprintf(out,"\tsub ax,[bx]\n");
fprintf(out,"\tmov bx,offset temp\n");
fprintf(out,"\tmov [bx],ax\n");
break;
case 41:// *
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag1].name);
fprintf(out,"\tmov al,[bx]\n");
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag2].name);
fprintf(out,"\tmul byte ptr[bx]\n");
fprintf(out,"\tmov bx,offset temp\n");
fprintf(out,"\tmov [bx],ax\n");
break;
case 48:// /
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag1].name);
fprintf(out,"\tmov ax,[bx]\n");
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag2].name);
fprintf(out,"\tdiv byte ptr[bx]\n");
fprintf(out,"\tmov bx,offset temp\n");
fprintf(out,"\tmov [bx],al\n");//商在AL中
break;
case 51:// :=
if (FLAGTAB[quad[i].ag1].type == int_num)
{
fprintf(out,"\tmov ax,%d \n",FLAGTAB[quad[i].ag1].val.val_int );
}
else if(quad[i]. ag1 == T_PLACE )
{
fprintf(out,"\tmov bx,offset temp\n");
fprintf(out,"\tmov ax,[bx]\n");
}
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].result].name);
fprintf(out,"\tmov [bx],ax \n");
break;
case 53:// <
fprintf(out,"\tmov ax,offset %s\n",FLAGTAB[quad[i].ag1].name);
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag2].name);
fprintf(out,"\tmov cx,[bx] \n");
fprintf(out,"\tmov bx,ax \n");
fprintf(out,"\tcmp [bx],cx \n");
fprintf(out,"\tjs \t p%d \n",quad[i].result);
break;
case 54:// <=
fprintf(out,"\tmov ax,offset %s\n",FLAGTAB[quad[i].ag1].name);
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag2].name);
fprintf(out,"\tmov cx,[bx] \n");
fprintf(out,"\tmov bx,ax \n");
fprintf(out,"\tcmp [bx],cx \n");
fprintf(out,"\tjb \t p%d\n",quad[i].result);
break;
case 55:// <>
fprintf(out,"\tmov ax,%s\n",FLAGTAB[quad[i].ag1].name);
fprintf(out,"\tmov bx,%s\n",FLAGTAB[quad[i].ag2].name);
fprintf(out,"\tmov cx,[bx] \n");
fprintf(out,"\tmov bx,ax \n");
fprintf(out,"\tcmp [bx],cx \n");
fprintf(out,"\tjnz \t p%d\n",quad[i].result);
break;
case 56:// =
fprintf(out,"\tmov ax,offset %s\n",FLAGTAB[quad[i].ag1].name);
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag2].name);
fprintf(out,"\tmov cx,[bx] \n");
fprintf(out,"\tmov bx,ax \n");
fprintf(out,"\tcmp [bx],cx \n");
fprintf(out,"\tjz \t p%d\n",quad[i].result);
break;
case 57:// >
if (quad[i].ag1 == 1 && quad[i].ag2 == 0)
{
fprintf(out,"\tjmp \t p%d\n",quad[i].result);
}
else
{
fprintf(out,"\tmov ax,offset %s\n",FLAGTAB[quad[i].ag1].name);
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag2].name);
fprintf(out,"\tmov cx,[bx] \n");
fprintf(out,"\tmov bx,ax \n");
fprintf(out,"\tcmp [bx],cx \n");
fprintf(out,"\tjns \t p%d\n",quad[i].result);
}
break;
case 58:// >=
fprintf(out,"\tmov ax,offset %s\n",FLAGTAB[quad[i].ag1].name);
fprintf(out,"\tmov bx,offset %s\n",FLAGTAB[quad[i].ag2].name);
fprintf(out,"\tmov cx,[bx] \n");
fprintf(out,"\tmov bx,ax \n");
fprintf(out,"\tcmp [bx],cx \n");
fprintf(out,"\tjnb \t p%d\n",quad[i].result);
break;
case SYS:
fprintf(out,"\tmov ax,4c00h\n");
fprintf(out,"\tint 21h\n");
fprintf(out,"main endp\n");
fprintf(out,"code ends\n");
fprintf(out,"\t end start\n");
}
}
fclose(out);
return 1;
}