contributed by < kevin552216
>
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
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
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
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
想法: 再組譯中,加入對branch、jmp 指令之判斷,將label 置換成#(line number)