小さいVMで mod 2 を実装してみた
1から20までの数の mod 2 を出力するプログラムを書いてみた。命令セットが加算しかないので、面倒なのです。
int main(){ TiviAssembler tasm; tasm.pushi(0) // push 0 to stack .ref(0) // load from stack to VAL .label("loop") .addi(1) // add 1 to VAL .say() // print current number .push() // remember current number // function call: mod2 .push() // arg for mod2 .call("mod2") .say() // print returned value .pop() // restore current value .compi(20) // compare current value with 20 .jmp_if("loop_end") .jmp("loop") .label("loop_end") .quit() // function mod2 .label("mod2") .pop() // load argument to VAL .label("mod2_itr") // main loop .compi(0) .jmp_if("mod2_end") .compi(1) .jmp_if("mod2_end") .addi(-2) // add -2 to VAL .jmp("mod2_itr") .label("mod2_end") .ret() ; TiviVM vm(tasm); cout << "result: " << vm.run_program() << endl; return 0; }
コメントで質問があったので追記。TracのURLのままではsvnからチェックアウトできないので、チェックアウトしたい人は以下のURLを使ってくださいまし。