# 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)