Class: Indis::ARM::Instruction

Inherits:
Entity
  • Object
show all
Defined in:
lib/indis-arm/instruction.rb

Overview

ARM::Instruction is a code entity that represens an ARM instruction

Direct Known Subclasses

UnknownInstruction

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(vmaddr, bytes) ⇒ Instruction

Returns a new instance of Instruction.

Parameters:

  • vmaddr (Fixnum)

    virtual address

  • bytes (Fixnum)

    bytes that represent an instruction



36
37
38
39
40
41
42
# File 'lib/indis-arm/instruction.rb', line 36

def initialize(vmaddr, bytes)
  super vmaddr
  @size = 4
  m = self.class.kmap(bytes)
  self.class.process_automap.each { |p| self.instance_exec(m, &p) } if self.class.process_automap
  self.instance_exec(m, &self.class.process_block) if self.class.process_block
end

Class Attribute Details

.encodingString (readonly)

Returns instruction encoding per ARMARM.

Returns:

  • (String)

    instruction encoding per ARMARM



64
65
66
# File 'lib/indis-arm/instruction.rb', line 64

def encoding
  @encoding
end

.formatsHash (readonly)

Returns output formats.

Returns:

  • (Hash)

    output formats



68
69
70
# File 'lib/indis-arm/instruction.rb', line 68

def formats
  @formats
end

.nameString (readonly)

Returns instruction name.

Returns:

  • (String)

    instruction name



62
63
64
# File 'lib/indis-arm/instruction.rb', line 62

def name
  @name
end

.process_automapArray (readonly)

Returns a list of automapping procs.

Returns:

  • (Array)

    a list of automapping procs



70
71
72
# File 'lib/indis-arm/instruction.rb', line 70

def process_automap
  @process_automap
end

.process_blockProc (readonly)

Returns data-processing proc.

Returns:

  • (Proc)

    data-processing proc



66
67
68
# File 'lib/indis-arm/instruction.rb', line 66

def process_block
  @process_block
end

Instance Attribute Details

#value_formatSymbol

Instructions can have different value formats. In such a case, value_format specifies the format to use

Returns:

  • (Symbol)


32
33
34
# File 'lib/indis-arm/instruction.rb', line 32

def value_format
  @value_format
end

Class Method Details

.bits_maskString

Returns instruction mask bits.

Returns:

  • (String)

    instruction mask bits



73
74
75
# File 'lib/indis-arm/instruction.rb', line 73

def bits_mask
  @bits.gsub('0', '1').gsub(/[^1]/, '0').to_i(2)
end

.bits_matchString

Returns instruction matching bits.

Returns:

  • (String)

    instruction matching bits



78
79
80
# File 'lib/indis-arm/instruction.rb', line 78

def bits_match
  @bits.gsub(/[^01]/, '0').to_i(2)
end

.kmap(v) ⇒ OpenStruct

Returns a map of known fields to instruction value.

Returns:

  • (OpenStruct)

    a map of known fields to instruction value



83
84
85
86
87
88
89
90
91
# File 'lib/indis-arm/instruction.rb', line 83

def kmap(v)
  return OpenStruct.new unless @kmap
  
  map = @kmap.inject({}) do |map, (m, o, n)|
    map[n] = (v & m) >> o
    map
  end
  OpenStruct.new(map)
end

Instance Method Details

#hIndis::ARM::InstructionHelper

Returns helper that provides common methods for DSL.

Returns:



45
46
47
# File 'lib/indis-arm/instruction.rb', line 45

def h
  InstructionHelper
end

#to_sObject



49
50
51
52
53
54
55
56
57
58
59
# File 'lib/indis-arm/instruction.rb', line 49

def to_s
  s = self.instance_eval "\"#{self.class.formats[:operator]}\""
  if @value_format
    fmt = self.class.formats[@value_format]
    v = self.instance_eval "\"#{fmt}\""
  else
    v = self.instance_eval "\"#{self.class.formats[:value]}\"" if self.class.formats[:value]
  end
  s = "#{s}\t#{v}" if v
  s
end