📄 privatefuncs.cpp
字号:
else if ( TOKEN.TokenName[0] == 'b' || TOKEN.TokenName[0] == 'B' ) //beq,bne
{
if ( TOKEN.TokenName[1] == 'e' || TOKEN.TokenName[1] == 'E' ) //beq
CMD[28] = '1';
else //bne
CMD[28] = CMD[26] = '1';
}
else if ( TOKEN.TokenName[0] == 's' || TOKEN.TokenName[0] == 'S' ) //slti,sltiu
{
if ( TOKEN.TokenName[4] == 'u' || TOKEN.TokenName[4] == 'U' ) //sltiu
CMD[29] = CMD[27] = CMD[26] = '1';
else //slti
CMD[29] = CMD[27] = '1';
}
else //addi,addiu,andi
{
if ( TOKEN.TokenName[1] == 'd' || TOKEN.TokenName[1] == 'D' )
{
if ( TOKEN.TokenName[4] == 'u' || TOKEN.TokenName[4] == 'U' )// addiu
CMD[29] = CMD[26] = '1';
else // addi
CMD[29] = '1';
}
else // andi
CMD[29] = CMD[28] = '1';
}
return 0; // 0 表示成功退出
}
case T_SICOM:
{
CMD[29] = CMD[28] = CMD[27] = CMD[26] = '1'; // lui
return 0; // 0 表示成功退出
}
case T_LWICOM:
{
if ( TOKEN.TokenName[0] == 'l' || TOKEN.TokenName[0] == 'L' ) // lw
CMD[31] = CMD[27] = CMD[26] = '1';
else // sw
CMD[31] = CMD[29] = CMD[27] = CMD[26] = '1';
return 0; // 0 表示成功退出
}
case T_JCOM:
{
if ( TOKEN.TokenName[1] == '\0' ) // j
CMD[27] = '1';
else if ( TOKEN.TokenName[1] == 'a' || TOKEN.TokenName[1] == 'A' ) // jal
CMD[27] = CMD[26] = '1';
return 0; // 0 表示成功退出
}
case T_RD:
{
for ( i = 0; i < 32 && (!StrCmp( TOKEN.TokenName, RegsAlias[i][0] )&&!StrCmp( TOKEN.TokenName, RegsAlias[i][1] )); i++ );
// cout << "RD: " << i << endl;
if ( i == 32 )
return -1;
else
{
char* retv = DecToBin( i );
for ( i = 0; i < 5; i++ )
CMD[15-i] = retv[i];
}
return 0; // 0 表示成功退出
}
case T_RS:
{
for ( i = 0; i < 32 && (!StrCmp( TOKEN.TokenName, RegsAlias[i][0] )&&!StrCmp( TOKEN.TokenName, RegsAlias[i][1] )); i++ );
if ( i == 32 )
return -1;
else
{
char* retv = DecToBin( i );
for ( i = 0; i < 5; i++ )
CMD[25-i] = retv[i];
}
return 0; // 0 表示成功退出
}
case T_RT:
{
for ( i = 0; i < 32 && (!StrCmp( TOKEN.TokenName, RegsAlias[i][0] )&&!StrCmp( TOKEN.TokenName, RegsAlias[i][1] )); i++ );
if ( i == 32 )
return -1;
else
{
char* retv = DecToBin( i );
for ( i = 0; i < 5; i++ )
CMD[20-i] = retv[i];
}
return 0; // 0 表示成功退出
}
case T_BRS:
{
char t[6] = {' ',' ',' ',' ','\0'};
for ( i = 1; TOKEN.TokenName[i] != ')'; i++ )
t[i-1] = TOKEN.TokenName[i];
t[i] = '\0';
for ( i = 0; i < 32 && (!StrCmp( t, RegsAlias[i][0] )!=0&&!StrCmp( t, RegsAlias[i][1] )!=0); i++ )
{
// cout << '\t' << t << endl
// << RegsAlias[i][0] << '\t' << RegsAlias[i][1] << endl;
}
// cout << i << endl;
if ( i == 32 )
return -1;
else
{
char* retv = DecToBin( i );
for ( i = 0; i < 5; i++ )
{
CMD[25-i] = retv[i];
// cout << CMD[25-i];
}
// cout << endl;
}
return 0; // 0 表示成功退出
}
case T_IDNAME:
{
int a = VarNameToAddr( TOKEN.TokenName );
for( i = 0; a != 0 && i < 16; i++ )
{
CMD[ i ] = a%2 + 48;//注意char与int的转换
a = a/2;
}
return 0; // 0 表示成功退出
}
case T_PLUS:
{
flag = true;
return 0;
}
case T_ADDR:
{
char* t;
for ( i = 0; i < 4; i++ )
{
t = HexToBin( TOKEN.TokenName[i] );
for ( int j = 15-4*i, k = 0; j > 11-4*i && k < 4; k++, j-- )
CMD[j] = t[k];
}
return 0; // 0 表示成功退出
}
case T_IMMEDIATE:
{
//这里需要根据flag来设置立即数,以下的代码需要增加,增加的代码在最前和最后
char lower16CMD[16];
int s = 0;
for ( ; s < 16; s++ )
lower16CMD[s] = CMD[s];
//这是先将CMD的低十六位存起来,如果flag为真,则要将其加到新CMD低十六位上面
int count = 0;
char a[20];
int end;
int num = 0;
// char * b = ""; //只有在BEQ,BNE中用到,所以在下面用到的时候再声明
for ( int i = 0; TOKEN.TokenName[i] != '\0'; i++ )
a[ i ] = TOKEN.TokenName[i];
end = i - 1;
if( a[ end ] == 'B' || a[ end ] == 'b' )//二进制数
{
for( i = end; i >= 0; i-- )
CMD[ end - i ] = a[ i ];
}
else if( a[ end ] == 'O' || a[ end ] == 'o' )//八进制数
{
if( end == 6 )
{
CMD[15] = a[0];
for( i = end-1; i > 0; i-- )
{
switch( a[i] )
{
case '0':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
case '1':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
case '2':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
case '3':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
case '4':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
case '5':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
case '6':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
case '7':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
}
}
}
else
{
for( i = end-1; i >= 0; i-- )
{
switch( a[i] )
{
case '0':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
case '1':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
case '2':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
case '3':{ CMD[ 3*( end - i ) - 1 ] = '0'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
case '4':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
case '5':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '0'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
case '6':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '0'; break;}
case '7':{ CMD[ 3*( end - i ) - 1 ] = '1'; CMD[ 3*( end - i ) - 2 ] = '1'; CMD[ 3*( end - i ) - 3 ] = '1'; break;}
}
}
}
}
else if( a[ end ] == 'H' || a[ end ] == 'h' )//十六进制 ,考虑0FFFFH
{
for( i = end-1; i >= 0 && count <= 3; i-- )
{
count++;
switch( a[i] )
{
case '0':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
case '1':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
case '2':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
case '3':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
case '4':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
case '5':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
case '6':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
case '7':{ CMD[ 4*( end - i ) - 1 ] = '0'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
case '8':{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
case '9':{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
case 'A':
case 'a':
{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
case 'B':
case 'b':
{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '0'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
case 'C':
case 'c':
{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
case 'D':
case 'd':
{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '0'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
case 'E':
case 'e':
{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '0'; break;}
case 'F':
case 'f':
{ CMD[ 4*( end - i ) - 1 ] = '1'; CMD[ 4*( end - i ) - 2 ] = '1'; CMD[ 4*( end - i ) - 3 ] = '1'; CMD[ 4*( end - i ) - 4 ] = '1'; break;}
}
}
}
else
{
for( i = 0; i <= end; i++ )
{
num += ( a[ i ] - 48 ) * pow( 10, ( end - i ) ); //注意char与int的转换
}
for( i = 0; num != 0 && i < 16; i++ )
{
CMD[ i ] = num%2 + 48;//注意char与int的转换
num = num/2;
}
}
//处理Beq,Bne两条指令
if( CMD[29] == '0' && CMD[28] == '1' && CMD[27] == '0' && ( CMD[26] == '0' || CMD[26] == '1' ))
{
//cout << "into beq/bne: \n";
if ( CMD[0] == '1' || CMD[1] == '1' ) //地址不能被4整除
return -1;
char b[32];
b[31] = '0';
b[30] = '0';
for( i = 0; i < 30; i++ )
{
b[i] = CMD[ i+2 ];
}
for( i = 0; i < 32; i++ )
{
CMD[i] = b[i];
}
}
//处理有如BUF+4这样指令的立即数
if ( flag )
{//应该是当前立即数除以4加上刚处理的IDNAME的Order,注意IDNAME已经在CMD的低十六位设置好了
//还应注意,如果当前立即数不能被4整除,那么将返回地址错误
if ( CMD[0] == '1' || CMD[1] == '1' ) //当前立即数不能被4整除
return -1;
char co = '0'; //指示进位位
for ( s = 0; s < 16-2; s++ )
{
if ( (co == '1')&&(lower16CMD[s+2] == '1') )
co = '1';
else if ( (co == '0')&&(lower16CMD[s+2] == '0') )
co = '0';
else
{
if ( CMD[s+2] == '1' )
{
CMD[s] = '0';
co = '1';
}
else
{
CMD[s] = '1';
co = '0';
}
}
}
if ( co == '1' )
CMD[14] = '1';
else
CMD[14] = '0';
CMD[15] = '0';
}
return 0; // 0 表示成功退出
}
case T_SHAMT:
{
int value = 0;
char* t;
if (TOKEN.TokenName[1] == '\0' || TOKEN.TokenName[2] == '\0' )
{
if ( TOKEN.TokenName[1] == '\0' && TOKEN.TokenName[2] != '\0' )
value = TOKEN.TokenName[0]-48;
else
value = (TOKEN.TokenName[0]-48)*10+(TOKEN.TokenName[1]-48);
t = DecToBin( value );
}
else if ( TOKEN.TokenName[5] == 'b'||TOKEN.TokenName[5] == 'B' )
t = TOKEN.TokenName;
for ( i = 0; i < 5; i++)
CMD[10-i] = t[i];
return 0; // 0 表示成功退出
}
case T_COMMA:
{
return 0; // 0 表示成功退出
}
case T_NOP:
{
for ( i = 0; i < 31; i++ )
CMD[i] = '0'; //NOP的指令码为全0
return 0; // 0 表示成功退出
}
default: return -1;
}
return -1;
}
int Assembler::SegNameToAddr( char* tokenname ) //由SEGID的名称来取出其地址
{
list<My_SegID>::iterator i, iend;
i = SEGID.begin();
iend = SEGID.end();
while ( i != iend && strcmp(i->Name, tokenname) )
{
i++;
}
if ( i != iend )
return i->Order;
return -1;
}
int Assembler::VarNameToAddr( char* tokenname ) //由VAR的名称来取出其地址
{
list<My_Var>::iterator i, iend;
i = VAR.begin();
iend = VAR.end();
while ( i != iend && strcmp(i->Name, tokenname) )
{
i++;
}
if ( i != iend )
return i->Order;
return -1;
}
char* Assembler::DecToBin( int v ) //将0~31转化为二进制填入一个5bits的字符串中
{
static char retv[6] = {'0','0','0','0','0','\0'};
for ( int j = 0; j < 6-1; j++ )
retv[j] = '0';
switch ( v )
{
case 0:
break;
case 1:
retv[4] = '1';
break;
case 2:
retv[3] = '1';
break;
case 3:
retv[3] = retv[4] = '1';
break;
case 4:
retv[2] = '1';
break;
case 5:
retv[2] = retv[4] = '1';
break;
case 6:
retv[2] = retv[3] = '1';
break;
case 7:
retv[2] = retv[3] = retv[4] = '1';
break;
case 8:
retv[1] = '1';
break;
case 9:
retv[1] = retv[4] = '1';
break;
case 10:
retv[1] = retv[3] = '1';
break;
case 11:
retv[1] = retv[3] = retv[4] = '1';
break;
case 12:
retv[1] = retv[2] = '1';
break;
case 13:
retv[1] = retv[2] = retv[4] = '1';
break;
case 14:
retv[1] = retv[2] = retv[3] = '1';
break;
case 15:
retv[1] = retv[2] = retv[3] = retv[4] = '1';
break;
case 16:
retv[0] = '1';
break;
case 17:
retv[0] = retv[4] = '1';
break;
case 18:
retv[0] = retv[3] = '1';
break;
case 19:
retv[0] = retv[3] = retv[4] = '1';
break;
case 20:
retv[0] = retv[2] = '1';
break;
case 21:
retv[0] = retv[2] = retv[4] = '1';
break;
case 22:
retv[0] = retv[2] = retv[3] = '1';
break;
case 23:
retv[0] = retv[2] = retv[3] = retv[4] = '1';
break;
case 24:
retv[0] = retv[1] = '1';
break;
case 25:
retv[0] = retv[1] = retv[4] = '1';
break;
case 26:
retv[0] = retv[1] = retv[3] = '1';
break;
case 27:
retv[0] = retv[1] = retv[3] = retv[4] = '1';
break;
case 28:
retv[0] = retv[1] = retv[2] = '1';
break;
case 29:
retv[0] = retv[1] = retv[2] = retv[4] = '1';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -