rubyx/lib/register/instruction.rb

52 lines
1.8 KiB
Ruby
Raw Normal View History

2014-08-22 16:40:09 +02:00
module Register
2014-05-03 14:13:44 +02:00
# the register machine has at least 8 registers, named r0-r5 , :lr and :pc (for historical reasons)
# we can load and store their contents and
# access (get/set) memory at a constant offset from a register
2015-05-24 19:00:11 +02:00
# while the vm works with objects, the register machine has registers,
# but we keep the names for better understanding, r4/5 are temporary/scratch
# there is no direct memory access, only through registers
# constants can/must be loaded into registers before use
class Instruction
2015-07-18 10:21:49 +02:00
def initialize source
@source = source
end
attr_reader :block , :source
2014-06-14 09:59:25 +02:00
# returns an array of registers (RegisterReferences) that this instruction uses.
2015-05-24 19:00:11 +02:00
# ie for r1 = r2 + r3
# which in assembler is add r1 , r2 , r3
# it would return [r2,r3]
# for pushes the list may be longer, whereas for a jump empty
def uses
raise "abstract called for #{self.class}"
end
2014-06-14 09:59:25 +02:00
# returns an array of registers (RegisterReferences) that this instruction assigns to.
2015-05-24 19:00:11 +02:00
# ie for r1 = r2 + r3
# which in assembler is add r1 , r2 , r3
# it would return [r1]
# for most instruction this is one, but comparisons and jumps 0 , and pop's as long as 16
def assigns
raise "abstract called for #{self.class}"
end
# wrap symbols into regsiter reference if needed
def wrap_register reg
return reg if reg.is_a? RegisterReference
RegisterReference.new(reg)
end
2014-05-02 07:02:25 +02:00
end
2015-05-24 19:00:11 +02:00
2014-05-02 07:02:25 +02:00
end
require_relative "instructions/set_slot"
require_relative "instructions/get_slot"
require_relative "instructions/load_constant"
2015-06-22 21:48:42 +02:00
require_relative "instructions/syscall"
2014-10-04 11:52:47 +02:00
require_relative "instructions/function_call"
require_relative "instructions/function_return"
require_relative "instructions/save_return"
require_relative "instructions/register_transfer"
require_relative "instructions/branch"