-
-
Notifications
You must be signed in to change notification settings - Fork 47
/
Copy pathasmtk_test_x86handler.cpp
66 lines (52 loc) · 1.65 KB
/
asmtk_test_x86handler.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <asmjit/x86.h>
#include "./asmtk.h"
using namespace asmjit;
using namespace asmtk;
static Error ASMJIT_CDECL unknownSymbolHandler(AsmParser* parser, Operand* dst, const char* name, size_t size) {
void* data = parser->unknownSymbolHandlerData();
printf("SymbolHandler called on symbol '%.*s' (data %p)\n", int(size), name, data);
if (size == 5 && memcmp(name, "TestA", 5) == 0) {
*dst = x86::rcx;
return kErrorOk;
}
if (size == 5 && memcmp(name, "TestB", 5) == 0) {
*dst = imm(0x4000);
return kErrorOk;
}
// Dst is initially an empty operand (none), if it's not changed AsmTK
// will create label for it by default. Don't return error in any case
// as that will terminate the parsing and return immediately.
return kErrorOk;
}
int main(int argc, char* argv[]) {
// Initialize Environment with X64 architecture.
Environment environment;
environment.init(Arch::kX64);
uint64_t baseAddress = uint64_t(0x1000);
FileLogger logger(stdout);
logger.addFlags(FormatFlags::kMachineCode);
// Initialize CodeHolder.
CodeHolder code;
Error err = code.init(environment, baseAddress);
if (err) {
printf("[FAILURE] CodeHolder.init(): %s\n", DebugUtils::errorAsString(err));
return 1;
}
code.setLogger(&logger);
x86::Assembler a(&code);
AsmParser parser(&a);
parser.setUnknownSymbolHandler(unknownSymbolHandler);
err = parser.parse("mov rax, TestA\ncall TestB\n");
if (err) {
printf("[FAILURE] AsmParser.parse(): %s\n", DebugUtils::errorAsString(err));
return 1;
}
else {
printf("[SUCCESS]\n");
return 0;
}
}