我正在实施MIPS指令集模拟器。但是当我尝试编译我的代码时,我不断遇到“超出范围”的错误,而且它变得非常令人沮丧。我尝试了各种各样的变化,但似乎没有任何帮助 这是我的MIPSsim.cpp文件
#include <iostream>
#include <fstream>
#include <string>
#include <cassert>
using namespace std;
const int BITS = 32;
string inst_decode(string line);
void execute(string line, string instruction, int ®isters[]);
void print(int cycle, int inst_address, int regs[]/*, int data[]*/);
int convert_5(string binary);
int convert_32(string binary);
void add(string line, int ®isters[]);
void sub(string line, int ®isters[]);
void mult(string line, int ®isters[]);
string inst_decode(string line){
string instruction;
if(line.compare(0,1,"0") == 0){
if (line.compare(1,5,"00010") == 0){
cout << "JUMP" << endl;
instruction = "JUMP";
}else if (line.compare(1,5,"00100") == 0){
cout << "BEQ" << endl;
instruction = "BEQ";
}else if (line.compare(1,5,"00001") == 0){
cout << "BLTZ" << endl;
instruction = "BLTZ";
}else if (line.compare(1,5,"00111") == 0){
cout << "BGTZ" << endl;
instruction = "BGTZ";
}else if (line.compare(1,5,"01011") == 0){
cout << "SW" << endl;
instruction = "SW";
}else if (line.compare(1,5,"00011") == 0){
cout << "LW" << endl;
instruction = "LW";
}else if (line.compare(1,5,"00010") == 0){
cout << "SRL" << endl;
instruction = "SRL";
}else if ((line.compare(1,5,"11100") == 0)&&(line.compare(26,6,"000010") == 0)){
cout << "MUL" << endl;
instruction = "MUL";
}else if (line.compare(1,5,"00000") == 0){
if (line.compare(26,6,"100000") == 0){
cout << "ADD" << endl;
instruction = "ADD";
}else if (line.compare(26,6,"100010") == 0){
cout << "SUB" << endl;
instruction = "SUB";
}else if (line.compare(26,6,"100100") == 0){
cout << "AND" << endl;
instruction = "AND";
}else if (line.compare(26,6,"100101") == 0){
cout << "OR" << endl;
instruction = "OR";
}else if (line.compare(26,6,"101010") == 0){
cout << "SLT" << endl;
instruction = "SLT";
}else if (line.compare(26,6,"000000") == 0){
cout << "SLL" << endl;
instruction = "SLL";
}else if (line.compare(6,26,"00000000000000000000000000") == 0){
cout << "NOP" << endl;
instruction = "NOP";
}
}
}else{
if (line.compare(26,6,"100100") == 0){
cout << "ADDI" << endl;
instruction = "ADDI";
}else if (line.compare(26,6,"100010") == 0){
cout << "ANDI" << endl;
instruction = "ANDI";
}
}
return instruction;
}
void execute(string line, string instruction, int& registers[]){
if(instruction == "ADD"){
add(line, registers);
}else if(instruction == "ADDI"){
addi(line, registers);
}else if(instruction == "SUB"){
sub(line, registers);
}else if(instruction == "MUL"){
mult(line, registers);
}
}
void print(int cycle, int inst_address, int regs[]/*, int data[][]*/){
cout << "---------------------------\n";
cout << "Cycle: " << cycle << "\t" << inst_address << "\t" << "\n";
cout << "\nRegisters\n";
cout << "R00:\t";
for(int i=0; i<=15; i++){
cout << regs[i] << "\t";
}
cout << "\nR16:\t";
for(int i=16; i<32; i++){
cout << regs[i] << "\t";
}
cout << "\n\nData\n";
//cout << "\n148:\t";
//for(int i=0; i<8; i++){
// cout << data[i] << "\t";
//}
//cout << "\n180:\t";
//for(int i=9; i<17; i++){
// cout << data[i] << "\t";
//}
//cout << "\n212:\t";
//for(int i=18; i<26; i++){
// cout << data[i] << "\t";
//}
cout << "\n";
}
int main(){
int registers[32] = {0};
// int data[2][32];
string inst;
//int cycle = 1;
//int PC = 64;
string binary_inst[64];
ifstream inFile;
inFile.open("sample.txt");
if (!inFile) {
cout << "Unable to open file sample.txt" << endl;
return 0;
}
string x;
while(!inFile.eof()){
for(int i=0; i<64; i++){
inFile >> x;
binary_inst[i] = x;
inst = inst_decode(binary_inst[i]);
execute(binary_inst[i], inst, registers);
//print(cycle, PC, registers);
}
}
// print(cycle, PC, registers);
return 0;
}
int convert_5(string binary) {
long power = 32;
long sum = 0;
assert(binary.size() == 5);
for ( int i=0; i<BITS; ++i) {
if ( i==0 && binary[i]!='0') {
sum = -32;
}
else {
sum += (binary[i]-'0')*power;
}
power /= 2;
}
return sum;
}
int convert_32(string binary) {
long power = 4294967296;
long sum = 0;
assert(binary.size() == 32);
for ( int i=0; i<BITS; ++i) {
if ( i==0 && binary[i]!='0') {
sum = -4294967296;
}
else {
sum += (binary[i]-'0')*power;
}
power /= 2;
}
return sum;
}
void add(string line, int& registers[]){
int dest = convert_5(line.substr(17,5));
cout << "Dest: " << dest << endl;
int target = convert_5(line.substr(12,5));
cout << "Target: " << target << endl;
int source = convert_5(line.substr(7,5));
cout << "Source: " << source << endl;
registers[dest] = registers[source] + registers[target];
cout << "Addition: " << registers[dest] << endl;
}
void sub(string line, int& registers[]){
int dest = convert_5(line.substr(17,5));
cout << "Dest: " << dest << endl;
int target = convert_5(line.substr(12,5));
cout << "Target: " << target << endl;
int source = convert_5(line.substr(7,5));
cout << "Source: " << source << endl;
registers[dest] = registers[source] - registers[target];
cout << "Subtraction: " << registers[dest] << endl;
}
void mult(string line, int& registers[]){
int dest = convert_5(line.substr(17,5));
cout << "Dest: " << dest << endl;
int target = convert_5(line.substr(12,5));
cout << "Target: " << target << endl;
int source = convert_5(line.substr(7,5));
cout << "Source: " << source << endl;
registers[dest] = registers[source] * registers[target];
cout << "Multiplication: " << registers[dest] << endl;
}
以下是我不断收到的错误消息:
lin114-08:10% make all
g++ -Wall -o MIPSsim MIPSsim.cpp
MIPSsim.cpp:10: error: declaration of ‘registers’ as array of references
MIPSsim.cpp:14: error: declaration of ‘registers’ as array of references
MIPSsim.cpp:15: error: declaration of ‘registers’ as array of references
MIPSsim.cpp:16: error: declaration of ‘registers’ as array of references
MIPSsim.cpp:85: error: declaration of ‘registers’ as array of references
MIPSsim.cpp: In function ‘void execute(...)’:
MIPSsim.cpp:86: error: ‘instruction’ was not declared in this scope
MIPSsim.cpp:87: error: ‘line’ was not declared in this scope
MIPSsim.cpp:87: error: ‘registers’ was not declared in this scope
MIPSsim.cpp:89: error: ‘line’ was not declared in this scope
MIPSsim.cpp:89: error: ‘registers’ was not declared in this scope
MIPSsim.cpp:89: error: ‘addi’ was not declared in this scope
MIPSsim.cpp:91: error: ‘line’ was not declared in this scope
MIPSsim.cpp:91: error: ‘registers’ was not declared in this scope
MIPSsim.cpp:93: error: ‘line’ was not declared in this scope
MIPSsim.cpp:93: error: ‘registers’ was not declared in this scope
MIPSsim.cpp: In function ‘int main()’:
MIPSsim.cpp:146: warning: cannot pass objects of non-POD type ‘struct std::string’ through ‘...’; call will abort at runtime
MIPSsim.cpp:146: warning: cannot pass objects of non-POD type ‘struct std::string’ through ‘...’; call will abort at runtime
MIPSsim.cpp: At global scope:
MIPSsim.cpp:193: error: declaration of ‘registers’ as array of references
MIPSsim.cpp: In function ‘void add(...)’:
MIPSsim.cpp:194: error: ‘line’ was not declared in this scope
MIPSsim.cpp:203: error: ‘registers’ was not declared in this scope
MIPSsim.cpp: At global scope:
MIPSsim.cpp:207: error: declaration of ‘registers’ as array of references
MIPSsim.cpp: In function ‘void sub(...)’:
MIPSsim.cpp:208: error: ‘line’ was not declared in this scope
MIPSsim.cpp:217: error: ‘registers’ was not declared in this scope
MIPSsim.cpp: At global scope:
MIPSsim.cpp:221: error: declaration of ‘registers’ as array of references
MIPSsim.cpp: In function ‘void mult(...)’:
MIPSsim.cpp:222: error: ‘line’ was not declared in this scope
MIPSsim.cpp:231: error: ‘registers’ was not declared in this scope
make: *** [MIPSsim] Error 1
非常感谢任何帮助
答案 0 :(得分:6)
始终修复编译器为您提供的第一个错误:int ®isters[]
无法使用 - 使用int * registers
或int registers[]
。
如果您真的想要引用数组,则需要指定大小:
void execute(string line, string instruction, int (®isters) [10]);
所有这些方法都可以让你修改传递给函数的实际数组 - 没有复制。
旁注:
在MIPSsim.cpp
第146行,您尝试将std::string
传递给vararg函数(例如sprintf
或printf
) - 这样做无效。改为通过string.c_str()
。
答案 1 :(得分:0)
我不能说是否存在其他问题,但我认为您的execute
,add
,sub
,mult
函数只能将registers
视为void add(string line, int registers[]);
一个数组,而不是一个引用数组。
{{1}}
答案 2 :(得分:0)
您不能在C ++中将数组作为参数传递。你需要做的是 声明参数:
int (®isters)[32];
但是寄存器不是唯一可能的机器状态 通过执行一些代码来改变。一个更好的解决方案是 定义一个具有所有机器状态的结构(除了内存):
struct HWState
{
int registers[32];
unsigned cc;
??? pc;
// ...
};
然后通过引用传递,你不应该有任何问题。 (在 实践中,C样式数组只能用于静态变量 静态初始化,以及作为成员,当计数是常数时 不太大。)
答案 3 :(得分:0)
如果你有很多函数都采用相同的参数,那通常表明它们应该是成员函数。在这里,您有add
,sub
和mult
,它们都在您的寄存器集上运行。当然,大多数未来的指示也是如此。
因此,为每个注册表定义一个class CPU
数据成员(即int r[32];float f[32];
)和一个方法CPU::add(std::string line)
。在添加内,如果你有r[4]
,你可以参考需要第一个函数参数寄存器等。