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; 
}