0

我正在实现 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 &registers[]);
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 &registers[]);
void sub(string line, int &registers[]);
void mult(string line, int &registers[]);


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

任何帮助将不胜感激

4

4 回答 4

6

始终修复编译器给您的第一个int &registers[]错误:将不起作用 - 使用int * registersint registers[].

如果你真的想要一个数组的引用,你需要指定大小:

void execute(string line, string instruction, int (&registers) [10]);

所有这些方法都可以让您修改传递给函数的实际数组 - 没有复制。

边注:

MIPSsim.cpp第 146 行中,您尝试将 a 传递std::string给可变参数函数(例如sprintfor printf) - 那是行不通的。string.c_str()而是通过。

于 2011-03-30T15:18:14.437 回答
0

您不能在 C++ 中将数组作为参数传递。您需要做的是声明参数:

int (&registers)[32];

但是寄存器并不是唯一可能通过执行某些代码而改变的机器状态。一个更好的解决方案是定义一个包含所有机器状态的结构(可能除了内存):

struct HWState
{
    int registers[32];
    unsigned cc;
    ??? pc;
    //  ...
};

然后通过引用传递它,你不应该有任何问题。(在实践中,C 风格的数组应该只用于静态变量,具有静态初始化,并且作为成员,当计数是常量且不太大时。)

于 2011-03-30T16:06:52.773 回答
0

当你有很多函数都采用相同的参数时,这通常表明它们应该是成员函数。在这里,您有add,sub并且mult它们都在您的一组寄存器上运行。当然,大多数未来的指令也会。

因此,class CPU为每个寄存器定义一个数据成员(即int r[32];float f[32];,和一个方法CPU::add(std::string line)。在 add 中,您可以参考r[4]是否需要第一个函数参数寄存器等。

于 2011-03-30T17:23:20.897 回答
0

我不能说是否还有其他问题,但我认为你的execute, add, sub,mult函数可以只registers作为一个数组,而不是一个引用数组。

void add(string line, int registers[]);

于 2011-03-30T15:18:26.367 回答