Mercurial > hg > Members > nobuyasu > SampleSource
diff Bison-Flex/Compiler-StackBase/vm.cpp @ 0:db40c85cad7a default tip
upload sample source
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 09 May 2011 03:11:59 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Bison-Flex/Compiler-StackBase/vm.cpp Mon May 09 03:11:59 2011 +0900 @@ -0,0 +1,43 @@ +// +// 仮想CPU +// +// switch-caseでの実装例 +// +// (c)2008 Chihiro.SAKAMOTO HyperWorks +// +#include <exception> +#include "vm.h" + +// 実行 +int vm::vcpu::run() +{ + command_ = data_.command_; // プログラム格納位置 + text_buffer_ = data_.text_buffer_; // テキストデータ格納位置 + command_size_ = data_.command_size_; // プログラムの大きさ + text_size_ = data_.text_size_; // データの大きさ + + global_value.resize(data_.value_size_); // 外部変数テーブル確保 + command_ptr_ = command_ + data_.entry_point_; // プログラムカウンター初期化 + + // mainをcall + push(0); // mainへの引数カウントをpush + push(0); // stack_baseの初期値をpush + push(0); // プログラム終了位置をpush + stack_base = stack.size(); // スタック参照位置初期化 + + try { + int op; + while ((op = *command_ptr_++) != VM_HALT) { // Haltするまでループ + switch (op) { + #define VM_SWITCHTABLE + #include "vm_code.h" + #undef VM_SWITCHTABLE + } + } + } + catch (const std::exception &e) { + std::cerr << "例外発生(" << e.what() << ")" << std::endl; + return -1; + } + return top().i_; // main関数戻り値 +}