📄 asm.c
字号:
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 + -