📄 uasm.cpp
字号:
outfile1[length1-1]='s';outfile1[length1]='m';
outfile1[length1+1]='\0';
cout<<infile<<length1<<outfile<<outfile1<<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(!out_file1){return false;}
byte_t instr;
get_addr_and_len(in_file);
cout<<"cod文件长度为"<<length<<endl;
address=addr;
while(!in_file.eof())
{
if(j==0)
{
out_file<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<": ";
out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<": ";
}
in_file.read((char*) &instr,sizeof(byte_t));
if(int(instr)<0x10) out_file<<hex<<"0"<<(int)instr;
else out_file<<hex<<(int)instr;
in_file.read((char*) &instr,sizeof(byte_t));
if(int(instr)<0x10) out_file<<hex<<"0"<<(int)instr<<" ";
else out_file<<hex<<(int)instr<<" ";
out_file1<<"# ";
j=(j+1)%8;
addr++;
}
out_file.close();
out_file1.close();
in_file.close();
in_file.open(infile,ios::binary);
get_addr_and_len(in_file);
sign=new int[length];
signp=0;
for(int i=0;i<length;i++)
sign[i]=0;
ahead=0;
atail=0;
a[ahead]=address;
// sign[0]=1;
int success=1;//跳转返回标志
int k=0;//执行次数标志
while(atail>=ahead)//队列空就结束
{
success=1;
byte_t instr1;
addr=a[ahead++];
while(sign[addr-address]==1)
{
if(atail>=ahead)
addr=a[ahead++];
else {success=0;break;}
}
if(success==0)break;
cout<<"当前地址"<<hex<<addr<< "首地址"<<hex<<address<< "标志位"<< sign[0]<<endl;
cout<<"成功标志为"<<success<<endl;
in_file.close();
in_file.open(infile,ios::binary);
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
if(addr>address)
for(int i=0;address+i<addr;i++)
{
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
}
while(!in_file.eof())
{
in_file.read((char*) &instr1,sizeof(byte_t));//获得指令
cout<<"执行次数"<<++k<<endl;
switch(instr1)
{
case 0x00: //1基本单字无跳转指令
case 0x01:
case 0x02:
case 0x03:
case 0x04:
case 0x05:
case 0x06:
case 0x07:
case 0x08:
case 0x09:
case 0x0A:
case 0x0B:
case 0x81:
case 0x82:
case 0x83:
case 0x84:
case 0x85:
case 0x86:
case 0x87:
case 0x8c:
case 0x20: //扩展单字无跳转指令
case 0x21:
case 0x2a:
case 0x2b:
case 0x2c:
case 0x2d:
case 0x6c:
case 0x6d:
case 0x6e:
case 0x6f:
cout<<"单字无跳转指令"<<endl;
in_file.read((char*) &instr1,sizeof(byte_t));
sign[addr-address]=1;addr++;break;
case 0x41: //2单字无条件跳转
cout<<"单字无条件跳转指令"<<endl;
char offset;
in_file.read((char*) &offset,sizeof(byte_t));
sign[addr-address]=1;
addr=addr+offset+1;
cout<<"跳转地址为"<<addr<<endl;
if(sign[addr-address]==1){success=3;break;}
else
{
in_file.close();
in_file.open(infile,ios::binary);
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
if(addr>address)
for(int i=0;address+i<addr;i++)
{
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
}
}
break;
case 0x44:
case 0x45:
case 0x46:
case 0x47: //3单字有条件跳转
case 0x64: //扩展
case 0x65:
cout<<"单字有条件跳转指令"<<endl;
in_file.read((char*) &offset,sizeof(byte_t));
sign[addr-address]=1;
a[++atail]=addr+offset+1;
addr++;
break;
case 0x80: //4双字无条件跳转
cout<<"双字无条件跳转指令"<<endl;
in_file.read((char*) &instr1,sizeof(byte_t));
sign[addr-address]=1;
addr++;sign[addr-address]=1;
addr++;
word_t address1;
address1=addr;
byte_t head,tail;
in_file.read((char *) &head,sizeof(byte_t));
in_file.read((char *) &tail,sizeof(byte_t));
addr=(int)head*0x100+(int)tail;
cout<<"地址:"<<hex<<addr<<address<<endl;
if(sign[addr-address]==1){success=3;break;}
else
{
in_file.close();
in_file.open(infile,ios::binary);
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
if(addr>address)
for(int i=0;address+i<addr;i++)
{
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
}
}
break;
case 0xce: //调用子程序指令
cout<<"调用子程序指令"<<endl;
in_file.read((char*) &instr1,sizeof(byte_t));
sign[addr-address]=1;
addr++;sign[addr-address]=1;
addr++;
//word_t address1;
//byte head,tail;
in_file.read((char *) &head,sizeof(byte_t));
in_file.read((char *) &tail,sizeof(byte_t));
a[++atail]=(int)head*0x100+(int)tail;
//cout<<"地址:"<<hex<<addr<<address<<endl;
break;
case 0x88://5双字无跳转指令
case 0xe4:
case 0xe5:
case 0xe6:
case 0xe7:
cout<<"双字无跳转指令"<<endl;
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
sign[addr-address]=1;addr++;
sign[addr-address]=1;addr++;
cout<<"地址是"<<addr<<endl;
break;
case 0x8f:
case 0xef://6程序段结束指令
cout<<"结束指令 "<<"当前地址为"<<addr<<"程序结束return"<<endl;
sign[addr-address]=1;
success=3;
break;
default:sign[addr-address]=2;addr++;break;
}
if(success!=1)break;
// for( i=0;i<length;i++) cout<< sign[i]<<",";
}
}
if(success==3)cout<<"程序载入完成"<<endl;
for( i=0;i<length;i++)
cout<< sign[i]<<",";
in_file.close();
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';
outfile1[length1-1]='s';outfile1[length1]='m';
outfile1[length1+1]='\0';
ifstream in_file(infile,ios::binary);//建立输入文件对象
if(!in_file){return false;}
in_file.close();
in_file.open(infile,ios::binary);//建立输入文件对象
if(!in_file){return false;}
ofstream out_file(outfile); //建立输出文件对象
if(!out_file){return false;}
ofstream out_file1(outfile1);
if(!out_file1){return false;}
byte_t instr;
get_addr_and_len(in_file);
sign=new int[length];
signp=0;
for(int i=0;i<length;i++)
sign[i]=0;
ahead=0;
atail=0;
j=0;
while(!in_file.eof())
{
if(j==0)
{
out_file<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<": ";
out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<": ";
}
in_file.read((char*) &instr,sizeof(byte_t));
if(int(instr)<0x10) out_file<<hex<<"0"<<(int)instr;
else out_file<<hex<<(int)instr;
in_file.read((char*) &instr,sizeof(byte_t));
if(int(instr)<0x10) out_file<<hex<<"0"<<(int)instr<<" ";
else out_file<<hex<<(int)instr<<" ";
out_file1<<"# ";
j=(j+1)%8;
addr++;
}
in_file.close();
out_file.close();
out_file1.close();
return true;
}
// CString temp1,temp2;
// temp1.Format("%04x",success);
// temp2.Format("%04x",ahead);
// temp1+="\r\n";
// temp1+=temp2;
// AfxMessageBox(temp1);
void CUasm::exe(char * infile,word_t head)
{
ifstream in_file(infile,ios::binary);//建立输入文件对象
//if(!in_file){return false;}
get_addr_and_len(in_file);
address=addr;
if(head>length+address)return;
if(head>=address)addr=head;
ahead=0;
atail=0;
a[ahead]=addr;
int success=1;//跳转返回标志
int k=0;//执行次数标志
while(atail>=ahead)//队列空就结束
{
success=1;
byte_t instr1;
addr=a[ahead++];
while(sign[addr-address]==1)
{
if(atail>=ahead)
addr=a[ahead++];
else {success=0;break;}
}
if(success==0)break;
in_file.close();
in_file.open(infile,ios::binary);
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
if(addr>address)
for(int i=0;address+i<addr;i++)
{
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
}
while(!in_file.eof())
{
in_file.read((char*) &instr1,sizeof(byte_t));//获得指令
switch(instr1)
{
case 0x00: //1基本单字无跳转指令
case 0x01:
case 0x02:
case 0x03:
case 0x04:
case 0x05:
case 0x06:
case 0x07:
case 0x08:
case 0x09:
case 0x0A:
case 0x0B:
case 0x81:
case 0x82:
case 0x83:
case 0x84:
case 0x85:
case 0x86:
case 0x87:
case 0x8c:
case 0x20: //扩展单字无跳转指令
case 0x21:
case 0x2a:
case 0x2b:
case 0x2c:
case 0x2d:
case 0x6c:
case 0x6d:
case 0x6e:
case 0x6f:
cout<<"单字无跳转指令"<<endl;
in_file.read((char*) &instr1,sizeof(byte_t));
sign[addr-address]=1;addr++;break;
case 0x41: //2单字无条件跳转
cout<<"单字无条件跳转指令"<<endl;
char offset;
in_file.read((char*) &offset,sizeof(byte_t));
sign[addr-address]=1;
addr=addr+offset+1;
cout<<"跳转地址为"<<addr<<endl;
if(sign[addr-address]==1){success=3;break;}
else
{
in_file.close();
in_file.open(infile,ios::binary);
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
if(addr>address)
for(int i=0;address+i<addr;i++)
{
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
}
}
break;
case 0x44:
case 0x45:
case 0x46:
case 0x47: //3单字有条件跳转
case 0x64: //扩展
case 0x65:
cout<<"单字有条件跳转指令"<<endl;
in_file.read((char*) &offset,sizeof(byte_t));
sign[addr-address]=1;
a[++atail]=addr+offset+1;
addr++;
break;
case 0x80: //4双字无条件跳转
cout<<"双字无条件跳转指令"<<endl;
in_file.read((char*) &instr1,sizeof(byte_t));
sign[addr-address]=1;
addr++;sign[addr-address]=1;
addr++;
word_t address1;
address1=addr;
byte_t head,tail;
in_file.read((char *) &head,sizeof(byte_t));
in_file.read((char *) &tail,sizeof(byte_t));
addr=(int)head*0x100+(int)tail;
if(sign[addr-address]==1){success=3;break;}
else
{
in_file.close();
in_file.open(infile,ios::binary);
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
if(addr>address)
for(int i=0;address+i<addr;i++)
{
in_file.read((char*) &instr1,sizeof(byte_t));
in_file.read((char*) &instr1,sizeof(byte_t));
}
}
break;
case 0xce: //调用子程序指令
in_file.read((char*) &instr1,sizeof(byte_t));
sign[addr-address]=1;
addr++;sign[addr-address]=1;
addr++;
//word_t address1;
//byte head,tail;
in_file.read((char *) &head,sizeof(byte_t));
in_file.read((char *) &tail,sizeof(byte_t));
a[++atail]=(int)head*0x100+(int)tail;
break;
case 0x88://5双字无跳转指令
case 0xe4:
case 0xe5:
case 0xe6:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -