📄 daimashengcheng.cpp
字号:
#include "Share.h"
#include<fstream>
#include <string>
#include <vector>
#include<iostream>
using namespace std;
struct tricode
{
char tri[100];
int len;
};
vector<int> para;
vector<tricode> code;
ifstream in;
ofstream out;
int k=0;
bool arrayPara=0;
extern Symbol_table table;
void asmCode()
{
in.open("Code.txt");
out.open("Code.asm",ios::app);
out<<"data\tsegment"<<endl;
int space=table.vSymbol_table[table.vSymbol_table.size()-1].iAddress+8;
out<<"lab\tdb\t"<<space<<" dup(?)"<<endl;
out<<"len\tdb\t40"<<endl;
out<<"act\tdb\t?"<<endl;
out<<"num\tdb\t40 dup(?)"<<endl;
out<<"space\tdb\t0ah,0dh,'$'"<<endl;
out<<"data\tends"<<endl;
out<<"code\tsegment"<<endl;
out<<"main\tproc\tfar"<<endl;
out<<"\t\tassume\tcs:code,ds:data"<<endl;
out<<"start:"<<endl;
out<<"mov\tax,data"<<endl;
out<<"mov\tds,ax"<<endl;
out<<"mov\tbx,0"<<endl;
getCodeAndTranslate();
in.close();
out.close();
}
void getCodeAndTranslate()
{
tricode l;
string e;
int j=0;
char temp[100]={0};
while (!in.eof())
{
in.getline(temp,100,'\n');
strcpy(l.tri,temp);
l.len=strlen(temp);
code.push_back(l);
//cout<<code[j].tri<<endl<<' '<<code[j].len<<endl;
if (code[j].len==0)
code.pop_back();
j++;
}
while (strstr(code[k].tri,"proc")!=0)
{
//cout<<code[k].tri<<endl<<' '<<code[k].len<<endl;
while (code[k].tri[0]!='e')
k++;
if (strstr(code[k].tri,"proc")==0)
break;
k++;
}
if (k==0)
k=-1;
for(int i=k+1;i<code.size();i++)
translateCode(i,code[i].tri);
out<<"l"<<code.size()<<":"<<endl;
out<<"mov\tax,4c00h"<<endl;
out<<"int 21h"<<endl;
out<<"main\tendp"<<endl;
out<<"in_put\tproc\tnear"<<endl
<<"push\tbx"<<endl
<<"line:"<<endl
<<"lea\tdx,len"<<endl
<<"mov\tah,0ah"<<endl
<<"int\t21h"<<endl
<<"lea\tdx,space"<<endl
<<"mov\tah,09h"<<endl
<<"int\t21h"<<endl
<<"mov\tcl,act"<<endl
<<"mov\tch,0"<<endl
<<"lea\tbx,num"<<endl
<<"mov\tdx,0"<<endl
<<"push\tsi"<<endl
<<"mov\tsi,0"<<endl
<<"loop0:"<<endl
<<"mov\tal,[bx]"<<endl
<<"cmp\tal,30h"<<endl
<<"mov\tah,0"<<endl
<<"jl\terror"<<endl
<<"cmp\tal,3ah"<<endl
<<"jnl\terror"<<endl
<<"sub\tal,30h"<<endl
<<"push\tax"<<endl
<<"inc\tsi"<<endl
<<"inc\tbx"<<endl
<<"loop\tloop0"<<endl
<<"cmp\tbx,di"<<endl
<<"je\terror"<<endl
<<"pop\tax"<<endl
<<"mov\tdi,ax"<<endl
<<"dec\tsi"<<endl
<<"cmp\tsi,0"<<endl
<<"je\tput_in"<<endl
<<"pop\tax"<<endl
<<"mov\tdl,10"<<endl
<<"mul\tdl"<<endl
<<"add\tdi,ax"<<endl
<<"dec\tsi"<<endl
<<"cmp\tsi,0"<<endl
<<"je\tput_in"<<endl
<<"pop\tax"<<endl
<<"mov\tdl,100"<<endl
<<"mul\tdl"<<endl
<<"add\tdi,ax"<<endl
<<"dec\tsi"<<endl
<<"cmp\tsi,0"<<endl
<<"jne\terror"<<endl
<<"cmp\tdi,255"<<endl
<<"ja\terror"<<endl
<<"put_in:"<<endl
<<"pop\tsi"<<endl
<<"pop\tbx"<<endl
<<"mov\tword ptr lab[bx+si],di"<<endl
<<"jmp\tgo"<<endl
<<"error:"<<endl
<<"mov\tcx,si"<<endl
<<"loopn1:"<<endl
<<"pop\tax"<<endl
<<"loop\tloopn1"<<endl
<<"jmp\tline"<<endl
<<"go:"<<endl
<<"ret"<<endl
<<"in_put\tendp"<<endl;
out<<"out_put\tproc\tnear"<<endl
<<"mov\tdl,100"<<endl
<<"mov\tah,0"<<endl
<<"mov\tal,byte ptr lab[bx+si]"<<endl
<<"div\tdl"<<endl
<<"mov\tsi,0"<<endl
<<"cmp\tal,0"<<endl
<<"jnz\tgo_bai"<<endl
<<"mov\tsi,1"<<endl
<<"shi:"<<endl
<<"mov\tal,ah"<<endl
<<"mov\tah,0"<<endl
<<"mov\tdl,10"<<endl
<<"div\tdl"<<endl
<<"cmp\tal,0"<<endl
<<"jnz\tgo_shi"<<endl
<<"cmp\tsi,1"<<endl
<<"jne\tgo_shi"<<endl
<<"g_e:"<<endl
<<"add\tah,30h"<<endl
<<"mov\tdl,ah"<<endl
<<"mov\tah,02h"<<endl
<<"int\t21h"<<endl
<<"mov\tdl,20h"<<endl
<<"mov\tah,02h"<<endl
<<"int\t21h"<<endl
<<"inc\tbx"<<endl
<<"jmp\tend_o"<<endl
<<"go_shi:"<<endl
<<"push\tax"<<endl
<<"add\tal,30h"<<endl
<<"mov\tdl,al"<<endl
<<"mov\tah,02h"<<endl
<<"int\t21h"<<endl
<<"pop\tax"<<endl
<<"jmp\tg_e"<<endl
<<"go_bai:"<<endl
<<"push\tax"<<endl
<<"add\tal,30h"<<endl
<<"mov\tdl,al"<<endl
<<"mov\tah,02h"<<endl
<<"int\t21h"<<endl
<<"pop\tax"<<endl
<<"jmp\tshi"<<endl
<<"end_o:"<<endl
<<"ret"<<endl
<<"out_put\tendp"<<endl;
if (k!=-1)
{
for (int p=0;p<=k;p++)
translateCode(p,code[p].tri);
}
out<<"code\tends"<<endl;
out<<"\tend\tstart"<<endl;
}
void translateCode(int k,string t)
{
out<<"l"<<k<<":"<<endl;
string token;
switch (t[0])
{
case 'i':
dealIf(code[k].tri);
break;
case 'g':
dealGoto(code[k].tri);
break;
case 'p':
if (strstr(t.c_str(),"proc")!=0)
{
token=strtok((char*)t.c_str()," ");
token=strtok(NULL," ");
out<<table.vSymbol_table[atoi(token.c_str())].cVarname<<"\tproc\tnear"<<endl;
}
else
{
token=strtok((char*)t.c_str()," ");
token=strtok(NULL," ");
if (strstr(token.c_str(),"[")!=0)
{
char* to=strtok((char*)token.c_str(),"[]");
int st=table.vSymbol_table[atoi(to)].iAddress;
to=strtok(NULL,"[]");
out<<"mov\tbx,word ptr\tlab["<<table.vSymbol_table[atoi(to)].iAddress<<"]"<<endl;
out<<"sal\tbx,1"<<endl;
out<<"mov\tsi,"<<st<<endl;
arrayPara=1;
}
else
{
int par=table.vSymbol_table[atoi(token.c_str())].iAddress;
para.push_back(par);
}
}
break;
case 'e':
token=strtok((char*)t.c_str()," ");
token=strtok(NULL," ");
out<<"ret"<<endl;
out<<table.vSymbol_table[atoi(token.c_str())].cVarname<<"\tendp"<<endl;
break;
case 'c':
token=strtok((char*)t.c_str()," ");
token=strtok(NULL," ");
if (strcmp(token.c_str(),"read\r")==0)
readNum();
else if (strcmp(token.c_str(),"write\r")==0)
writeNum();
else
{
for (int q=table.vSymbol_table[atoi(token.c_str())].vParam.size()-1;q>=0;q--)
{
int b=para[para.size()-1];
para.pop_back();
out<<"mov\tax,word ptr lab["<<b<<"]"<<endl;
out<<"mov\tword ptr lab["<<table.vSymbol_table[table.vSymbol_table[atoi(token.c_str())].vParam[q]].iAddress<<"],ax"<<endl;
}
out<<"call\t"<<table.vSymbol_table[atoi(token.c_str())].cVarname<<endl;
}
break;
default:
if (strstr(t.c_str(),"[")!=0)
dealArray(code[k].tri);
else
dealVar(code[k].tri);
break;
}
}
void dealIf(string s)
{
string token=strtok((char*)s.c_str()," ");
token=strtok(NULL," ");
out<<"mov\tbx,"<<table.vSymbol_table[atoi(token.c_str())].iAddress<<endl;
out<<"mov\tax,word ptr\tlab[bx]"<<endl;
token=strtok(NULL," ");
string op;
switch(token[0])
{
case 'L':
op="jle";
break;
case 'G':
op="jge";
break;
case 'E':
op="je";
break;
case 'X':
op="jne";
break;
case '<':
op="jl";
break;
default:
op="jg";
break;
}
token=strtok(NULL," ");
if (strstr(token.c_str(),".")!=0)
out<<"mov\tdx,"<<atoi(token.c_str())<<endl;
else
{
out<<"mov\tbx,"<<table.vSymbol_table[atoi(token.c_str())].iAddress<<endl;
out<<"mov\tdx,word ptr\tlab[bx]"<<endl;
}
token=strtok(NULL," ");
token=strtok(NULL," ");
out<<"cmp\tax,dx"<<endl;
out<<op<<"\tl"<<atoi(token.c_str())<<endl;
}
void dealGoto(string s)
{
string token=strtok((char*)s.c_str()," ");
token=strtok(NULL," ");
out<<"jmp\tl"<<atoi(token.c_str())<<endl;
}
void dealArray(string s)
{
string token=strtok((char*)s.c_str(),"[]");
string stoken=token;
token=strtok(NULL,"[]");
string ttoken=token;
token=strtok(NULL," ");
token=strtok(NULL," ");
if (strstr(token.c_str(),".")!=0)
out<<"mov\tax,"<<atoi(token.c_str())<<endl;
else
{
out<<"mov\tbx,"<<table.vSymbol_table[atoi(token.c_str())].iAddress<<endl;
out<<"mov\tax,word ptr\tlab[bx]"<<endl;
}
out<<"mov\tbx,word ptr\tlab["<<table.vSymbol_table[atoi(ttoken.c_str())].iAddress<<"]"<<endl;
out<<"sal\tbx,1"<<endl;
out<<"mov\tword ptr\tlab["<<table.vSymbol_table[atoi(stoken.c_str())].iAddress<<"+bx],ax"<<endl;
}
void dealVar(string s)
{
char* token=strtok((char*)s.c_str()," ");
string dtoken=token;
token=strtok(NULL," ");
token=strtok(NULL," ");
string op;
if (token[0]=='!')
op="not";
else if (token[0]=='-')
op="neg";
else if (strstr(token,".")!=0)
out<<"mov\tax,"<<atoi(token)<<endl;
else
{
//cout<<table.vSymbol_table[atoi(token)].iAddress<<endl;
out<<"mov\tbx,"<<table.vSymbol_table[atoi(token)].iAddress<<endl;
out<<"mov\tax,word ptr\tlab[bx]"<<endl;
}
token=strtok(NULL," ");
if (token==NULL)
{
out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",ax"<<endl;
return;
}
else if (token[0]=='+')
op="add";
else if (token[0]=='-')
op="sub";
else if (token[0]=='*')
op="mul";
else if (token[0]=='/'||token[0]=='g')
op="div";
else if (token[0]=='m')
op="div";
else if (token[0]=='&')
op="and";
else if (token[0]=='|')
op="or";
else if (strstr(token,".")!=0)
out<<"mov\tax,"<<atoi(token)<<endl;
else
{
out<<"mov\tbx,"<<table.vSymbol_table[atoi(token)].iAddress<<endl;
out<<"mov\tax,word ptr\tlab[bx]"<<endl;
}
char* otoken=token;
token=strtok(NULL," ");
if (token==NULL)
{
out<<op<<"\tax"<<endl;
out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",ax"<<endl;
return;
}
else if (strstr(token,".")!=0)
out<<"mov\tcx,"<<atoi(token)<<endl;
else
{
out<<"mov\tbx,"<<table.vSymbol_table[atoi(token)].iAddress<<endl;
out<<"mov\tcx,word ptr\tlab[bx]"<<endl;
}
if (otoken[0]=='+'||otoken[0]=='-'||otoken[0]=='&'||otoken[0]=='|')
{
out<<op<<"\tax,cx"<<endl;
out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",ax"<<endl;
}
else if (otoken[0]=='*')
{
out<<"mul\tcx"<<endl;
out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",ax"<<endl;
}
else if (otoken[0]=='/'||otoken[0]=='g')
{
out<<"mov\tdx,0"<<endl;
out<<"div\tcx"<<endl;
out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",ax"<<endl;
}
else if (otoken[0]=='m')
{
out<<"mov\tdx,0"<<endl;
out<<"div\tcx"<<endl;
out<<"mov\tword ptr\tlab+"<<table.vSymbol_table[atoi(dtoken.c_str())].iAddress<<",dx"<<endl;
}
}
void readNum()
{
if (!arrayPara)
{
int b=para[para.size()-1];
para.pop_back();
out<<"mov\tbx,"<<b<<endl;
out<<"mov\tsi,0"<<endl;
}
out<<"call\tin_put"<<endl;
}
void writeNum()
{
if (!arrayPara)
{
int b=para[para.size()-1];
para.pop_back();
out<<"mov\tbx,"<<b<<endl;
out<<"mov\tsi,0"<<endl;
}
out<<"call\tout_put"<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -