diff --git a/run.c b/run.c
new file mode 100644
index 0000000000000000000000000000000000000000..ce0e9e954eb61871a727956b34c6d4149e01c72b
--- /dev/null
+++ b/run.c
@@ -0,0 +1,199 @@
+/***************************************************************/
+/*                                                             */
+/*   MIPS-32 Instruction Level Simulator                       */
+/*                                                             */
+/*   SCE212 Ajou University                                    */
+/*   run.c                                                     */
+/*   Adapted from CS311@KAIST                                  */
+/*                                                             */
+/***************************************************************/
+
+#include <stdio.h>
+
+#include "util.h"
+#include "run.h"
+
+/***************************************************************/
+/*                                                             */
+/* Procedure: get_inst_info                                    */
+/*                                                             */
+/* Purpose: Read insturction information                       */
+/*                                                             */
+/***************************************************************/
+instruction* get_inst_info(uint32_t pc)
+{
+    return &INST_INFO[(pc - MEM_TEXT_START) >> 2];
+}
+
+/***************************************************************/
+/*                                                             */
+/* Procedure: process_instruction                              */
+/*                                                             */
+/* Purpose: Process one instrction                             */
+/*                                                             */
+/***************************************************************/
+void process_instruction()
+{
+	/** Implement this function */
+    if(INST_INFO[INSTRUCTION_COUNT].value!=1)
+    {
+        RUN_BIT = 0;
+        return;
+    }
+    switch(INST_INFO[INSTRUCTION_COUNT].opcode)
+    {
+        case 0:
+            if(INST_INFO[INSTRUCTION_COUNT].func_code==33)
+            {
+                CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.r.rd] 
+                = CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs] + CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt];
+                CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+                break;
+            }
+            if(INST_INFO[INSTRUCTION_COUNT].func_code==36)
+            {
+                CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.r.rd] 
+                = CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs] & CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt];
+                CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+                break;
+            }
+            if(INST_INFO[INSTRUCTION_COUNT].func_code==39)
+            {
+                CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.r.rd] 
+                = ~(CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs] | CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt]);
+                CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+                break;                
+            }
+            if(INST_INFO[INSTRUCTION_COUNT].func_code==37)
+            {
+                CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.r.rd] 
+                = (CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs] | CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt]);
+                CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+                break;   
+            }
+            if(INST_INFO[INSTRUCTION_COUNT].func_code==43)
+            {
+                if(CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs]<CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt])
+                {
+                    CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.r.rd]=1;
+                }
+                else
+                {
+                    CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.r.rd]=0;
+                }
+                CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+                break;
+            }
+            if(INST_INFO[INSTRUCTION_COUNT].func_code==0)
+            {
+                CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.r.rd]
+                = CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt] << INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.r.shamt;
+                CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+                break;
+            }
+            if(INST_INFO[INSTRUCTION_COUNT].func_code==2)
+            {
+                CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.r.rd]
+                = CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt] >> INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.r.shamt;
+                CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+                break;
+            }
+            if(INST_INFO[INSTRUCTION_COUNT].func_code==35)
+            {
+                CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.r.rd] 
+                = CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs] - CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt];
+                CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+                break;
+            }
+            if(INST_INFO[INSTRUCTION_COUNT].func_code==8) //need change
+            {
+                INSTRUCTION_COUNT 
+                = (CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs]-MEM_TEXT_START-4)/4;
+                CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+                break;
+            }
+
+        case 9:
+            CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt]
+            = CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs] + INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.imm;
+            CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+            break;
+
+        case 12:
+            CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt]
+            = CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs] & INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.imm;
+            CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+            break;
+
+        case 15:
+            CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt]
+            = INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.imm<<16;
+            CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+            break;
+
+        case 13:
+            CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt]
+            = CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs] | INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.imm;
+            CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+            break;
+
+        case 11:
+            if(CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs]<INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.imm)
+            {
+                CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt]=1;
+            }
+            else
+            {
+                CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt]=0;
+            }
+            CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+            break;
+
+        case 35:
+            CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt]
+            = mem_read_32(CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs]+INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.imm);
+            CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+            break;
+
+        case 43:
+            mem_write_32(CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs]
+            +INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.imm,CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt]);
+            CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+            break;
+
+        case 4:
+            if(CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs]==CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt])
+            {
+                INSTRUCTION_COUNT = INSTRUCTION_COUNT + INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.imm;
+                CURRENT_STATE.PC = CURRENT_STATE.PC + INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.imm*4;
+            }
+            else
+            {
+                CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+            }
+            break;
+
+        case 5:
+            if(CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rs]!=CURRENT_STATE.REGS[INST_INFO[INSTRUCTION_COUNT].r_t.r_i.rt])
+            {
+                INSTRUCTION_COUNT = INSTRUCTION_COUNT + INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.imm;
+                CURRENT_STATE.PC = CURRENT_STATE.PC + INST_INFO[INSTRUCTION_COUNT].r_t.r_i.r_i.imm*4;    
+            }
+            else
+            {
+                CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4+4;
+            }
+            break;
+
+        case 2:
+            CURRENT_STATE.PC = INST_INFO[INSTRUCTION_COUNT].r_t.target + 4;
+            INSTRUCTION_COUNT = (INST_INFO[INSTRUCTION_COUNT].r_t.target*4 - MEM_TEXT_START)/4;
+            break;
+
+        case 3:
+            CURRENT_STATE.REGS[31] = (MEM_TEXT_START + INSTRUCTION_COUNT*4+8);
+            CURRENT_STATE.PC = MEM_TEXT_START + INSTRUCTION_COUNT*4;
+            INSTRUCTION_COUNT = (INST_INFO[INSTRUCTION_COUNT].r_t.target*4 - MEM_TEXT_START)/4-1;
+            break;
+    }
+}