Я должен сделать симулятор rv32. Для этого я сейчас работаю над классом «память», который поможет мне отслеживать память.
Поскольку 32-разрядная версия, над которой я работаю, мне нужна структура данных для представления памяти. Концептуально память - это просто массив байтов, проиндексированный с использованием байтовых адресов, поэтому я использую массив для этого.
class memory {
private:
// TODO: Add private members here
int * storage= new int [100000000];
public:
// Constructor
memory(bool verbose);
// Read a word of data from a word-aligned address.
uint32_t read_word (uint32_t address);
// Write a word of data to a word-aligned address.
void write_word (uint32_t address, uint32_t data, uint32_t mask);
// Load a hex image file and provide the start address for execution from the file in start_address.
bool load_file(string file_name, uint32_t &start_address);
};
Когда я использую массив 'storage', он вызывает ошибку сегмента в операторе возврата, если адрес подобен 80000000.
uint32_t memory::read_word (uint32_t address) {
//rounding up multiple
if((address %4 )!=0){
int remainder =(address)%4;
address=address-remainder;
}
return (storage[address]);
}