📄 cacrocomp.h
字号:
#pragma once
#include<iostream.h>
#include<string.h>
#include<fstream.h>
#include<stdio.h>
#include "DataBase.h" //基础数据类
#include "ErrorReport.h" //出错处理类
#include "Pseudoins.h" //标号处理类
#include "Instructions.h" //指令类
#include "TEC2000.h"
#include "MainFrm.h"
#define MAXSIZE 1024
#define MEDIUMSIZE 512
class CAcroComp{
private:
int flag; //用以指明第几次扫描.asm文件
int Line; //源汇编语句某行
int p; //写.cod文件用指针
char chg[3];
int Endcount; //统计END的个数
int Orgcount; //统计ORG的个数
ifstream inf,infcod,infmem;
WORD *memory;
ofstream outf,outftxt;
InsList insList; //指令节点链表类对象
PseudoinsTable Pstable; //标号节点链表类对象
char buffer[MAXSIZE]; //读取.asm文件一行到buffer
char * tobuffer; //复制buffer到tobuffer
int argN; //源.asm文件某行汇编语句的段数
char arg[MEDIUMSIZE][MEDIUMSIZE]; //arg[i]为分割后形成的大写代码段
char par[MEDIUMSIZE][MEDIUMSIZE]; //par[i]为分割后形成的大,小写代码段
int Realtimeaddr; //处理时的实时字地址
ErrorReport report; //出错对象链表类对象
////////////////////////////////////////////////////////////////////////////////////
int CompareString(char * ,char * ); //字符串比较函数
char Ttwo(char * ); //Rx中的x化为十六进制数
int Decsum(char *); //十进制求和函数
bool FileIsEnd(void); //判文件是否结束
int Evaluate(char *); //计算表达式的值
bool OpenSoueceFile(char *,char *); //打开源文件函数
bool Getbuffer(void); //源文件一行传到buffer
bool Analyzebuffer(void); //解析buffer,分解到arg[i]
int Process(void); //主要函数,处理各伪命令
int Calculate(char *); //计算十六/十进制数的值,可调用int Decsum(char *)
int ReadChar(int); //从.cod文件读
void WriteChar(char, int ); //往.cod文件写
void WriteHex(char, int ); //往.txt文件写十六进制代码(char型表示)
bool INS(InsNode * ); //指令处理函数
int ReadCharmem(int);
////////////////////////////////////////////////////////////////////////////////////
public:
CAcroComp(){}
~CAcroComp(){inf.close();outf.close();outftxt.close();}
bool Handle(char *); //作为接口函数,主要函数
bool WritehexChar(char *,char *); //.cod文件转化为16进制字符串形式
ErrorReport * GetErrorReport(void){return &report;}
char * Getchg(void){return chg;}
bool WriteToMem(char *);
};
int CAcroComp::CompareString(char * s1,char * s2){ //字符串匹配函数
if(strcmp(s1,s2)==0) return 1;
else return -1; //不匹配
}
char CAcroComp::Ttwo(char * ch){ //
if(ch[0]=='R'){
if(ch[1]>='0' && ch[1]<='9' && ch[2]=='\0')return ch[1];
if(ch[1]=='1' && ch[2]>='0' && ch[2]<='5' && ch[3]=='\0')return 'A'-'0'+ch[2];
}
return '#';
}
int CAcroComp::Decsum(char * ch){ //
int l=strlen(ch);
int suma=1,sumb=0;
ch[l]='\0';
for(int m=1;m<l;m++){
if(ch[m] < '0' || ch[m] >'9'){return -2000;} //不可计算,返回-2000
}
for(int n=0;n<l;n++){
for(int z=0;z<l-n-1;z++){suma*=10;}
sumb+=((int)ch[n]-48)*suma;
suma=1;
}
return sumb; //可计算,返回其值
}
int CAcroComp::ReadChar(int o){
infcod.seekg(o);
return (int)infcod.get();
}
void CAcroComp::WriteChar(char ch,int o){
outf.seekp(o);
outf.put(ch);
}
int CAcroComp::ReadCharmem(int o){
infmem.seekg(o);
return (int)infmem.get();
}
void CAcroComp::WriteHex(char ch, int o){
outftxt.seekp(o);
outftxt.put(ch);
}
bool CAcroComp::WritehexChar(char * cod,char * txt){
infcod.open(cod, ios::binary);
if(!infcod){return false;}
outftxt.open(txt);
if(!outftxt){return false;}
HexArray Haa2(2);
Haa2.SetValue(ReadChar(0));
char chg=Haa2.GetArray()[0].GetChar();
WriteHex(chg,0);
chg=Haa2.GetArray()[1].GetChar();
WriteHex(chg,1);
WriteHex(' ',2);
int op=3;
while(infcod.eof()==0){
int chgg=(2*op-1)/5;
Haa2.SetValue(ReadChar(chgg)); //化为16进制数形式
chg=Haa2.GetArray()[0].GetChar();
WriteHex(chg,op++);
chg=Haa2.GetArray()[1].GetChar();
WriteHex(chg,op++);
Haa2.SetValue(ReadChar(chgg+1));
chg=Haa2.GetArray()[0].GetChar();
WriteHex(chg,op++);
chg=Haa2.GetArray()[1].GetChar();
WriteHex(chg,op++);
WriteHex(' ',op++);
}
return true;
}
bool CAcroComp::WriteToMem(char * cod){
CTEC2000App *pApp;
pApp=(CTEC2000App *)AfxGetApp();
memory=pApp->memory;
infmem.open(cod,ios::binary);
if(!infmem){return false;}
int j=ReadCharmem(2)*256+ReadCharmem(1);
int i=5;
while(infmem.eof()==0){
memory[j]=ReadCharmem(i)*256+ReadCharmem(i+1);
i+=2;
j++;
}
return true;
}
bool CAcroComp::OpenSoueceFile(char * in,char * out){
inf.open(in);
if(!inf){
report.AddError(0,0);
return false;
}
outf.open(out,ios::binary);
return true;
}
bool CAcroComp::FileIsEnd(void){
if(inf.eof()==0) return false;
else return true;
}
bool CAcroComp::Getbuffer(){
inf.getline(buffer,MAXSIZE,'\n');
if(strlen(buffer)==0) return false;
buffer[strlen(buffer)]='\0';
for(int iob=0;iob<=(int)strlen(buffer);iob++){
if(buffer[iob]==';'){
buffer[iob]='\0';
}
}
return true;
}
bool CAcroComp::Analyzebuffer(void){
tobuffer=new char[strlen(buffer)+1];
strcpy(tobuffer,buffer);
int lencount=0;
for( int h=0; h<=(int)strlen(tobuffer); h++){
if(tobuffer[h]!=' ' && tobuffer[h]!=',' && tobuffer[h]!='\t'
&& tobuffer[h]!='\0'){lencount++;}
}
if(lencount==0)return false;
int j=0, k=0, bp=0; //bp统计单引号的数目
argN=0;
for( int i=0; i<=(int)strlen(tobuffer); i++){
if(tobuffer[i]==' ' || tobuffer[i]==',' || tobuffer[i]=='\t'
|| tobuffer[i]=='\0')
{
if(bp%2==1 && tobuffer[i]!='\0'){buffer[j++]=tobuffer[i];continue;}//修正
else{
if(j==0){continue;}
else{
buffer[j]='\0';
strcpy(par[k],buffer);
for(int len=0; len<(int)strlen(buffer); len++){CharUpperCase(buffer[len]);}
strcpy(arg[k],buffer);
j=0;
k++;
argN++;
}
}
}
else
{
if(tobuffer[i]=='\'')bp++;
buffer[j]=tobuffer[i];
j++;
if(tobuffer[i]==':' && k==0){
buffer[j]='\0';
strcpy(par[k],buffer);
for(int len=0; len<(int)strlen(buffer); len++){CharUpperCase(buffer[len]);}
strcpy(arg[k],buffer);
j=0;
k++;
argN++;
}
}
}
tobuffer[0]='\0';
return true;
}
int CAcroComp::Calculate(char * ch){ //不可计算返回-2000,可计算返回其值
HexArray ha4(8);
int l=strlen(ch);
if(ch[0]=='\'' || ch[l-1]=='\''){
if(ch[0]!=ch[l-1]){if(flag==1)report.AddError(Line,2);return -2000;}//
else if(l==2){return 0;}
else if(l==3){return (int)ch[1];} //'a'
else if(l==4){return (int)ch[1]*256+(int)ch[2];} //'Ab'
else {if(flag==1)report.AddError(Line,3);return -2000;} //''以及'abc'等
}
else if(ch[l-1]=='H' || ch[l-1]=='h'){
for(int len=0; len<(int)strlen(ch); len++){CharUpperCase(ch[len]);}
for(int gg=0; gg<(int)strlen(ch)-1; gg++){
if((ch[gg]<'0' || ch[gg]>'9') && (ch[gg]<'A' || ch[gg]>'F'))
{return -2000;}
}
ch[l-1]='\0';
if(!ha4.SetString(ch)){return -2000;}
return ha4.GetValue();
}
else if(ch[l-1]=='D' || ch[l-1]=='d'){
for(int len=0; len<(int)strlen(ch); len++){CharUpperCase(ch[len]);}
if(ch[0]<'0' || ch[0]>'9'){return -2000;}
ch[l-1]='\0';
return Decsum(ch);
}
else if(ch[0]>='0' && ch[0]<='9' && ch[l-1]>='0' && ch[l-1]<='9' ){
return Decsum(ch);}
return -2000;
}
int CAcroComp::Evaluate(char * expression){
int sum=0,temp2,l;
char part[40][40];
char partp[40][40];
char symbol[20];
char * Expbuffer;
char xbuffer[40];
Expbuffer=new char[strlen(expression)+1];
strcpy(Expbuffer,expression);
int j=0, k=0, h=0, cp=0;
int partN=0;
for( int i=0; i<=(int)strlen(Expbuffer); i++){
if(Expbuffer[i]=='+' || Expbuffer[i]=='-' || Expbuffer[i]=='*'
|| Expbuffer[i]=='/' || Expbuffer[i]=='\0')
{ if(cp%2==1 && Expbuffer[i]!='\0'){xbuffer[j++]=Expbuffer[i];continue;}
else{
symbol[h++]=Expbuffer[i];
if(j==0){continue;}
else{
xbuffer[j]='\0';
strcpy(partp[k],xbuffer);//partp[k]可能有小写
for(int len=0; len<(int)strlen(xbuffer); len++){CharUpperCase(xbuffer[len]);}
strcpy(part[k],xbuffer);//part[k]均为大写
j=0;
k++;
partN++;
}
}
}
else
{ if(Expbuffer[i]=='\'')cp++;
xbuffer[j]=Expbuffer[i];
j++;
}
}
symbol[h]='\0';
sum=Calculate(partp[0]);//可能有如'Ab'型数
if(sum==-2000){sum=Pstable.SearchPseudoins(part[0]);} //
if(sum==-1000 && flag==1){report.AddError(Line,21);return -1000;} //在Pstable中没找到,即将表达式赋值为-1000
for(l=0;l<(int)strlen(symbol);l++){ //
temp2=Calculate(partp[l+1]);//可能有如'Ab'型数 //
if(temp2==-2000){temp2=Pstable.SearchPseudoins(part[l+1]);}
if(temp2==-1000 && flag==1){report.AddError(Line,21); return -1000;} //在Pstable中没找到,即将表达式赋值为-1000
switch(symbol[l]){
case '+':sum+=temp2;break;
case '-':sum-=temp2;break;
case '*':sum*=temp2;break;
case '/':sum/=temp2;break;
}
}
return sum;
}
int CAcroComp::Process(void){
InsNode * insNode; //指令节点类对象
int high,low,temp,i,j=0;
LEAP:
if(CompareString(arg[0],"END")==1){
Endcount++;
if(argN!=1){if(flag==1)report.AddError(0,13);return -1;}
return 1;
}
else if(CompareString(arg[0],"ORG")==1){
Orgcount++;
if(argN==1){
WriteChar((char)0,p++);
WriteChar((char)0,p++);
p+=2;
Realtimeaddr=0;
return 1;}
else if(argN>2){if(flag==1)report.AddError(Line,15);return -1;}
if(Orgcount==1){
temp=Evaluate(par[argN-1]);
Realtimeaddr=temp; //expression calculate
low=temp%256;
high=(temp-low)/256;
WriteChar((char)low,p++);
WriteChar((char)high,p++);
p+=2;
}
else if(Orgcount>=2){
j=Evaluate(par[argN-1]); //两个以上org
if(j<Realtimeaddr){
if(flag==1)report.AddError(Line,17);return -1;
}
p+=2*(j-Realtimeaddr);
Realtimeaddr=j; //修正
}
return 1;
}
else if(insList.SearchName(arg[0])!=NULL){
insNode=insList.SearchName(arg[0]);
if(argN-1 != insNode->GetParaNum()){
if(flag==1)report.AddError(Line,28);
return -1;
}
else{
INS(insNode);
}
}
else if(CompareString(arg[0],"DW")==1){
if(argN<2){if(flag==1)report.AddError(Line,18);return -1;}
for(int f=1;f<argN;f++){
if(par[f][0]=='\'' || par[f][strlen(par[f])-1]=='\'')
{
if(par[f][0]!=par[f][strlen(par[f])-1]){
if(flag==1)report.AddError(Line,20);return -1;}
for(int k=1;k<(int)strlen(par[f])-1;k++){
WriteChar((char)0,p++);
WriteChar(par[f][k],p++);
Realtimeaddr++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -