ts-capstone
Version:
This module provides bindings for the Capstone disassembly framework.
74 lines (69 loc) • 2.06 kB
text/typescript
import CS from '../capstone';
import { expect, test } from 'bun:test';
test('disasm ARM64', () => {
// prettier-ignore
const buffer = new Uint8Array([
0x00, 0x00, 0x80, 0xd2, // 0x1000: mov x0, #0
0xfd, 0xfb, 0xff, 0x17, // 0x1004: b #0xfffffffffffffff8
0x88, 0x02, 0x40, 0xb9, // 0x1008: ldr w8, [x20]
0x20, 0x00, 0x02, 0x8b, // 0x100c: add x0, x1, x2
0x20, 0x00, 0x00, 0xf9, // 0x1010: str x0, [x1]
0x20, 0x00, 0x42, 0xf8, // 0x1014: ldur x0, [x1, #0x20]
0x20, 0x88, 0x82, 0x4f, // 0x1018: mul v0.4s, v1.4s, v2.s[2]
]);
const disassembler = new CS.CAPSTONE(CS.ARCH_ARM64, CS.MODE_ARM);
const insns = disassembler.disasm(buffer, 0x1000);
const expectedInstructions = [
{
address: 0x1000,
mnemonic: 'mov',
op_str: 'x0, #0',
bytes: new Uint8Array([0x00, 0x00, 0x80, 0xd2]),
},
{
address: 0x1004,
mnemonic: 'b',
op_str: '#0xfffffffffffffff8',
bytes: new Uint8Array([0xfd, 0xfb, 0xff, 0x17]),
},
{
address: 0x1008,
mnemonic: 'ldr',
op_str: 'w8, [x20]',
bytes: new Uint8Array([0x88, 0x02, 0x40, 0xb9]),
},
{
address: 0x100c,
mnemonic: 'add',
op_str: 'x0, x1, x2',
bytes: new Uint8Array([0x20, 0x00, 0x02, 0x8b]),
},
{
address: 0x1010,
mnemonic: 'str',
op_str: 'x0, [x1]',
bytes: new Uint8Array([0x20, 0x00, 0x00, 0xf9]),
},
{
address: 0x1014,
mnemonic: 'ldur',
op_str: 'x0, [x1, #0x20]',
bytes: new Uint8Array([0x20, 0x00, 0x42, 0xf8]),
},
{
address: 0x1018,
mnemonic: 'mul',
op_str: 'v0.4s, v1.4s, v2.s[2]',
bytes: new Uint8Array([0x20, 0x88, 0x82, 0x4f]),
},
];
let index = 0;
for (const insn of insns) {
const expected = expectedInstructions[index++];
expect(insn.address).toBe(expected.address);
expect(insn.mnemonic).toBe(expected.mnemonic);
expect(insn.op_str).toBe(expected.op_str);
expect(insn.bytes).toEqual(expected.bytes);
}
disassembler.close();
});