0

我正在尝试修改 MIPS 模拟器以在运行时显示其寄存器的内容。我的问题是指我计划这样做的方式。所以...

我有一个文件,file1.cpp 和 file2.cpp。file1.cpp 中有一个局部公共变量,称为

typedef long ValueGPR;
ValueGPR reg[33];

我想在 file2.cpp 中访问。这些文件中的每一个都有一个头文件。File2.cpp 包含一个函数,该函数通过指令迭代跟踪程序指令的执行,使其成为插入 printf("REG[%d]:%d\n",i,reg[i]); 的完美位置。声明或类似的东西,但 reg 是 file1.cpp 中的局部变量。如何将允许我访问此 reg 变量的东西拼接在一起?

这就是这两个文件的实际样子(在考虑了更多之后):“File1.h”

typedef long ValueGPR;
...
class ThreadContext {
    ...
    public:
        ValueGPR reg[33];
        ...
    ...
}
...

“文件2.cpp”

...
#include ".../ThreadContext.h"
...
long ExecutionFlow::exeInst(void) {
    ...
    //ADD PRINTF OF reg[1] - reg[32] HERE
    ...
}
...
4

2 回答 2

4

我会将 typedef 连同以下声明一起移动到 file1.h 中:

extern ValueGPR reg[];

保留ValueGPR reg[33];在 file1.cpp 中。

于 2010-07-06T15:50:08.227 回答
1

Cogwheel 的答案是正确的,但是您的评论表明存在混淆的可能性,因此最好澄清一下:

文件1.h:

#ifndef FILE1_H_INCLUDED
#define FILE1_H_INCLUDED

typedef long ValueGPR;
extern ValueGPR reg[];
#define NUM_REGS 33

#endif

文件1.c:

#include "file1.h"

ValueGPR reg[NUM_REGS];

文件2.c:

#include "file1.h"

/* ... */
for (i=0; i<NUM_REGS; i++)
    show(reg[i]);

编辑:鉴于附加点reg确实是一个类的成员,上面的代码显然不起作用,尽管总体思路保持不变。对于班级成员,您需要将班级作为一个整体来处理,而不仅仅是其reg本身。对事物的外观进行疯狂的尝试,您可能会遇到以下情况

文件1.h:

// include guard here

class CPU_state { 
public:
    typedef long ValueGPR;
    static const int num_regs = 33;
    ValueGPR reg[num_regs];

    //or, preferably:

    // std::vector<ValueGPR> regs;
    // CPU_state() : regs(num_regs) {}
    // ...
};

extern CPU_state cpu;

文件 1.cpp:

#include "file1.h"
CPU_state cpu;

文件 2.cpp:

#include "file1.h"

for (int i=0; i<cpu.num_regs; i++)
    show(cpu.reg[i]);

如果您可能一次创建多个 CPU,那么您可能需要将指针或引用传递给 CPU_state(或您所称的任何名称),而不是像此代码使用的那样依赖全局实例。

于 2010-07-06T16:18:07.363 回答