No description
Find a file
2020-11-23 16:32:38 +01:00
.vscode Initial commit. 2018-04-09 23:36:24 +02:00
src remove {.pure.} pragma from Mode 2020-11-23 16:32:38 +01:00
tests fixes for later Nim verison 2020-11-23 16:32:38 +01:00
.gitignore Initial commit. 2018-04-09 23:36:24 +02:00
keystone.nimble requires Nim verison 1.2.8 instead of 1.4.0 2020-11-23 16:32:38 +01:00
README.md Added emit macro. 2018-04-10 01:34:06 +02:00

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