I’ve started learning C in my course and I’m having some trouble debugging a program I’m making. The program is an emulator for a simplified MIPS language and basically I’m trying to read in a binary file of 32-bit instructions and store it directly into an array so that my program can go through the instructions with a program counter.
Anyway, in my first attempt at the program I had the memory that the file was read into as a 32-bit int array. The emulator worked fine and the results of my emulator matched the expected results.
The specification wanted the emulator to be byte addressable however, so I changed the memory to an array of 1-byte chars. I then changed the rest of the program as appropriate so that it would make sure it read each instruction by taking 4 blocks of chars.
In the int version of my emulator:
int loadBin(char path[]) {
printf("%s\n",path);
//open file
FILE *fp;
if ((fp = fopen(path, "rb")) == NULL) {
perror("Error opening binary file");
return 1;
}
//read from file to memory
fread(&vm.memory, 4, 16384, fp);
}
ANd in the char version:
int loadBin(char path[]) {
//open file
FILE *fp;
if ((fp = fopen(path, "rb")) == NULL) {
perror("Error opening binary file");
return 1;
}
//read from file to memory
fread(&vm.memory, 1, 65536, fp);
fclose(fp);
return 0;
}
But the char memory emulator read an incorrect 32-bit instruction half way through the program.
Using:
int test = (vm.memory[16]) + (vm.memory[17] << 8) +
(vm.memory[18] << 16) + (vm.memory[19] << 24);
printf("%d\n", test);
return 0;
results in a DIFFERENT number from what I get in the int array at vm.memory[4] which should be exactly the same. The results up to vm.memory[4] are the same in the char array, but for some reason something goes wrong. Can anybody help?
Thx
Your char array should be aligned at a 32-bit boundary if you’re going to be reading/writing 32-bit words from it. If you used malloc to allocate this array, then it’s already aligned.
Instead of this:
try this:
|is the bitwise OR operator.+uses 2’s-complement arithmetic, so you might get weird results when integers are negative, or when there’s overflow.