this repo has no description
at trunk 57 lines 1.5 kB view raw
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