this repo has no description
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
2#include "disassembler.h"
3
4#include "gtest/gtest.h"
5
6#include "assembler-x64.h"
7
8namespace py {
9namespace x64 {
10namespace testing {
11
12static const int kMaxDisassemblySize = 4096;
13
14std::string disassembleToString(View<byte> code) {
15 // Some padding in case it's longer than expected.
16 char buffer[kMaxDisassemblySize];
17 std::memset(buffer, 0, sizeof buffer);
18 DisassembleToMemory formatter(buffer, sizeof buffer);
19 Disassembler::disassemble(
20 reinterpret_cast<uword>(code.data()),
21 reinterpret_cast<uword>(code.data()) + code.length(), &formatter);
22 return buffer;
23}
24
25static byte modrm(byte mod, byte reg, byte rm) {
26 return ((mod & 0x3) << 6) | ((reg & 0x7) << 3) | (rm & 0x7);
27}
28
29TEST(DisassemblerTest, Cmpb) {
30 byte code[] = {0x41, 0x80, modrm(3, 7, R10), 0x78, 0x80, modrm(3, 7, RBX),
31 0x34};
32 EXPECT_EQ(disassembleToString(code), R"(cmpb r10,0X78
33cmpb rbx,0X34
34)");
35}
36
37TEST(DisassemblerTest, Movq) {
38 byte code[] = {0xc7, modrm(3, 0, RBX), 0xaa, 0xbb, 0xcc, 0x0d};
39 EXPECT_EQ(disassembleToString(code), "movl rbx,0X0DCCBBAA\n");
40}
41
42TEST(DisassemblerTest, Orb) {
43 byte code[] = {0x41, 0x80, modrm(3, 1, R10), 0x78, 0x80, modrm(3, 1, RBX),
44 0x34};
45 EXPECT_EQ(disassembleToString(code), R"(orb r10,0X78
46orb rbx,0X34
47)");
48}
49
50TEST(DisassemblerTest, Ud2) {
51 byte code[] = {0x0f, 0x0b};
52 EXPECT_EQ(disassembleToString(code), "ud2\n");
53}
54
55} // namespace testing
56} // namespace x64
57} // namespace py