keystone

Bindings to the Keystone Assembler.


Keywords
binding, keystone, asm, assembler, x86, arm, assembly, nim
License
MIT
Install
nimble install keystone

Documentation

Keystone.nim

Nim bindings for the Keystone assembler.

# Create engine safely
let engine = newX86Engine()

defer:
  engine.close()

# Emit to tuple
let enc = engine.assemble("add eax, eax ; ret")

assert enc.buf == @[ 0x01, 0xC0, 0xC3 ]
assert enc.size == 3
assert enc.statementsCount == 2

# Emit using dot operator
let enc = engine.add("eax", "eax")

# Emit to buffer now
var buf = newSeqOfCap[byte](0)

engine.assemble("add eax, eax", buf)
engine.ret(buf)

assert buf == @[ 0x01, 0xC0, 0xC3 ]

# No silent errors
try:
  engine.assemble("add 42")
expect KeystoneError:
  echo "Error encountered: ", getCurrentExceptionMsg()

Thanks to macros, emitting any assembly code is very easy.

let engine = newX86Engine()

# To a new buffer
let buf = assembly engine:
  add eax, eax
  ret

# To an existing buffer
assembly engine, buf:
  add eax, eax
  ret