📄 uasm.cpp
字号:
j=(j+1)%8;
addr++;
if(j==0)
{out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<": ";}
if(sign[addr-address]==1)
{
out_file1<<"p ";
}
else if(sign[addr-address]==2)
{
out_file1<<"w ";
out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW ";
if((int)ADR_H<0x10)out_file<<"0"<<hex<<(int)ADR_H;
else out_file<<hex<<(int)ADR_H;
if(int(ADR_L)<0x10)
out_file<<"0"<<(int)ADR_L;
else
out_file<<(int)ADR_L;
out_file<<"h"<<endl;
}
else out_file1<<"# ";
j=(j+1)%8;
addr++;
}
void CUasm::stra(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
byte_t ADR_L;
byte_t ADR_H;
byte_t sd;
int SR;
in_file.read((char*) &sd,sizeof(byte_t));
SR=(sd&(0x0f));
in_file.read((char*)&ADR_H,sizeof(byte_t));
in_file.read((char*)&ADR_L,sizeof(byte_t));
if(j==0)
{out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<": ";}
if(sign[addr-address]==1)
{ out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tSTRA ";
if(int(ADR_H)<0x10||int(ADR_H)>=0xa0)
out_file<<'['<<hex<<"0"<<(int)ADR_H;
else
out_file<<'['<<hex<<(int)ADR_H;
if(int(ADR_L)<0x10)
out_file<<"0"<<(int)ADR_L;
else
out_file<<(int)ADR_L;
out_file<<"h"<<']'<<" , ";
out_file<<" R"<<dec<<SR<<endl;
out_file1<<"p ";
}
else if(sign[addr-address]==2)
{
out_file1<<"w ";
out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW E7";
if((int)sd<0x10)out_file<<"0"<<hex<<(int)sd;
else out_file<<hex<<(int)sd;
out_file<<"h"<<endl;
}
else out_file1<<"# ";
j=(j+1)%8;
addr++;
if(j==0)
{out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<": ";}
if(sign[addr-address]==1)
{
out_file1<<"p ";
}
else if(sign[addr-address]==2)
{
out_file1<<"w ";
out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW ";
if((int)ADR_H<0x10)out_file<<"0"<<hex<<(int)ADR_H;
else out_file<<hex<<(int)ADR_H;
if(int(ADR_L)<0x10)
out_file<<"0"<<(int)ADR_L;
else
out_file<<(int)ADR_L;
out_file<<"h"<<endl;
}
else out_file1<<"# ";
j=(j+1)%8;
addr++;
}
void CUasm::iret(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
byte_t single;//
in_file.read((char*)&single,sizeof(byte_t));
if(j==0)
{out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<": ";}
if(sign[addr-address]==1)
{ out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tIRET"<<endl;
out_file1<<"p ";
}
else if(sign[addr-address]==2)
{
out_file1<<"w ";
out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW EF";
if((int)single<0x10)out_file<<"0"<<hex<<(int)single;
else out_file<<hex<<(int)single;
out_file<<"h"<<endl;
}
else out_file1<<"# ";
j=(j+1)%8;
addr++;
}
///////////////////////////////////////////////////////////
void CUasm::get_addr_and_len(ifstream& in_file)
{
byte_t STT;//cod文件开始的01
in_file.read((char*) &STT, sizeof(byte_t));//读过01//加头文件鉴别
in_file.read((char*) &addr,sizeof(word_t));//读出首地址
in_file.read((char*) &length,sizeof(word_t));//读length,以便于主函数中取第一个操作码
}
bool CUasm::perform(ifstream &in_file,ofstream& out_file,ofstream&out_file1,word_t head,word_t tail)
{
if(head<addr){
//cout<<"首地址是"<<hex<<addr<<endl;
j=0;}
if(addr+length<head){
//cout<<"首地址越界,出错!!"<<endl;
return false;}
byte_t word;
j=0;
while(!in_file.eof()&&addr<head)
{
in_file.read((char *) &word,sizeof(byte_t));
in_file.read((char *) &word,sizeof(byte_t));
if(j==0)
{out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<": ";}
out_file1<<" ";
j=(j+1)%8;
addr++;
}
out_file<<"ORG "<<hex<<setfill('0')<<setw(4)<<addr<<'h'<<endl;
while(!in_file.eof()&&addr<=tail)
{
byte_t instr;//用于存储指令
in_file.read((char*) &instr,sizeof(byte_t));//获得指令
if (!in_file.eof())
{
//errLine++;
switch (instr)
{
case 0x00:add(in_file,out_file,out_file1);
break;
case 0x01:sub(in_file,out_file,out_file1);
break;
case 0x02:and(in_file,out_file,out_file1);
break;
case 0x03:cmp(in_file,out_file,out_file1);
break;
case 0x04:xor(in_file,out_file,out_file1);
break;
case 0x05:test(in_file,out_file,out_file1);
break;
case 0x06:or(in_file,out_file,out_file1);
break;
case 0x07:mvrr(in_file,out_file,out_file1);
break;
case 0x08:Dec(in_file,out_file,out_file1);
break;
case 0x09:inc(in_file,out_file,out_file1);
break;
case 0x0A:shl(in_file,out_file,out_file1);
break;
case 0x0B:shr(in_file,out_file,out_file1);
break;
case 0x41:jr(in_file,out_file,out_file1);
break;
case 0x44:jrc(in_file,out_file,out_file1);
break;
case 0x45:jrnc(in_file,out_file,out_file1);
break;
case 0x46:jrz(in_file,out_file,out_file1);
break;
case 0x47:jrnz(in_file,out_file,out_file1);
break;
case 0x80:jmpa(in_file,out_file,out_file1);
break;
case 0x81:ldrr(in_file,out_file,out_file1);
break;
case 0x82:in(in_file,out_file,out_file1);
break;
case 0x83:strr(in_file,out_file,out_file1);
break;
case 0x84:pshf(in_file,out_file,out_file1);
break;
case 0x85:push(in_file,out_file,out_file1);
break;
case 0x86:out(in_file,out_file,out_file1);
break;
case 0x87:pop(in_file,out_file,out_file1);
break;
case 0x88:mvrd(in_file,out_file,out_file1);
break;
case 0x8c:popf(in_file,out_file,out_file1);
break;
case 0x8f:ret(in_file,out_file,out_file1);
break;
case 0xce:cala(in_file,out_file,out_file1);
break;
case 0x20:adc(in_file,out_file,out_file1);
break;
case 0x21:sbb(in_file,out_file,out_file1);
break;
case 0x2a:rcl(in_file,out_file,out_file1);
break;
case 0x2b:rcr(in_file,out_file,out_file1);
break;
case 0x2c:asr(in_file,out_file,out_file1);
break;
case 0x2d:not(in_file,out_file,out_file1);
break;
case 0x60:jmpr(in_file,out_file,out_file1);
break;
case 0x64:jrs(in_file,out_file,out_file1);
break;
case 0x65:jrns(in_file,out_file,out_file1);
break;
case 0x6c:clc(in_file,out_file,out_file1);
break;
case 0x6d:stc(in_file,out_file,out_file1);
break;
case 0x6e:ei(in_file,out_file,out_file1);
break;
case 0x6f:di(in_file,out_file,out_file1);
break;
case 0xe0:calr(in_file,out_file,out_file1);
break;
case 0xe4:ldra(in_file,out_file,out_file1);
break;
case 0xe5:ldrx(in_file,out_file,out_file1);
break;
case 0xe6:strx(in_file,out_file,out_file1);
break;
case 0xe7:stra(in_file,out_file,out_file1);
break;
case 0xef:iret(in_file,out_file,out_file1);
break;
default:dw(in_file,out_file,out_file1,instr);
break;
}
}
else
break;
}
out_file<<"END"<<endl;
in_file.close();
out_file.close();
out_file1.close();
return true;
}
bool CUasm::exec(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
//errLine =0;
while(!in_file.eof())
{
byte_t instr;//用于存储指令
in_file.read((char*) &instr,sizeof(byte_t));//获得指令
if (!in_file.eof())
{
//errLine++;
switch (instr)
{
case 0x00:add(in_file,out_file,out_file1);
break;
case 0x01:sub(in_file,out_file,out_file1);
break;
case 0x02:and(in_file,out_file,out_file1);
break;
case 0x03:cmp(in_file,out_file,out_file1);
break;
case 0x04:xor(in_file,out_file,out_file1);
break;
case 0x05:test(in_file,out_file,out_file1);
break;
case 0x06:or(in_file,out_file,out_file1);
break;
case 0x07:mvrr(in_file,out_file,out_file1);
break;
case 0x08:Dec(in_file,out_file,out_file1);
break;
case 0x09:inc(in_file,out_file,out_file1);
break;
case 0x0A:shl(in_file,out_file,out_file1);
break;
case 0x0B:shr(in_file,out_file,out_file1);
break;
case 0x41:jr(in_file,out_file,out_file1);
break;
case 0x44:jrc(in_file,out_file,out_file1);
break;
case 0x45:jrnc(in_file,out_file,out_file1);
break;
case 0x46:jrz(in_file,out_file,out_file1);
break;
case 0x47:jrnz(in_file,out_file,out_file1);
break;
case 0x80:jmpa(in_file,out_file,out_file1);
break;
case 0x81:ldrr(in_file,out_file,out_file1);
break;
case 0x82:in(in_file,out_file,out_file1);
break;
case 0x83:strr(in_file,out_file,out_file1);
break;
case 0x84:pshf(in_file,out_file,out_file1);
break;
case 0x85:push(in_file,out_file,out_file1);
break;
case 0x86:out(in_file,out_file,out_file1);
break;
case 0x87:pop(in_file,out_file,out_file1);
break;
case 0x88:mvrd(in_file,out_file,out_file1);
break;
case 0x8c:popf(in_file,out_file,out_file1);
break;
case 0x8f:ret(in_file,out_file,out_file1);
break;
case 0xce:cala(in_file,out_file,out_file1);
break;
case 0x20:adc(in_file,out_file,out_file1);
break;
case 0x21:sbb(in_file,out_file,out_file1);
break;
case 0x2a:rcl(in_file,out_file,out_file1);
break;
case 0x2b:rcr(in_file,out_file,out_file1);
break;
case 0x2c:asr(in_file,out_file,out_file1);
break;
case 0x2d:not(in_file,out_file,out_file1);
break;
case 0x60:jmpr(in_file,out_file,out_file1);
break;
case 0x64:jrs(in_file,out_file,out_file1);
break;
case 0x65:jrns(in_file,out_file,out_file1);
break;
case 0x6c:clc(in_file,out_file,out_file1);
break;
case 0x6d:stc(in_file,out_file,out_file1);
break;
case 0x6e:ei(in_file,out_file,out_file1);
break;
case 0x6f:di(in_file,out_file,out_file1);
break;
case 0xe0:calr(in_file,out_file,out_file1);
break;
case 0xe4:ldra(in_file,out_file,out_file1);
break;
case 0xe5:ldrx(in_file,out_file,out_file1);
break;
case 0xe6:strx(in_file,out_file,out_file1);
break;
case 0xe7:stra(in_file,out_file,out_file1);
break;
case 0xef:iret(in_file,out_file,out_file1);
break;
default:dw(in_file,out_file,out_file1,instr);
break;
}
}
else
break;
}
out_file<<"END"<<endl;
in_file.close();
out_file.close();
out_file1.close();
return true;
}
/*
bool CUasm::StartUasm(char* infile,char*outfile,int ink)
{
int pink=ink;
infile[pink]='.';outfile[pink]='.';
infile[pink+1]='c';outfile[pink+1]='a';
infile[pink+2]='o';outfile[pink+2]='s';
infile[pink+3]='d';outfile[pink+3]='m';
infile[pink+4]=outfile[pink+4]='\0';
cout<<infile<<endl;
ifstream in_file(infile,ios::binary);//建立输入文件对象
if(!in_file)
{return false;}
ofstream out_file(outfile); //建立输出文件对象
if(!out_file)
{return false;}
get_addr_and_len(in_file);
out_file<<"ORG "<<hex<<addr<<'h'<<endl;
if(!exec(in_file,out_file))
return false;
return true;
}
*/
bool CUasm::uuasm(char *infile)
{
char outfile[100];
char outfile1[100];
strcpy(outfile,infile);
strcpy(outfile1,infile);
int length1=strlen(infile);
outfile[length1-4]='!';
outfile[length1-3]='.';outfile[length1-2]='a';
outfile[length1-1]='s';outfile[length1]='m';
outfile[length1+1]='\0';
outfile1[length1-4]='#';
outfile1[length1-3]='.';outfile1[length1-2]='a';
outfile1[length1-1]='s';outfile1[length1]='m';
outfile1[length1+1]='\0';
ifstream in_file(infile,ios::binary);//建立输入文件对象
if(!in_file){return false;}
ofstream out_file(outfile); //建立输出文件对象
if(!out_file){return false;}
ofstream out_file1(outfile1);
if(!outfile1){return false;}
get_addr_and_len(in_file);
out_file<<"ORG "<<hex<<setfill('0')<<setw(4)<<addr<<'h'<<endl;
j=0;
if(!exec(in_file,out_file,out_file1))
return false;
return true;
}
bool CUasm::uuuasm(char *infile,word_t head,word_t tail)
{
if(head>=tail){
//cout<<"首地址小于末地址出错!"<<endl;
return false;}
char outfile[100];
char outfile1[100];
strcpy(outfile,infile);
strcpy(outfile1,infile);
int length1=strlen(infile);
outfile[length1-4]='-';
outfile[length1-3]='.';outfile[length1-2]='a';
outfile[length1-1]='s';outfile[length1]='m';
outfile[length1+1]='\0';
outfile1[length1-4]='&';
outfile1[length1-3]='.';outfile1[length1-2]='a';
outfile1[length1-1]='s';outfile1[length1]='m';
outfile1[length1+1]='\0';
cout<<infile<<length1<<outfile<<endl;
ifstream in_file(infile,ios::binary);//建立输入文件对象
if(!in_file){return false;}
ofstream out_file(outfile); //建立输出文件对象
if(!out_file){return false;}
ofstream out_file1(outfile1);
if(!outfile1){return false;}
get_addr_and_len(in_file);
if(!perform(in_file,out_file,out_file1,head,tail))
return false;
return true;
}
/*
bool CUasm::outcod(char *infile)
{
char outfile[100];
char outfile1[100];
strcpy(outfile,infile);
strcpy(outfile1,infile);
int length1=strlen(infile);
outfile[length1-3]='t';outfile[length1-2]='x';
outfile[length1-1]='t';outfile[length1]='\0';
outfile1[length1-4]='#';
outfile1[length1-3]='.';outfile1[length1-2]='a';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -