Try   HackMD

2017q3 Homework3(simulator)

contributed by < kevin552216 >

Instruction set

vm.c

void vm_run(vm_env *env)
{
    BEGIN_OPCODES;

    OP(ADD) : VM_CALL_HANDLER();
    OP(SUB) : VM_CALL_HANDLER();
    OP(MUL) : VM_CALL_HANDLER();
    OP(DIV) : VM_CALL_HANDLER();
    OP(MOD) : VM_CALL_HANDLER();
    OP(AND) : VM_CALL_HANDLER();
    OP(OR) : VM_CALL_HANDLER();
    OP(NOT) : VM_CALL_HANDLER();
    OP(XOR) : VM_CALL_HANDLER();
    OP(LSL) : VM_CALL_HANDLER();
    OP(LSR) : VM_CALL_HANDLER();
    OP(ASR) : VM_CALL_HANDLER();
    OP(PRINT) : VM_CALL_HANDLER();
    OP(JLT) : VM_JLT();
    OP(JLE) : VM_JLE();
    OP(JZ) : VM_JZ();
    OP(JGE) : VM_JGE();
    OP(JGT) : VM_JGT();
    OP(JNZ) : VM_JNZ();
    OP(JMP) : GOTO(OPCODE.op1.value.id);
    OP(CALL) : VM_CALL(OPCODE.op1.value.id);
    OP(RET) : VM_RET();

    OP(HALT) : goto terminate;

    END_OPCODES;
terminate:

}

opecode.def

return;name,  opcode, has_op1, has_op2, has_result
halt,       0,       0,       0,          0
add,        1,       1,       1,          1
sub,        2,       1,       1,          1
mul,       11,       1,       1,          1
div,       12,       1,       1,          1
mod,       13,       1,       1,          1
and,       16,       1,       1,          1
or,        17,       1,       1,          1
not,       18,       1,       1,          0
xor,       19,       1,       1,          1
lsl,       20,       1,       1,          1
lsr,       21,       1,       1,          1
asr,       22,       1,       1,          1
print,      3,       1,       0,          0
jlt,        4,       1,       1,          0
jle,        5,       1,       1,          0
jz,         6,       1,       1,          0
jge,        7,       1,       1,          0
jgt,        8,       1,       1,          0
jnz,        9,       1,       1,          0
jmp,       10,       1,       0,          0
call,      14,       1,       0,          0
ret,       15,       0,       0,          0


instruction 使用參考

branch 是 jump 到 # 行數,並執行下一行指令

mul.s

; Test all possible combinations of multipliacation instructions  
mul $3 $2 #1        ; multiply: (3)*(2)
print #1
mul $3 $-2 #2       ; multiply: (3)*(-2)
print #2
mul $-2 $3 #3       ; multiply: (-2)*(3)
print #3
mul $-2 $-2 #4      ; multiply: (-2)*(-2)
print #4
mul $1 #1 #5        ; multiply: (1)*(6)
print #5
mul $-3 #1 #6       ; multiply: (-3)*(6)
print #6
mul #2 $-3 #7       ; multiply: (-6)*(-3)
print #7
mul #2 #3 #8        ; multiply: (-6)*(-6)
print #8
mul #3 #4 #9        ; multiply: (-6)*(4)
print #9
mul #8 #9 #10       ; multiply: (36)*(-24)
print #10

可以知道$為value, #為Reg

Fibonacci 數列

Iterative

print "fib-iterative start"
add $10 $0 #1
add $0 $0 #2
add $1 $0 #3
add #2 #3 #4
add #3 $0 #2
add #4 $0 #3
sub #1 $1 #1
print #2
jnz #1 #4
----------------------------------------------------
result

fib-iterative start
1
1
2
3
5
8
13
21
34
55

Recursive

add $5 $0 #1
add $0 $0 #2
add $1 $0 #3
call #6
jnz #1 #3
halt
add #2 $0 #4
add #3 $0 #5
add #4 #5 #6
add #5 $0 #2
add #6 $0 #3
sub #1 $1 #1
print #2
jz #1 #5
ret
print "out of program"
----------------------------------------
Result
1
1
2
3
5

發現ret,會跳到call 下面一行執行,所以在下一段增加branch

加入 label 功能

想法: 再組譯中,加入對branch、jmp 指令之判斷,將label 置換成#(line number)