マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

簡単なADD命令追加 #7

今回はオペコード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

次はジャンプ命令とフラグレジスタの更新を行いたい