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