📄 translater.cpp
字号:
#include<string>
#include<iostream>
#include<stdio.h>
#include<stdio.h>
using namespace std;
//--------机器码长---------
#define MCodeLength 128
#define OpCodeLength 8
#define RelModeLength 2
#define ReservedLength 6
#define Src1RegLength 8
#define Src2RegLength 8
#define Src3RegLength 8
#define DstRegLength 8
#define Src1BankLength 3
#define Src2BankLength 3
#define Src3BankLength 3
#define DstBankLength 3
#define SwzSrc1Length 8
#define SwzSrc2Length 8
#define SwzSrc3Length 8
#define MaskLength 4
#define NegFSrc1Length 1
#define NegFSrc2Length 1
#define NegFSrc3Length 1
#define SatDestLength 1
//---------机器码起始位置----------
#define OpCodeBegin 120
#define RelModeBegin 118
#define ReservedBegin 112
#define Src1RegBegin 104
#define Src2RegBegin 96
#define Src3RegBegin 88
#define DstRegBegin 80
#define Src1BankBegin 77
#define Src2BankBegin 73
#define Src3BankBegin 71
#define DstBankBegin 68
#define SwzSrc1Begin 60
#define SwzSrc2Begin 52
#define SwzSrc3Begin 44
#define MaskBegin 36
#define NegFSrc1Begin 35
#define NegFSrc2Begin 34
#define NegFSrc3Begin 33
#define SatDestBegin 32
//------------机器码更新数组-----------
int UpOpCode[OpCodeLength] ={0,0,0,0,0,0,0,0};
int UpRelMode[RelModeLength] ={0,0};
int UpReserved[ReservedLength] ={0,0,0,0,0,0};
int UpSrc1Reg[Src1RegLength] ={0,0,0,0,0,0,0};
int UpSrc2Reg[Src2RegLength] ={0,0,0,0,0,0,0};
int UpSrc3Reg[Src3RegLength] ={0,0,0,0,0,0,0};
int UpDstReg[DstRegLength] ={0,0,0,0,0,0,0};
int UpSrc1Bank[Src1BankLength] ={0,0,0};
int UpSrc2Bank[Src2BankLength] ={0,0,0};
int UpSrc3Bank[Src3BankLength] ={0,0,0};
int UpDstBank[DstBankLength] ={0,0,0};
int UpSwzSrc1[SwzSrc1Length] ={0,0,0,0,0,0,0};
int UpSwzSrc2[SwzSrc2Length] ={0,0,0,0,0,0,0};
int UpSwzSrc3[SwzSrc3Length] ={0,0,0,0,0,0,0};
int UpMask[MaskLength] ={0,0,0,0};
int UpNegFSrc1[NegFSrc1Length] ={0};
int UpNegFSrc2[NegFSrc2Length] ={0};
int UpNegFSrc3[NegFSrc3Length] ={0};
int UpSatDest[SatDestLength] ={0};
int *SrcReg_P[3] = {UpSrc1Reg, UpSrc2Reg, UpSrc3Reg};
int *SrcBank_P[3] = {UpSrc1Bank, UpSrc2Bank, UpSrc3Bank};
int *SwzSrc_P[3] = {UpSwzSrc1, UpSwzSrc2, UpSwzSrc3};
int *NegFSrc_P[3] = {UpNegFSrc1, UpNegFSrc2, UpNegFSrc3};
static bool EXIT_FLAG =false;
static bool NOTE_FLAG =false;
static bool CODE_ERRO_FLAG =false;
static bool SRC_ERRO_FLAG =false;
static int Output[MCodeLength];
static int SrcNum; //操作数数目
static int Begin;
static int End;
static int AsmLength;
FILE *fpw,*fpr;
void Update(){
int i;
printf("OpCode:");
for(i=0;i<OpCodeLength;i++){
printf("%d",UpOpCode[i]);
Output[i+OpCodeBegin]=Output[i+OpCodeBegin]|UpOpCode[i];
}
printf("\n");
printf("RelMode:");
for(i=0;i<RelModeLength;i++){
printf("%d",UpRelMode[i]);
Output[i+RelModeBegin]=Output[i+RelModeBegin]|UpRelMode[i];
}
printf("\n");
printf("Reserved:");
for(i=0;i<ReservedLength;i++){
printf("%d",UpReserved[i]);
Output[i+ReservedBegin]=Output[i+ReservedBegin]|UpReserved[i];
}
printf("\n");
printf("Src1Reg:");
for(i=0;i<Src1RegLength;i++){
printf("%d",UpSrc1Reg[i]);
Output[i+Src1RegBegin]=Output[i+Src1RegBegin]|UpSrc1Reg[i];
}
printf("\n");
printf("Src2Reg:");
for(i=0;i<Src2RegLength;i++){
printf("%d",UpSrc2Reg[i]);
Output[i+Src2RegBegin]=Output[i+Src2RegBegin]|UpSrc2Reg[i];
}
printf("\n");
printf("Src3Reg:");
for(i=0;i<Src3RegLength;i++){
printf("%d",UpSrc3Reg[i]);
Output[i+Src3RegBegin]=Output[i+Src3RegBegin]|UpSrc3Reg[i];
}
printf("\n");
printf("DstReg:");
for(i=0;i<DstRegLength;i++){
printf("%d",UpDstReg[i]);
Output[i+DstRegBegin]=Output[i+DstRegBegin]|UpDstReg[i];
}
printf("\n");
printf("Src1Bank:");
for(i=0;i<Src1BankLength;i++){
printf("%d",UpSrc1Bank[i]);
Output[i+Src1BankBegin]=Output[i+Src1BankBegin]|UpSrc1Bank[i];
}
printf("\n");
printf("Src2Bank:");
for(i=0;i<Src2BankLength;i++){
printf("%d",UpSrc2Bank[i]);
Output[i+Src2BankBegin]=Output[i+Src2BankBegin]|UpSrc2Bank[i];
}
printf("\n");
printf("Src3Bank:");
for(i=0;i<Src3BankLength;i++){
printf("%d",UpSrc3Bank[i]);
Output[i+Src3BankBegin]=Output[i+Src3BankBegin]|UpSrc3Bank[i];
}
printf("\n");
printf("DstBank:");
for(i=0;i<DstBankLength;i++){
printf("%d",UpDstBank[i]);
Output[i+DstBankBegin]=Output[i+DstBankBegin]|UpDstBank[i];
}
printf("\n");
printf("SwzSrc1:");
for(i=0;i<SwzSrc1Length;i++){
printf("%d",UpSwzSrc1[i]);
Output[i+SwzSrc1Begin]=Output[i+SwzSrc1Begin]|UpSwzSrc1[i];
}
printf("\n");
printf("SwzSrc2:");
for(i=0;i<SwzSrc2Length;i++){
printf("%d",UpSwzSrc2[i]);
Output[i+SwzSrc2Begin]=Output[i+SwzSrc2Begin]|UpSwzSrc2[i];
}
printf("\n");
printf("SwzSrc3:");
for(i=0;i<SwzSrc3Length;i++){
printf("%d",UpSwzSrc3[i]);
Output[i+SwzSrc3Begin]=Output[i+SwzSrc3Begin]|UpSwzSrc3[i];
}
printf("\n");
printf("Mask:");
for(i=0;i<MaskLength;i++){
printf("%d",UpMask[i]);
Output[i+MaskBegin]=Output[i+MaskBegin]|UpMask[i];
}
printf("\n");
printf("NegFSrc1:");
for(i=0;i<NegFSrc1Length;i++){
printf("%d",UpNegFSrc1[i]);
Output[i+NegFSrc1Begin]=Output[i+NegFSrc1Begin]|UpNegFSrc1[i];
}
printf("\n");
printf("NegFSrc2:");
for(i=0;i<NegFSrc2Length;i++){
printf("%d",UpNegFSrc2[i]);
Output[i+NegFSrc2Begin]=Output[i+NegFSrc2Begin]|UpNegFSrc2[i];
}
printf("\n");
printf("NegFSrc3:");
for(i=0;i<NegFSrc3Length;i++){
printf("%d",UpNegFSrc3[i]);
Output[i+NegFSrc3Begin]=Output[i+NegFSrc3Begin]|UpNegFSrc3[i];
}
printf("\n");
printf("SatDest:");
for(i=0;i<SatDestLength;i++){
printf("%d",UpSatDest[i]);
Output[i+SatDestBegin]=Output[i+SatDestBegin]|UpSatDest[i];
}
printf("\n");
}
void InitUp(){
int i;
//-----------初始化--------------
for(i=0;i<OpCodeLength;i++){
UpOpCode[i]=0;
}
for(i=0;i<RelModeLength;i++){
UpRelMode[i]=0;
}
for(i=0;i<ReservedLength;i++){
UpReserved[i]=0;
}
for(i=0;i<Src1RegLength;i++){
UpSrc1Reg[i]=0;
}
for(i=0;i<Src2RegLength;i++){
UpSrc2Reg[i]=0;
}
for(i=0;i<Src3RegLength;i++){
UpSrc3Reg[i]=0;
}
for(i=0;i<DstRegLength;i++){
UpDstReg[i]=0;
}
for(i=0;i<Src1BankLength;i++){
UpSrc1Bank[i]=0;
}
for(i=0;i<Src2BankLength;i++){
UpSrc2Bank[i]=0;
}
for(i=0;i<Src3BankLength;i++){
UpSrc3Bank[i]=0;
}
for(i=0;i<DstBankLength;i++){
UpDstBank[i]=0;
}
for(i=0;i<SwzSrc1Length;i++){
UpSwzSrc1[i]=0;
}
for(i=0;i<SwzSrc2Length;i++){
UpSwzSrc2[i]=0;
}
for(i=0;i<SwzSrc3Length;i++){
UpSwzSrc3[i]=0;
}
for(i=0;i<MaskLength;i++){
UpMask[i]=0;
}
for(i=0;i<NegFSrc1Length;i++){
UpNegFSrc1[i]=0;
}
for(i=0;i<NegFSrc2Length;i++){
UpNegFSrc2[i]=0;
}
for(i=0;i<NegFSrc3Length;i++){
UpNegFSrc3[i]=0;
}
for(i=0;i<SatDestLength;i++){
UpSatDest[i]=0;
}
}
//---------------------字符串比较函数-----------
bool charcmp(char *a,char *b){
int i=0;
while(a[i]!='\0'||b[i]!='\0'){
if(a[i]!=b[i])return false;
i++;
}
return true;
}
//**********************************************
bool OutputMask(int *UpMask, int *Comma, int *Dot, char *Input)
{
int XYZW_EXIST[4]={0,0,0,0};
if (Dot[0] == 0)
return false;
if (Comma[1]-Dot[0]>5)
{
}
return false;
}
//--------------源操作数的排列处理---------------
bool SwzSrc(int *UpSwzSrc, int *Comma, int *Dot, char *Input, int Pos)
{
//Pos为源操作数的位数
int XYZW_EXIST[4]={0,0,0,0};
if (Dot[Pos] == 0)
{
UpSwzSrc[3]=1;
UpSwzSrc[4]=1;
UpSwzSrc[6]=1;
UpSwzSrc[7]=1;
return false;
}
if (Comma[Pos+1] - Dot[Pos] != 5)
{
return true;
}
else
{
int i = 0;
for (i; i < 4; i++)
{
switch(Input[Dot[Pos] + i + 1])
{
case 'X':
if(XYZW_EXIST[0])
return true;
else
XYZW_EXIST[0]=1;
UpSwzSrc[1+2*i]=0;
UpSwzSrc[2*i]=0;
break;
case 'Y':
if(XYZW_EXIST[1])
return true;
else
XYZW_EXIST[1]=1;
UpSwzSrc[1+2*i]=1;
UpSwzSrc[2*i]=0;
break;
case 'Z':
if(XYZW_EXIST[2])
return true;
else
XYZW_EXIST[2]=1;
UpSwzSrc[1+2*i]=0;
UpSwzSrc[2*i]=1;
break;
case 'W':
if(XYZW_EXIST[3])
return true;
else
XYZW_EXIST[3]=1;
UpSwzSrc[1+2*i]=1;
UpSwzSrc[2*i]=1;
break;
default:
return true;
}
}
}
return false;
}
//-----------------源操作数处理--------------------
bool Src(int SrcNum, int *Comma, int *Dot, char *Input)
{
int CV_EXIST[2]={0,0};
for (int i=1; i<=SrcNum; i++)
{
int Pos = Comma[i]+1;
char Memory = Input[Pos];
if(Memory == '-')
{
NegFSrc_P[i-1][0]=1;
Pos++;
Memory = Input[Pos];
}
int Address = 0;
switch(Memory)
{
case 'V':
if(CV_EXIST[1]==0)
CV_EXIST[1]=1;
else
return true;
if(Dot[i]!=0)
{
int length = Dot[i]-Pos-3; //[]内数字位数
if (Input[Pos+1]!='[' || Input[Dot[i]-1]!=']' || length == 0 || length > 2)
return true;
else
{
if(length == 1)
Address=Input[Dot[i]-2]-48;
else
Address=(Input[Dot[i]-2]-48)+(Input[Dot[i]-3]-48)*10;
}
}
else
{
int length = Comma[i+1]-Pos-3; //[]内数字位数
if (Input[Pos+1]!='[' || Input[Comma[i+1]-1]!=']' || length == 0 || length > 2)
return true;
else
{
if(length == 1)
Address=Input[Comma[i+1]-2]-48;
else
Address=(Input[Comma[i+1]-2]-48)+(Input[Comma[i+1]-3]-48)*10;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -