-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathAssembler86.cpp
82 lines (70 loc) · 1.88 KB
/
Assembler86.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "../src/assembler/X86Assembler.hpp"
#include "Assembler.hpp"
#include <gtest/gtest.h>
using namespace tulip::hook;
using enum X86Register;
static RegMem32 m;
TEST(X86AssemblerTest, Nop) {
X86Assembler a(0x123);
a.nop();
EXPECT_EQ(a.buffer(), "\x90"_bytes);
}
TEST(X86AssemblerTest, Jmp) {
X86Assembler a(0x123);
a.jmp(0xb00b5);
a.jmp(ECX);
EXPECT_EQ(a.buffer(), "\xE9\x8D\xFF\x0A\x00\xFF\xE1"_bytes);
}
TEST(X86AssemblerTest, Call) {
X86Assembler a(0);
a.call(0x456);
a.call(EAX);
a.call(EBP);
a.call(ESP);
EXPECT_EQ(a.buffer(), "\xE8\x51\x04\x00\x00\xFF\xD0\xFF\xD5\xFF\xD4"_bytes);
}
TEST(X86AssemblerTest, Push) {
X86Assembler a(0x123);
a.push(EAX);
a.push(ESP);
a.push(m[ESP + 0x10]);
EXPECT_EQ(a.buffer(), "\x50\x54\xFF\x74\x24\x10"_bytes);
}
TEST(X86AssemblerTest, Mov) {
X86Assembler a(0x123);
a.mov(EAX, 10);
a.mov(EAX, EAX);
a.mov(ECX, EAX);
a.mov(ECX, m[EDX + 4]);
a.mov(ECX, m[EBP + 4]);
a.mov(m[EBP + 4], ESP);
a.mov(m[EBP], EAX);
EXPECT_EQ(a.buffer(), "\xb8\x0a\x00\x00\x00\x89\xC0\x89\xC1\x8B\x4A\x04\x8B\x4D\x04\x89\x65\x04\x89\x45\x00"_bytes);
}
TEST(X86AssemblerTest, Movsd) {
X86Assembler a(0x123);
a.movsd(m[ESP], XMM0);
a.movsd(XMM1, m[ESP + 4]);
EXPECT_EQ(a.buffer(), "\xF2\x0F\x11\x04\x24\xF2\x0F\x10\x4C\x24\x04"_bytes);
}
TEST(X86AssemblerTest, Movss) {
X86Assembler a(0x123);
a.movss(m[ESP], XMM0);
a.movss(XMM1, m[ESP + 4]);
EXPECT_EQ(a.buffer(), "\xF3\x0F\x11\x04\x24\xF3\x0F\x10\x4C\x24\x04"_bytes);
}
TEST(X86AssemblerTest, Movaps) {
X86Assembler a(0x123);
a.movaps(m[ESP], XMM0);
a.movaps(XMM1, m[ESP + 4]);
EXPECT_EQ(a.buffer(), "\x0F\x29\x04\x24\x0F\x28\x4C\x24\x04"_bytes);
}
TEST(X86AssemblerTest, Label) {
X86Assembler a(0x123);
a.mov(EAX, "label");
a.lea(ECX, "label");
a.label("label");
a.write32(0x80085);
a.updateLabels();
EXPECT_EQ(a.buffer(), "\x8B\x05\x2f\x01\x00\x00\x8D\x0D\x2f\x01\x00\x00\x85\x00\x08\x00"_bytes);
}