#include #include #define LINE_MAX 2048 #define ADD 0 #define ADDI 1 #define SUB 2 #define MUL 4 #define MULI 5 #define MULH 6 #define DIV 8 #define CMPEQ 10 #define CMPEQI 11 #define CMPLT 12 #define CMPLTI 13 #define CMPGTI 15 #define AND 16 #define ANDI 17 #define OR 18 #define ORI 19 #define XOR 20 #define XORI 21 #define NOT 22 #define SLL 24 #define SLLI 25 #define SRL 26 #define SRLI 27 #define SRA 28 #define SRAI 29 #define FADD ADD #define FSUB SUB #define FMUL MUL #define FDIV 6 #define SQRT 8 #define FINVSQRT 10 #define FLESS 12 #define ITOF 16 #define FTOI 24 #define HI 0 #define LOAD 16 #define LOADD 18 #define LOADI 19 #define STORE 24 #define STORED 26 #define STOREI 27 #define IN 21 #define OUT 29 #define BEQ 0 #define BNE 1 #define BGT 2 #define BGE 3 #define JMP 12 #define JMPL 13 #define JMPR 8 #define JMPRL 10 #define RET 12 #define END 7 int call_opcode(char *, char *,int); int encoder(int, char *); int reg[128]; int label[2048]; int label_num; int mylabel; char label_content[2048][128]; //label[i]:行数 label_content[i]:ラベル内容 int input_line_cnt; int output_line_cnt; //出力の何行目なのかを数える char opes[32000][128]; int main(int argc, char *argv[]) { FILE * fp1; FILE * fp2; FILE * fp3; char buf[LINE_MAX]; int output_data[256*256]; //各行を整数にしたものを保存 int ir; int i,j,k,n; unsigned int m; char opcode[256]; char sub_label[128]; char output_tmpstr[33]; int err_cnt; char mov1[128]; char mov2[128]; char mov3[128]; char mov4[128]; char tmp[256]; char tmp1[256]; char tmp_imm[32]; char tmp_label[128]; char tmp_reg[32]; input_line_cnt = 0; output_line_cnt = 0; err_cnt = 0; int count=0; int ra; int flag; mylabel=0; fp1=fopen(argv[1], "r"); //仕様:第一引数に入力ファイルを入れる if(fp1 == NULL){ printf("error of open infile\n"); return -1; } j=0; while(fgets(buf,LINE_MAX,fp1) != NULL){ //入力のファイルの最後まで読む if(sscanf(buf, "%s", opcode)==1){ if(opcode[0] == ':'){ if(sscanf(buf, ":%s", label_content[j])==1){ label[j]=count; j++; mylabel++; }else{ printf("we can not analyze line %d : \n",input_line_cnt + 1); err_cnt++; } } strcpy(mov1, "hi"); strcpy(mov2, "addi"); if(strcmp(opcode, "mov")==0){ strcpy(tmp_reg, buf+3); //printf("first--tmp_reg---%s\n", tmp_reg); for(i=1; i<10; i++){ if(tmp_reg[i]==',') k=i; } //tmp_reg[k+1]='\0'; strcpy(tmp_imm, tmp_reg+k+1); tmp_reg[k+1]='\0'; if(sscanf(buf, "%s r%d, %d",tmp, &ra, &m)==3){ //printf("mov_int------ %s, r%d, %d\n", tmp, ra, m); if(((int)m)<=1023 && ((int)m)>=-1024){ strcat(mov2,tmp_reg); strcat(mov2, " r0,"); strcat(mov2, tmp_imm); strcpy(opes[count], mov2); count++; } else{ flag=((m<<21)>>31); strcat(mov1, tmp_reg); strcat(mov1, tmp_imm); strcpy(opes[count], mov1); count++; strcat(mov2, tmp_reg); strcat(mov2, tmp_reg); strcat(mov2, tmp_imm); strcpy(opes[count], mov2); count++; // printf("mov1---%s, mov2---%s\n", mov1, mov2); } }else if(sscanf(buf, "%s r%d, %s", tmp, &ra,tmp1)==3){ // printf("mov_label------- %s, r%d, %s\n", tmp, ra, tmp1); strcat(mov1, tmp_reg); strcat(mov1, tmp_imm); strcpy(opes[count], mov1); count++; strcat(mov2,tmp_reg); strcat(mov2, tmp_reg); strcat(mov2, tmp_imm); strcpy(opes[count], mov2); count++; } } if (opcode[0]!= ':' && (strcmp(opcode, "mov")!=0)){ strcpy(opes[count], buf); count++; } } } /* for(i=0; i127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } return (ra << 23) | (ADD << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "addi") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ // sub_imm=(imm<<21)>>21; if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((((imm<<21)>>21) & 0xfffff800U)!=0)){ printf("error---line %d\n", count); } return (ra << 23) | (ADDI << 18) | (rb << 11) |(imm&0x000007ffU); }else if(sscanf(op_data, "%s r%d, r%d, %s", tmp_str, &ra, &rb,sub_label) == 4){ //printf("my_label---%d\n", mylabel); for(i=0; i>21); // printf("sub_imm1: %d\n", (label[i]&0x000007ffU)); // printf("sub_imm1: %d\n", (label[i]0xfffff800U)); if((ra<0)||(ra>127)||(rb<0) || (rb>127)){ printf("error---line %d\n", count); } return (ra << 23) | (ADDI << 18) | (rb << 11) | (label[i]&0x000007ffU); } } if(strcmp(opcode, "sub") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (SUB << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "mul") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (MUL << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "mulh") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (MULH<< 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "div") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (DIV << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "muli") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((sub_imm & 0xfffff800)!=0)){ printf("error---line %d\n", count); } } return (ra << 23) | (MULI << 18) | (rb << 11) | ((imm<<21)>>21); } if(strcmp(opcode, "cmpeqi") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((sub_imm & 0xfffff800)!=0)){ printf("error---line %d\n", count); } } return (ra << 23) | (CMPEQI << 18) | (rb << 11) | ((imm<<21)>>21); } if(strcmp(opcode, "cmplti") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(sub_imm & 0xfffff800)!=0){ printf("error---line %d\n", count); } } return (ra << 23) | (CMPLTI << 18) | (rb << 11) | ((imm<<21)>>21); } if(strcmp(opcode, "cmpgti") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((sub_imm & 0xfffff800)!=0)){ printf("error---line %d\n", count); } } return (ra << 23) | (CMPGTI << 18) | (rb << 11) | ((imm<<21)>>21); } if(strcmp(opcode, "cmpeq") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (CMPEQ<< 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "cmplt") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (CMPLT << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "and") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (AND << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "or") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (OR << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "xor") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (XOR << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "not") == 0){ if(sscanf(op_data, "%s r%d, r%d", tmp_str, &ra, &rb) == 3){ if((ra<0)||(ra>127)||(rb<0) || (rb>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (NOT << 18) | (rb << 11); } if(strcmp(opcode, "andi") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((sub_imm & 0xfffff800)!=0)){ printf("error---line %d\n", count); } } return (ra << 23) | (ANDI << 18) | (rb << 11) | ((imm<<21)>>21); } if(strcmp(opcode, "ori") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((sub_imm & 0xfffff800)!=0)){ printf("error---line %d\n", count); } } return (ra << 23) | (ORI<< 18) | (rb << 11) | ((imm<<21)>>21); } if(strcmp(opcode, "xori") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((sub_imm & 0xfffff800)!=0)){ printf("error---line %d\n", count); } } return (ra << 23) | (XORI<< 18) | (rb << 11) | ((imm<<21)>>21); } if(strcmp(opcode, "sll") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (SLL << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "srl") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (SRL << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "sra") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (ra << 23) | (SRA << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "slli") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((sub_imm & 0xfffff800)!=0)){ printf("error---line %d\n", count); } } return (ra << 23) | (SLLI<< 18) | (rb << 11) | ((imm<<21)>>21); } if(strcmp(opcode, "srli") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((sub_imm & 0xfffff800)!=0)){ printf("error---line %d\n", count); } } return (ra << 23) | (SRLI<< 18) | (rb << 11) | ((imm<<21)>>21); } if(strcmp(opcode, "srai") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((sub_imm & 0xfffff800)!=0)){ printf("error---line %d\n", count); } } return (ra << 23) | (SRAI<< 18) | (rb << 11) | ((imm<<21)>>21); } if(strcmp(opcode, "fadd") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0)||(rc>127)){ printf("error---line %d\n", count); } } return (1<<30) | (ra << 23) | (FADD << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "fsub") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0)||(rc>127)){ printf("error---line %d\n", count); } } return (1<<30) | (ra << 23) | (FSUB << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "fmul") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0)||(rc>127)){ printf("error---line %d\n", count); } } return (1<<30) | (ra << 23) | (FMUL << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "fdiv") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0)||(rc>127)){ printf("error---line %d\n", count); } } return (1<<30) | (ra << 23) | (FDIV << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "fless") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0)||(rc>127)){ printf("error---line %d\n", count); } } return (1<<30) | (ra << 23) | (FLESS << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "sqrt") == 0){ if(sscanf(op_data, "%s r%d, r%d", tmp_str, &ra, &rb) == 3){ if((ra<0)||(ra>127)||(rb<0) || (rb>127)){ printf("error---line %d\n", count); } } return (1<<30) | (ra << 23) | (SQRT << 18) | (rb << 11) ; } if(strcmp(opcode, "sqrt") == 0){ if(sscanf(op_data, "%s r%d, r%d", tmp_str, &ra, &rb) == 3){ if((ra<0)||(ra>127)||(rb<0) || (rb>127)){ printf("error---line %d\n", count); } } return (1<<30) | (ra << 23) | (SQRT << 18) | (rb << 11) ; } if(strcmp(opcode, "finvsqrt") == 0){ if(sscanf(op_data, "%s r%d, r%d", tmp_str, &ra, &rb) == 3){ if((ra<0)||(ra>127)||(rb<0) || (rb>127)){ printf("error---line %d\n", count); } } return (1<<30) | (ra << 23) | (FINVSQRT << 18) | (rb << 11) ; } if(strcmp(opcode, "itof") == 0){ if(sscanf(op_data, "%s r%d, r%d", tmp_str, &ra, &rb) == 3){ if((ra<0)||(ra>127)||(rb<0) || (rb>127)){ printf("error---line %d\n", count); } } return (1<<30) | (ra << 23) | (ITOF << 18) | (rb << 11) ; } if(strcmp(opcode, "ftoi") == 0){ if(sscanf(op_data, "%s r%d, r%d", tmp_str, &ra, &rb) == 3){ if((ra<0)||(ra>127)||(rb<0) || (rb>127)){ printf("error---line %d\n", count); } } return (1<<30) | (ra << 23) | (FTOI << 18) | (rb << 11) ; } if(strcmp(opcode, "hi") == 0){ if(sscanf(op_data, "%s r%d, %d", tmp_str, &ra, &imm) == 3){ flag=((imm<<21)>>31); // printf("imm--- %d, flag--- %d sub_imm--- %d\n", imm, flag, sub_imm); if(flag==0){ sub_imm=(imm>>11); if((ra<0)||(ra>127)||((sub_imm & 0xffe00000U)!=0)){ printf("error---line %d\n", count); } return (1<<31) | (ra << 23) | (HI << 21) | (imm>>11) ; }else{ sub_imm=((imm+2048)>>11); if((ra<0)||(ra>127)||((sub_imm & 0xffe00000U)!=0)){ printf("error---line %d\n", count); } return (1<<31) | (ra << 23) | (HI << 21) | ((imm+2048)>>11) ; } }else if(sscanf(op_data, "%s r%d, %s", tmp_str, &ra, sub_label) == 3){ for(i=0; i>11); //printf("sub_imm---%d\n", sub_imm); if((ra<0)||(ra>127)||((label[i]& 0xffe00000U)!=0)){ printf("hi1 error---line %d\n", count); //printf("label[i]---%d, idou---%d\n", label[i], label[i]>>11); } return (1<<31) | (ra << 23) | (HI << 21) | (label[i]>>11) ; }else{ // printf("line--%d, hi flag=1, label--%d, ", count, label[i]); sub_imm=(((label[i]+2048)>>11)&0x001fffff); // printf("sub_imm--- %d\n", sub_imm); if((ra<0) || (ra>127) || ((sub_imm &0xffe00000U)!=0)){ //if((ra<0) || (ra>127)){ printf("error----line %d\n", count); } return (1<<31) | (ra << 23) | (HI << 21) | ((label[i]+2048)>>11) ; } } } if(strcmp(opcode,"loadi") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((sub_imm & 0xfffff800U)!=0)){ printf("error---line %d\n", count); } } return (1<<31) | (ra << 23) | (LOADI << 18) | (rb << 11) | ((imm<<21)>>21); } if(strcmp(opcode, "storei") == 0){ if(sscanf(op_data, "%s r%d, r%d, %d", tmp_str, &ra, &rb, &imm) == 4){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||((sub_imm & 0xfffff800U)!=0)){ printf("error---line %d\n", count); } } return (1<<31) | (ra << 23) | (STOREI << 18) | (rb << 11) | ((imm<<21)>>21);} if(strcmp(opcode, "load") == 0){ if(sscanf(op_data, "%s r%d, r%d", tmp_str, &ra, &rb) == 3){ if((ra<0)||(ra>127)||(rb<0) || (rb>127)){ printf("error---line %d\n", count); } } return (1<<31) | (ra << 23) | (LOAD << 18) | (rb << 11) ; } if(strcmp(opcode, "store") == 0){ if(sscanf(op_data, "%s r%d, r%d", tmp_str, &ra, &rb) == 3){ if((ra<0)||(ra>127)||(rb<0) || (rb>127)) { printf("error---line %d\n", count); } } return (1<<31) | (ra << 23) | (STORE << 18) | (rb << 11) ; } if(strcmp(opcode, "loadd") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) ||(rc>127)){ printf("error---line %d\n", count); } } return (1<<31) | (ra << 23) | (LOADD << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "stored") == 0){ if(sscanf(op_data, "%s r%d, r%d, r%d", tmp_str, &ra, &rb, &rc) == 4){ if((ra<0)||(ra>127)||(rb<0) || (rb>127) ||(rc<0) || (rc>127)){ printf("error---line %d\n", count); } } return (1<<31) | (ra << 23) | (STORED << 18) | (rb << 11) | (rc << 4); } if(strcmp(opcode, "in") == 0){ if(sscanf(op_data, "%s r%d, %d", tmp_str, &ra, &imm) == 3){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||((sub_imm & 0xfffff800U)!=0)){ printf("error---line %d\n", count); } } return (1<<31) | (ra << 23) | (IN << 18) | ((imm<<21)>>21) ; } if(strcmp(opcode, "out") == 0){ if(sscanf(op_data, "%s r%d, %d", tmp_str, &ra, &imm) == 3){ sub_imm=((imm<<21)>>21); if((ra<0)||(ra>127)||((sub_imm & 0xfffff800U)!=0)){ printf("error---line %d\n", count); } } return (1<<31) | (OUT << 18)| (ra <<11) | ((imm<<21)>>21) ; } if(strcmp(opcode, "beq") == 0){ if(sscanf(op_data, "%s r%d, %s", tmp_str, &ra, sub_label) == 3){ for(i=0; i127)||((sub_imm & 0xfff80000U)!=0)){ printf("error---line %d\n", count); } return (1<<31)| (1<<30) | (ra << 23) | (BEQ << 19) | ((label[i]-count) & 0x0007ffffU) ; } if(strcmp(opcode, "bne") == 0){ if(sscanf(op_data, "%s r%d, %s", tmp_str, &ra, sub_label) == 3){ for(i=0; i127)||((sub_imm & 0xfff80000U)!=0)){ printf("error---line %d\n", count); } return (1<<31)| (1<<30) | (ra << 23) | (BNE << 19) | ((label[i]-count) & 0x0007ffffU) ; } if(strcmp(opcode, "bgt") == 0){ if(sscanf(op_data, "%s r%d, %s", tmp_str, &ra, sub_label) == 3){ for(i=0; i127)||((sub_imm & 0xfff80000U)!=0)){ printf("error---line %d\n", count); } return (1<<31)| (1<<30) | (ra << 23) | (BGT << 19) |((label[i]-count) & 0x0007ffffU) ; } if(strcmp(opcode, "bge") == 0){ if(sscanf(op_data, "%s r%d, %s", tmp_str, &ra, sub_label) == 3){ for(i=0; i127)||((sub_imm & 0xfff80000U)!=0)){ printf("error---line %d\n", count); } return (1<<31)| (1<<30) | (ra << 23) | (BGE << 19) | ((label[i]-count) & 0x0007ffffU) ; } if(strcmp(opcode, "beq") == 0){ if(sscanf(op_data, "%s r%d, %s", tmp_str, &ra, sub_label) == 3){ for(i=0; i127)||((sub_imm & 0xfff80000U)!=0)){ printf("error---line %d\n", count); } return (1<<31)| (1<<30) | (ra << 23) | (BEQ << 19) |((label[i]-count) & 0x0007ffffU) ; } if(strcmp(opcode, "jmp") == 0){ if(sscanf(op_data, "%s %s", tmp_str, sub_label) == 2){ // printf("jump saki: %s\n", sub_label); for(i=0; i>19) << 23) | (JMP << 19) | (((label[i]-count)<< 7) >>7) ; } if(strcmp(opcode, "jmpl") == 0){ if(sscanf(op_data, "%s %s", tmp_str, sub_label) == 2){ for(i=0; i127)){ printf("error---line %d\n", count); } return (1<<31)| (1<<30) | (JMPR << 18)|(ra <<11) ; } } if(strcmp(opcode, "jmprl") == 0){ if(sscanf(op_data, "%s r%d", tmp_str, &ra ) == 2){ if((ra<0) || (ra>127)){ printf("error---line %d\n", count); } return (1<<31)| (1<<30) |(127 <<23)|(JMPRL << 18)| (ra << 11) ; } } if(strcmp(opcode, "ret;") == 0){ if(sscanf(op_data, "%s", tmp_str) == 1) // printf("ret\n"); return (1<<31)| (1<<30) | (12 << 18)|(127 << 11) ; } if(strcmp(opcode, "end;") == 0){ // printf("end\n"); if(sscanf(op_data, "%s", tmp_str ) == 1) return (1<<31)| (1<<30) | (7 << 19) ; } return 0; } //整数をバイナリの文字列に直す 引数1の整数をバイナリの文字列に直したものを引数2の文字列にコピーする int encoder(int ir, char *str) { char tmp_str[33]; int i; tmp_str[32] = '\0'; for(i = 31; i >= 0; i--){ if(ir & 1){ tmp_str[i] = '1'; }else{ tmp_str[i] = '0'; } ir = ir >> 1; } strcpy(str, tmp_str); return 0; }