今回はオペコード0x04にあたるADD AL, Imm8を実装した。その追加に伴い以下のファイルを作成した
./vm/instruction/add/AddALImm8.rb
中身は
require "./vm/register/RegisterIndex.rb" include RegisterIndex class AddALImm8 def execute(vm) al = vm.getRegister8(EAX) al += vm.getCode(1) vm.setRegister8(EAX, al) vm.addEIP(2) end end
単純に足し算をしてるだけ。現時点ではまだフラグレジスタの更新を行っていない。またInstructionMapのコンストラクタに以下の行を追加
@instructions[0x04] = AddALImm8.new()
あとrequireも忘れずに
require "./vm/instruction/add/AddALImm8.rb"
8/31 21:22 追加
更にVM.rbにgetRegister8を作る
def getRegister8(index) if index < 4 then return getRegister8Low(index) else return getRegister8High(index - 4) end end def getRegister8Low(index) return @registers[index] & 0xFF end def getRegister8High(index) return (@registers[index] >> 8) & 0xFF end
そしてemulator.rbでは命令の実行を無限ループ内に入れた。例外が発生すると停止する
#! ruby -Ks require "./vm/VM.rb" if ARGV.size == 0 then puts "ファイル名を指定してください" exit() end vm = VM.new(1 * 1024 * 1024) vm.load(ARGV[0]) loop do vm.execute() end
次はジャンプ命令とフラグレジスタの更新を行いたい