⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asm.c

📁 北京航空航天大学计算机系要求的编译器大作业。大概6000行代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
				strcpy(str,NextStr());
				strcpy(mylbl,NextLabel());
				fprintf(asm,"\tjmp\t%s\n",mylbl);
				fprintf(asm,"%s\tByte\t\"%s\",0\n",str,mt->ad1);
				fprintf(asm,"%s:\n",mylbl);
				fprintf(asm,"\toutput\t%s\n",str);
			}
			else   
			{
				read = search(h1,mt->ad1);
				if(read == NULL)
				{
					read = search(h2,mt->ad1);                      // h2是临时变量表头
					if(read == NULL)
					{
						read = search(h3,mt->ad1);
						if(read == NULL)   // 这时可能是打出一个常数了。
						{
							fprintf(asm,"\tmov\teax,\t%s\n",mt->ad1);
							fprintf(asm,"\tdtoa\tlab,\teax\n");
							fprintf(asm,"\toutput\tlab\n");
						}
						else
						{
							fprintf(asm,"\tmov\teax,\t%s\n",mt->ad1);
							fprintf(asm,"\tdtoa\tlab,\teax\n");
							fprintf(asm,"\toutput\tlab\n");
						}
					}
					else
					{
						fprintf(asm,"\tmov\teax,\t[ebp+(%d)]\n",read->add);
						fprintf(asm,"\tdtoa\tlab,\teax\n");
						fprintf(asm,"\toutput\tlab\n");
					}
				}
				else
				{
					fprintf(asm,"\tmov\teax,\t[ebp+(%d)]\n",read->add);
					fprintf(asm,"\tdtoa\tlab,\teax\n");
					fprintf(asm,"\toutput\tlab\n");
				}
			}
		}
		
		
		else if(strcmp(mt->op,"call") == 0)  // call functions
		{
			strcpy(str,mt->ad1);
			fprintf(asm,"\tcall\t%s\n",str);
			fprintf(asm,"\tadd\tesp,\t%d\n",4*push);
			push = 0;
			mt = mt->next;
			if(mt != NULL && strcmp(mt->op,":=") == 0 && strcmp(mt->ad2,str) == 0 )
			{
				read = search(h1,mt->ad1);
				if(read != NULL)
				{
					fprintf(asm,"\tmov\t[ebp+(%d)],\teax",read->add);
				}
				else  // 这个临时变量是新生成的,需要重新申请空间。
				{
					read = search(h2,mt->ad1);
					if(read == NULL)
					{
						read = search(h3,mt->ad1);
						if(read == NULL)
						{
							tp1 = (AddTable*)malloc(sizeof(AddTable));
							tp1->add = (-1)*4*(++counter);
							strcpy(tp1->id,mt->ad1);
							tp1->next = NULL;
							fprintf(asm,"\tpush\teax\n");
							if(h2 == NULL)
							{
								h2 = tp1;
								hc2 = tp1;
							}
							else
							{
								hc2->next = tp1;
								hc2 = hc2->next;
							}
						}
						else
						{
							fprintf(asm,"\tmov\t[ebp+(%d)],\teax",read->add);
						}
					}
					else
					{
						fprintf(asm,"\tmov\t[ebp+(%d)],\teax",read->add);
					}
				}
			}
			else
				continue;
		}
		
		
		else if(strcmp(mt->op,":=") == 0)  // := 
		{
			// 第一条指令,把第二个操作数放到寄存器中
			read = search(h1,mt->ad2);
			if(read == NULL)
			{
				read =search(h2,mt->ad2);
				if(read == NULL)
				{
					read = search(h3,mt->ad2);
					if(read != NULL)
						fprintf(asm,"\tmov\teax,\t%s\n",mt->ad2);
						//fprintf(asm,"\tmov\teax,\t[ebp+%d]\n",read->add);
					else
						fprintf(asm,"\tmov\teax,\t%s\n",mt->ad2); // :=	i 	6的情况
				}
				else
				{
					fprintf(asm,"\tmov\teax,\t[ebp+(%d)]\n",read->add);	
				}
			}
			else
			{
				fprintf(asm,"\tmov\teax,\t[ebp+(%d)]\n",read->add);
			//	fprintf(asm,"\tmov\teax,\t%s\n",mt->ad2);
			}
			
			// 第二条指令:再把寄存器中的数据放到第一个操作数中
			read = search(h1,mt->ad1);
			if(read == NULL)
			{
				read = search(h2,mt->ad1);
				if(read == NULL)
				{
					read = search(h3,mt->ad1);
					if(read != NULL)  // 应该是read 不为空的。不然会有错误的
						fprintf(asm,"\tmov\t%s,\teax\n",mt->ad1);
				}
				else
				{
					fprintf(asm,"\tmov\t[ebp+(%d)],\teax\n",read->add);	
				}
			}
			else
			{
				//fprintf(asm,"\tmov\t%s,\teax\n",mt->ad1);
				fprintf(asm,"\tmov\t[ebp+(%d)],\teax\n",read->add);
			}
		}
		
		
		
		else if(strcmp(mt->op,"return") == 0)  // 返回
		{
			//retFlag = 1;
			if(strcmp(mt->ad1,"") != 0)  // return some value.
			{
				read = search(h1,mt->ad1);
				if(read != NULL) // 如果是局部变量
				{
					fprintf(asm,"\tmov\teax,\t[ebp+(%d)]\n",read->add);
					fprintf(asm,"\tadd\tesp,\t%d]\n",4*counter);
					popReg();
					fprintf(asm,"\tret\n");
				}
				else
				{
					read = search(h2,mt->ad1);
					if(read != NULL)            // 返回临时变量
					{
						fprintf(asm,"\tmov\teax,\t[ebp+(%d)]\n",read->add);
						fprintf(asm,"\tadd\tesp,\t%d\n",4*counter);
						popReg();
						fprintf(asm,"\tret\n");
					}
					else
					{
						// 这里这样写是对的,不管怎么样,都应该这样写。;
						
						fprintf(asm,"\tmov\teax,\t%s\n",mt->ad1);
						fprintf(asm,"\tadd\tesp,\t%d\n",4*counter);
						popReg();
						
						fprintf(asm,"\tret\n");
					}
				}
			}
			else
			{
				fprintf(asm,"\tadd\tesp,\t%d\n",4*counter);
				popReg();
				
				fprintf(asm,"\tret\n\n");
			}
			mtt = mt->next;
			if(strcmp(mtt->op,"end") == 0)
			{
				mt = mt->next;						//跳过后面那条语句
				fprintf(asm,"%s\tendp\n",function);
			}
		}
		
		
		else if(strcmp(mt->op,"cmp") == 0)  // comparison statement
		{
			read = search(h1,mt->ad2);   // the second argument
			if(read == NULL)
			{
				read = search(h2,mt->ad2);
				if(read == NULL)
				{
					fprintf(asm,"\tmov\tebx,\t%s\n",mt->ad2);
				}
				else
				{
					fprintf(asm,"\tmov\tebx,\t[ebp+(%d)]\n",read->add);
				}
			}
			else
			{
				fprintf(asm,"\tmov\tebx,\t[ebp+(%d)]\n",read->add);
			}
			
			read = search(h1,mt->ad1);
			if(read == NULL)
			{
				read = search(h2,mt->ad1);
				if(read == NULL)
				{
					fprintf(asm,"\tmov\teax\t%s\n",mt->ad1);
				}
				else
				{
					fprintf(asm,"\tmov\teax,\t[ebp+(%d)]\n",read->add);
				}
			}
			else
			{
				fprintf(asm,"\tmov\teax,\t[ebp+(%d)]\n",read->add);
			}
			
			fprintf(asm,"\tcmp\teax,\tebx\n");
		}
		
		else if(strcmp(mt->op,"jequ") == 0)  // 以下全是跳转语句
		{
			fprintf(asm,"\tjne\t%s\n",mt->ad2);
			//fprintf(asm,"\t");
		}

		else if(strcmp(mt->op,"jnequ") == 0)
		{
			fprintf(asm,"\tjne\t%s\n",mt->ad1);
		}

		else if(strcmp(mt->op,"jle") == 0)
		{
			fprintf(asm,"\tjg\t%s\n",mt->ad2);
		}

		else if(strcmp(mt->op,"jnle") == 0)
		{
			fprintf(asm,"\tjg\t%s\n",mt->ad1);
		}

		else if(strcmp(mt->op,"jge") == 0)
		{
			fprintf(asm,"\tjl\t%s\n",mt->ad2);
		}

		else if(strcmp(mt->op,"jnge") == 0)
		{
			fprintf(asm,"\tjl\t%s\n",mt->ad1);
		}

		else if(strcmp(mt->op,"jlt") == 0)
		{
			fprintf(asm,"\tjge\t%s\n",mt->ad2);
		}

		else if(strcmp(mt->op,"jnlt") == 0)
		{
			fprintf(asm,"\tjge\t%s\n",mt->ad1);
		}

		else if(strcmp(mt->op,"jgt") == 0)
		{
			fprintf(asm,"\tjle\t%s\n",mt->ad2);
		}

		else if(strcmp(mt->op,"jngt") == 0)
		{
			fprintf(asm,"\tjle\t%s\n",mt->ad1);
		}

		else if(strcmp(mt->op,"jneq") == 0)
		{
			fprintf(asm,"\tje\t%s\n",mt->ad2);
		}

		else if(strcmp(mt->op,"jnneq") == 0)
		{
			fprintf(asm,"\tje\t%s\n",mt->ad1);
		}

		else if(strcmp(mt->op,"goto") == 0)
		{
			fprintf(asm,"\tjmp\t%s\n",mt->ad1);
		}


		mt = mt->next;
	}

	fprintf(asm,"END	;源代码结束!");
	fclose(asm);
		
}



AddTable* search(AddTable * head, char *id)
{
	AddTable *t = head;
	while(t != NULL)
	{
		if(strcmp(t->id,id) == 0)
			return t;
		t = t->next;
	}

	return NULL;
}


void popReg()
{
	fprintf(asm,"\n\n;-------------恢复寄存器-----------\n\n");

	fprintf(asm,"\tpop\tebp\n");
	fprintf(asm,"\tpop\tebx\n");
	fprintf(asm,"\tpopf\n");
	fprintf(asm,"\tpop\tedi\n");
	fprintf(asm,"\tpop\tesi\n");
	fprintf(asm,"\tpop\tedx\n");
	fprintf(asm,"\tpop\tecx\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -