diff --git a/emul_inst_decipher.c b/emul_inst_decipher.c index 7a9b78c..c51193b 100644 --- a/emul_inst_decipher.c +++ b/emul_inst_decipher.c @@ -28,6 +28,9 @@ { BEQ , "beq" }, { BNE , "bne" }, { J , "j" }, + { JAL , "jal" }, + { JALR, "jalr" }, + { JR , "jr" }, { LW , "lw" }, { SW , "sw" }, { MOVE, "move" } @@ -108,6 +111,7 @@ } void emul_inst_dec_set_pc(int pc) { + emul_out_std_debug("Setting PC = %d\n", pc); program_line_current = pc; } @@ -122,8 +126,8 @@ } void emul_inst_dec_reset_pc() { + emul_inst_dec_set_pc(0); emul_reg_set(Spc, 0); - emul_inst_dec_update_pc(); } /* ファイルからデータをロードする,ファイルは自動的にクローズされる @@ -141,14 +145,13 @@ } emul_out_std_debug("Now loading file %s...\n", filename); - program_line_current = 0; line = 0; - while ( fgets(program[line], LOAD_LINE_WIDTH_MAX, fp) != NULL ) { + while ( fgets(program[program_line_current+line], LOAD_LINE_WIDTH_MAX, fp) != NULL ) { emul_out_std_debug("Now loading file line %d\n", line); - emul_out_std_debug(">>%s\n", program[line]); + emul_out_std_debug("[%d]>>%s\n", program_line_current+line, program[program_line_current+line]); line++; } - program_line_max = line; + program_line_max += line; fclose(fp); emul_out_std_debug("Finish loading! line=%d\n", program_line_max); return 1; diff --git a/emul_inst_exec.c b/emul_inst_exec.c index 5b12da6..ea75932 100644 --- a/emul_inst_exec.c +++ b/emul_inst_exec.c @@ -26,6 +26,7 @@ // トークンを取得 if ( emul_inst_dec_get_token(token) == 0 ) { emul_out_std_err("Non exist next token\n"); + emul_out_std_err("Loading Label Finish!\n"); // 次のトークンが見つからない場合終了, pcのアドレスを初期化 emul_inst_dec_reset_pc(); return ; @@ -143,6 +144,25 @@ emul_out_std_debug("Execute: j label[%s];\n", label); } +void emul_inst_exec_jal(char *label) { + emul_out_std_debug(" : jal label[%s] $pc=%d;\n", label, emul_reg_get(Spc) ); + emul_reg_set( Sra, emul_reg_get(Spc) ); + emul_reg_set( Spc, emul_label_resolve(label) ); + emul_out_std_debug("Execute : jal label[%s] $ra=%d;\n", label, emul_reg_get(Sra) ); +} + +void emul_inst_exec_jalr(int r0, int r1) { + emul_out_std_debug(" : jalr r0[%d] r1[%d];\n", emul_reg_get(r0), emul_reg_get(r1)); + emul_reg_set( r1, emul_reg_get(Spc) ); + emul_reg_set( Spc, emul_reg_get(r0) ); + emul_out_std_debug("Execute : jalr r0[%d] r1[%d];\n", emul_reg_get(r0), emul_reg_get(r1)); +} +void emul_inst_exec_jr(int r0) { + emul_out_std_debug(" : jr r0[%d];\n", emul_reg_get(r0)); + emul_reg_set( Spc, emul_reg_get(r0) ); + emul_out_std_debug("Execute : jr r0[%d];\n", emul_reg_get(r0)); +} + void emul_inst_exec_beq(int r0, int r1, char *label) { emul_out_std_debug(" : beq r0[%d] r1[%d] label[%d];\n", emul_reg_get(r0), emul_reg_get(r1), label); if (emul_reg_get(r0) == emul_reg_get(r1)) { @@ -163,16 +183,16 @@ emul_out_std_debug("Execute: bne r0[%d] r1[%d] label[%s]>>PC(%d);\n", emul_reg_get(r0), emul_reg_get(r1), label, getted_address); } -void emul_inst_exec_lw(int r0, int address) { - emul_out_std_debug(" : lw r0[%d] address[%d];\n", emul_reg_get(r0), address); - emul_reg_set(r0, emul_mem_get_word(address)); - emul_out_std_debug("Execute: lw r0[%d] address[%d];\n", emul_reg_get(r0), address); +void emul_inst_exec_lw(int r0, int address, int r1) { + emul_out_std_debug(" : lw r0[%d] address[%d] offset[%d];\n", emul_reg_get(r0), address, emul_reg_get(r1)); + emul_reg_set(r0, emul_mem_get_word(address+emul_reg_get(r1))); + emul_out_std_debug("Execute: lw r0[%d] address[%d] offset[%d];\n", emul_reg_get(r0), address, emul_reg_get(r1)); } -void emul_inst_exec_sw(int r0, int address) { - emul_out_std_debug(" : sw r0[%d] address[%d];\n", emul_reg_get(r0), address); - emul_mem_set_word(address, emul_reg_get(r0)); - emul_out_std_debug("Execute: sw r0[%d] address[%d];\n", emul_reg_get(r0), address); +void emul_inst_exec_sw(int r0, int address, int r1) { + emul_out_std_debug(" : sw r0[%d] address[%d] offset[%d];\n", emul_reg_get(r0), address, emul_reg_get(r1)); + emul_mem_set_word(address+emul_reg_get(r1), emul_reg_get(r0)); + emul_out_std_debug("Execute: sw r0[%d] address[%d] offset[%d];\n", emul_reg_get(r0), address, emul_reg_get(r1)); } /* オペコード解読処理群 - END */ @@ -481,15 +501,30 @@ emul_inst_dec_get_token(label); emul_inst_exec_j(label); break; + case JAL : + emul_inst_dec_get_token(label); + emul_inst_exec_jal(label); + break; + case JALR: + temp_op[0] = emul_inst_dec_get_next_operand(); + temp_op[1] = emul_inst_dec_get_next_operand(); + emul_inst_exec_jalr(temp_op[0], temp_op[1]); + break; + case JR : + temp_op[0] = emul_inst_dec_get_next_operand(); + emul_inst_exec_jr(temp_op[0]); + break; case LW : temp_op[0] = emul_inst_dec_get_next_operand(); temp_op[1] = emul_inst_dec_get_next_immediate(); - emul_inst_exec_lw(temp_op[0], temp_op[1]); + temp_op[2] = emul_inst_dec_get_next_operand(); + emul_inst_exec_lw(temp_op[0], temp_op[1], temp_op[2]); break; case SW : temp_op[0] = emul_inst_dec_get_next_operand(); temp_op[1] = emul_inst_dec_get_next_immediate(); - emul_inst_exec_sw(temp_op[0], temp_op[1]); + temp_op[2] = emul_inst_dec_get_next_operand(); + emul_inst_exec_sw(temp_op[0], temp_op[1], temp_op[2]); break; //case MOVE: //break; diff --git a/emul_repl.c b/emul_repl.c index 5db784e..2a40397 100644 --- a/emul_repl.c +++ b/emul_repl.c @@ -53,7 +53,6 @@ wclear(win); refresh(); - while (1) { emul_repl_readline(input); emul_inst_exec_loadline(input); diff --git a/test_asm/func.asm b/test_asm/func.asm new file mode 100644 index 0000000..3171c7b --- /dev/null +++ b/test_asm/func.asm @@ -0,0 +1,7 @@ +:DUMP DEBUG0 +:RUN + +:label strlen +subi $sp $sp 4 +sw $s0 0 + diff --git a/test_asm/test.asm b/test_asm/test.asm index 107f478..689dd5b 100644 --- a/test_asm/test.asm +++ b/test_asm/test.asm @@ -19,3 +19,4 @@ j LOOP :LABEL EXIT +:INPUT $t0 diff --git a/test_asm/test_sw_lw.asm b/test_asm/test_sw_lw.asm index b6e49fa..cc29f31 100644 --- a/test_asm/test_sw_lw.asm +++ b/test_asm/test_sw_lw.asm @@ -1,4 +1,10 @@ -addi $t0 $s0 1 -sw $t0 0 -lw $t1 0 +addi $t0 $zero 1 +:run +sw $t0 0 $zero +:regcat $t0 +:regcat $t1 +lw $t1 0 $zero +:regcat $t0 +:regcat $t1 sub $s4 $t0 $s3 +:INPUT