ts-capstone
Version:
This module provides bindings for the Capstone disassembly framework.
202 lines (198 loc) • 4.39 kB
text/typescript
import { expect, test, afterAll } from 'bun:test';
import CS, { X86, type cs_insn } from '../capstone';
const cs = new CS.CAPSTONE(CS.ARCH_X86, CS.MODE_16);
const insns: cs_insn[] = [
{
id: 332,
address: 4096,
size: 3,
mnemonic: 'lea',
op_str: 'cx, [si + 0x32]',
bytes: new Uint8Array([141, 76, 50]),
detail: {
regs_write: [],
groups: [],
regs_read: [],
regs_read_count: 0,
regs_write_count: 0,
groups_count: 0,
writeback: false,
x86: {
prefix: [0, 0, 0, 0],
opcode: [141, 0, 0, 0],
rex: 0,
addr_size: 2,
modrm: 76,
sib: 0,
disp: 50,
sib_index: 0,
sib_scale: 0,
sib_base: 0,
xop_cc: 0,
sse_cc: 0,
avx_cc: 0,
avx_sae: false,
avx_rm: 0,
eflags: 0,
fpu_flags: 0,
op_count: 2,
operands: [
{
size: 2,
access: 2,
avx_bcast: 0,
avx_zero_opmask: false,
type: 1,
reg: 12,
},
{
size: 2,
access: 1,
avx_bcast: 0,
avx_zero_opmask: false,
type: 3,
mem: { segment: 0, base: 45, index: 0, scale: 1, disp: 50 },
},
],
encoding: {
modrm_offset: 1,
disp_offset: 2,
disp_size: 1,
imm_offset: 0,
imm_size: 0,
},
},
},
},
{
id: 512,
address: 4099,
size: 2,
mnemonic: 'or',
op_str: 'byte ptr [bx + di], al',
bytes: new Uint8Array([8, 1]),
detail: {
regs_write: [25],
groups: [],
regs_read: [],
regs_read_count: 0,
regs_write_count: 1,
groups_count: 0,
writeback: false,
x86: {
prefix: [0, 0, 0, 0],
opcode: [8, 0, 0, 0],
rex: 0,
addr_size: 2,
modrm: 1,
sib: 0,
disp: 0,
sib_index: 0,
sib_scale: 0,
sib_base: 0,
xop_cc: 0,
sse_cc: 0,
avx_cc: 0,
avx_sae: false,
avx_rm: 0,
eflags: 0,
fpu_flags: 6291484,
op_count: 2,
operands: [
{
size: 1,
access: 3,
avx_bcast: 0,
avx_zero_opmask: false,
type: 3,
mem: { segment: 0, base: 8, index: 14, scale: 1, disp: 0 },
},
{
size: 1,
access: 1,
avx_bcast: 0,
avx_zero_opmask: false,
type: 1,
reg: 2,
},
],
encoding: {
modrm_offset: 1,
disp_offset: 0,
disp_size: 0,
imm_offset: 0,
imm_size: 0,
},
},
},
},
{
id: 15,
address: 4101,
size: 4,
mnemonic: 'fadd',
op_str: 'dword ptr [bx + di + 0x34c6]',
bytes: new Uint8Array([216, 129, 198, 52]),
detail: {
regs_write: [31],
groups: [169],
regs_read: [],
regs_read_count: 0,
regs_write_count: 1,
groups_count: 1,
writeback: false,
x86: {
prefix: [0, 0, 0, 0],
opcode: [216, 0, 0, 0],
rex: 0,
addr_size: 2,
modrm: 129,
sib: 0,
disp: 13510,
sib_index: 0,
sib_scale: 0,
sib_base: 0,
xop_cc: 0,
sse_cc: 0,
avx_cc: 0,
avx_sae: false,
avx_rm: 0,
eflags: 0,
fpu_flags: 53250,
op_count: 1,
operands: [
{
size: 4,
access: 1,
avx_bcast: 0,
avx_zero_opmask: false,
type: 3,
mem: { segment: 0, base: 8, index: 14, scale: 1, disp: 13510 },
},
],
encoding: {
modrm_offset: 1,
disp_offset: 2,
disp_size: 2,
imm_offset: 0,
imm_size: 0,
},
},
},
},
];
test('X86.REL_ADDR', () => {
const addr_4149 = X86.REL_ADDR(insns[0]);
const addr_4101 = X86.REL_ADDR(insns[1]);
expect(addr_4149).toBe(4149);
expect(addr_4101).toBe(4101);
});
test('CS.INSN_OFFSET', () => {
const idx_1 = CS.INSN_OFFSET(insns, 1);
const idx_2 = CS.INSN_OFFSET(insns, 2);
expect(idx_1).toBe(0);
expect(idx_2).toBe(3);
});
afterAll(() => {
cs.close();
});