45 lines
1.6 KiB
Ruby
45 lines
1.6 KiB
Ruby
require_relative "label"
|
|
require_relative "assembly_error"
|
|
require_relative "arm_machine"
|
|
|
|
module Asm
|
|
|
|
# Not surprisingly represents an cpu instruction.
|
|
# This is an abstract base class, with derived classes
|
|
# Logic / Move / Compare / Stack / Memory (see there)
|
|
#
|
|
# Opcode is a (<= three) letter accronym (same as in assembly code). Though in arm, suffixes can
|
|
# make the opcode longer, we chop those off in the constructor
|
|
# Argurments are registers or labels or string/num Literals
|
|
|
|
class Instruction < Code
|
|
include ArmMachine
|
|
|
|
COND_POSTFIXES = Regexp.union( COND_CODES.keys.collect{|k|k.to_s} ).source
|
|
|
|
def initialize(opcode , condition_code , update_status , args)
|
|
@update_status_flag = update_status
|
|
@condition_code = condition_code.to_sym
|
|
@opcode = opcode
|
|
@args = args
|
|
@operand = 0
|
|
end
|
|
|
|
attr_reader :opcode, :args
|
|
# Many arm instructions may be conditional, where the default condition is always (al)
|
|
# ArmMachine::COND_CODES names them, and this attribute reflects it
|
|
attr_reader :condition_code
|
|
attr_reader :operand
|
|
|
|
# Logic instructions may be executed with or without affecting the status register
|
|
# Only when an instruction affects the status is a subsequent compare instruction effective
|
|
# But to make the conditional execution (see cond) work for more than one instruction, one needs to
|
|
# be able to execute without changing the status
|
|
attr_reader :update_status_flag
|
|
|
|
# arm intrucioons are pretty sensible, and always 4 bytes (thumb not supported)
|
|
def length
|
|
4
|
|
end
|
|
end
|
|
end |