rubyx/lib/asm/assembler.rb

44 lines
980 B
Ruby

module Asm
ERRSTR_NUMERIC_TOO_LARGE = 'cannot fit numeric literal argument in operand'
ERRSTR_INVALID_ARG = 'invalid operand argument'
class Assembler
def initialize
@objects = []
@label_objects = []
@label_callbacks = []
@relocations = []
end
attr_reader :relocations, :objects
def add_object(obj)
@objects << obj
end
def add_relocation(*args)
@relocations << Asm::Relocation.new(*args)
end
def register_label_callback(label, io_pos, &block)
@label_callbacks << [label, io_pos, block]
end
def assemble(io)
@objects.each do |obj|
obj.assemble io, self
end
@relocations.delete_if do |reloc|
io.seek reloc.position
if (reloc.label.extern?)
reloc.handler.call(io, io.tell, reloc.type)
else
reloc.handler.call(io, reloc.label.address, reloc.type)
end
not reloc.label.extern?
end
end
end
end