#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned char ram[0x1000];
//采用小端序
//内存32kb,char型1个byte,8个bit
//0-16383 为代码段
//16384-32767 为数据段
//memset(ram, 0, sizeof(ram));
short ip = 0; //ip16位可以c寻址32k内存空间
unsigned int ir = 0; //指令寄存器
int flag = 0;
//8个16位寄存器组
short ax[8] = {
0};
/*short ax2 = 0;
short ax3 = 0;
short ax4 = 0;
short ax5 = 0;
short ax6 = 0;
short ax7 = 0;
short ax8 = 0;*/
void reset() {
ip = 0;
ir = 0;
flag = 0;
memset(ax, 0, 8);
memset(ram, 0, 0x1000);
}
//显示内存状态
void show_cpu_state() {
printf("ip = %d\n", ip);
printf("flag = %d\n", flag);
printf("ir = %08x\n", ir);
printf("ax1 = %d ax2 = %d ax3 = %d ax4 = %d\n", ax[0], ax[1], ax[2], ax[3]);
printf("ax5 = %d ax6 = %d ax7 = %d ax8 = %d\n", ax[4], ax[5], ax[6], ax[7]);
}
//显示内存数据段与代码段状态
void show_ram_state() {
int i = 0;
printf("CodeSegment:");
for(;i < 64; i++) {
if(i % 4 == 0)
printf("\n");
printf("%02x ", ram[i]);
}
printf("\nDataSegment:");
for(i = 16384; i < 16896; i+=2) {
int n = 0;
n += ram[i+1];
n = n << 8;
n += ram[i];
if(i % 32 == 0)
printf("\n");
printf("%d ", n);
}
printf("\n");
}
//char指令转正2进制形式存储
void str2binary(int index, char instruction[]) {
int i = index;
int j = 0;
for(; j < 4; ++j) {
int k = j*8;
char temp[9];
strncpy(temp, instruction + k, 8);
//printf("%s Hex:", temp);
unsigned char n = 0;
unsigned char t = 0;
int p = 0;
int q = 0x80;
for(; p < 8; ++p) {
temp[p] -= 0x30;
t = temp[p] * q;
q = q >> 1;
n += t;
}
/*temp[0] -= 0x30;
t = temp[0] * 0x80;
n += t;
temp[1] -= 0x30;
t = temp[1] * 0x40;
n += t;
temp[2] -= 0x30;
t = temp[2] * 0x20;
n += t;
temp[3] -= 0x30;
t = temp[3] * 0x10;
n += t;
temp[4] -= 0x30;
t = temp[4] * 0x08;
n += t;
temp[5] -= 0x30;
t = temp[5] * 0x04;
n += t;
temp[6] -= 0x30;
t = temp[6] * 0x02;
n += t;
temp[7] -= 0x30;
t = temp[7] * 0x01;
n += t;*/
ram[i] = n;
//printf("%02x\n", ram[i]);
++i;
}
}
//函数功能:将文件中的指令读入内存的代码段
//输入:文件地址
//输出:无
void instructions_loading(char* fileAddr) {
FILE *fp;
fp=fopen(fileAddr,"r");
char instruction[33],ch[5];
int i=0;
while(fgets(instruction,33,fp) != NULL){
//printf("%s\n", instruction);
str2binary(4*i, instruction);
fgets(ch, 5, fp);
//printf("%c", ch);
i++;
}
//printf("%d", i);
//countl=i;
fclose(fp);
return;
}
//函数功能:将代码段中ip指向的指令取出,装入指令寄存器ir
//输入:全局的ip和ram
//输出:无
void load_instruction() {
ir = 0;
ir += ram[ip];
ir = ir << 8;
ir += ram[ip+1];
ir = ir << 8;
ir += ram[ip&#