class Fisk::Encoding

Private Instance Methods

add_code_offset(buffer, value, size) click to toggle source
# File lib/fisk/encoding.rb, line 84
def add_code_offset buffer, value, size
  write_num buffer, value, size
end
add_data_offset(buffer, value, size) click to toggle source
# File lib/fisk/encoding.rb, line 88
def add_data_offset buffer, value, size
  write_num buffer, value, size
end
add_immediate(buffer, value, size) click to toggle source
# File lib/fisk/encoding.rb, line 80
def add_immediate buffer, value, size
  write_num buffer, value, size
end
add_modrm(buffer, mode, reg, rm, operands) click to toggle source
# File lib/fisk/encoding.rb, line 5
def add_modrm buffer, mode, reg, rm, operands
  offset_bytes = 0
  if mem = operands.find(&:memory?)
    if mem.displacement != 0
      if mem.displacement >= -0x7F - 1 && mem.displacement < 0x7F
        offset_bytes = 1
        mode |= 0x1
      else
        offset_bytes = 4
        mode |= 0x2
      end
    end
  end
  reg = reg & 0x7
  rm = rm & 0x7
  buffer.putc ((mode << 6) | (reg << 3) | rm)
  if mem && mem.displacement != 0
    1 + write_num(buffer, mem.displacement, offset_bytes)
  else
    1
  end
end
add_modrm_mem_reg(buffer, mode, reg, rm, operands) click to toggle source

Add ModRM with one mem operand and one register operand

# File lib/fisk/encoding.rb, line 29
def add_modrm_mem_reg buffer, mode, reg, rm, operands
  add_modrm_mem_reg_ buffer, mode, reg, rm, operands[0], operands[1]
end
add_modrm_mem_reg_(buffer, mode, reg, rm, mem, reg_opnd) click to toggle source
# File lib/fisk/encoding.rb, line 38
def add_modrm_mem_reg_ buffer, mode, reg, rm, mem, reg_opnd
  offset_bytes = 0

  if mem.rip?
    buffer.putc 0x5 + ((reg_opnd.value % 8) * 8)
    return 1 + write_num(buffer, mem.displacement, 4)
  end

  if mem.displacement != 0
    if mem.displacement >= -0x7F - 1 && mem.displacement < 0x7F
      offset_bytes = 1
      mode |= 0x1
    else
      offset_bytes = 4
      mode |= 0x2
    end
  end

  reg = reg & 0x7
  rm = rm & 0x7
  buffer.putc ((mode << 6) | (reg << 3) | rm)

  if mem.displacement != 0
    1 + write_num(buffer, mem.displacement, offset_bytes)
  else
    1
  end
end
add_modrm_reg_mem(buffer, mode, reg, rm, operands) click to toggle source

Add ModRM with one mem operand and one register operand

# File lib/fisk/encoding.rb, line 34
def add_modrm_reg_mem buffer, mode, reg, rm, operands
  add_modrm_mem_reg_ buffer, mode, reg, rm, operands[1], operands[0]
end
add_modrm_reg_reg(buffer, mode, reg, rm, operands) click to toggle source

Add ModRM with two register operands

# File lib/fisk/encoding.rb, line 68
def add_modrm_reg_reg buffer, mode, reg, rm, operands
  if rip = operands.find(&:rip?)
    buffer.putc 0x5
    1 + write_num(buffer, rip.displacement, 4)
  else
    reg = reg & 0x7
    rm = rm & 0x7
    buffer.putc ((mode << 6) | (reg << 3) | rm)
    1
  end
end
add_opcode(buffer, byte, addend) click to toggle source
# File lib/fisk/encoding.rb, line 104
def add_opcode buffer, byte, addend
  byte |= addend
  buffer.putc byte
  1
end
add_prefix(buffer, operands, byte, mandatory) click to toggle source
# File lib/fisk/encoding.rb, line 118
def add_prefix buffer, operands, byte, mandatory
  buffer.putc byte
  1
end
add_rex(buffer, operands, mandatory, w, r, x, b) click to toggle source
# File lib/fisk/encoding.rb, line 92
def add_rex buffer, operands, mandatory, w, r, x, b
  return 0 if mandatory == false && !operands.any?(&:extended_register?)

  rex = 0b0100
  rex = (rex << 1) | w
  rex = (rex << 1) | r
  rex = (rex << 1) | x
  rex = (rex << 1) | b
  buffer.putc rex
  1
end
write_num(buffer, num, size) click to toggle source
# File lib/fisk/encoding.rb, line 110
def write_num buffer, num, size
  size.times {
    buffer.putc(num & 0xFF)
    num >>= 8
  }
  size
end