diff options
-rw-r--r-- | disassembler/disassembler_x86.cc | 32 | ||||
-rw-r--r-- | disassembler/disassembler_x86.h | 1 |
2 files changed, 33 insertions, 0 deletions
diff --git a/disassembler/disassembler_x86.cc b/disassembler/disassembler_x86.cc index 1f74c93045..7f6a7ba63b 100644 --- a/disassembler/disassembler_x86.cc +++ b/disassembler/disassembler_x86.cc @@ -243,7 +243,38 @@ std::string DisassemblerX86::DumpAddress(uint8_t mod, uint8_t rm, uint8_t rex64, return address.str(); } +size_t DisassemblerX86::DumpNops(std::ostream& os, const uint8_t* instr) { +static constexpr uint8_t kNops[][10] = { + { }, + { 0x90 }, + { 0x66, 0x90 }, + { 0x0f, 0x1f, 0x00 }, + { 0x0f, 0x1f, 0x40, 0x00 }, + { 0x0f, 0x1f, 0x44, 0x00, 0x00 }, + { 0x66, 0x0f, 0x1f, 0x44, 0x00, 0x00 }, + { 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00 }, + { 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x66, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x66, 0x2e, 0x0f, 0x1f, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00 } + }; + + for (size_t i = 1; i < arraysize(kNops); ++i) { + if (memcmp(instr, kNops[i], i) == 0) { + os << FormatInstructionPointer(instr) + << StringPrintf(": %22s \t nop \n", DumpCodeHex(instr, instr + i).c_str()); + return i; + } + } + + return 0; +} + size_t DisassemblerX86::DumpInstruction(std::ostream& os, const uint8_t* instr) { + size_t nop_size = DumpNops(os, instr); + if (nop_size != 0u) { + return nop_size; + } + const uint8_t* begin_instr = instr; bool have_prefixes = true; uint8_t prefix[4] = {0, 0, 0, 0}; @@ -400,6 +431,7 @@ DISASSEMBLER_ENTRY(cmp, case 0x89: opcode1 = "mov"; store = true; has_modrm = true; break; case 0x8A: opcode1 = "mov"; load = true; has_modrm = true; byte_operand = true; break; case 0x8B: opcode1 = "mov"; load = true; has_modrm = true; break; + case 0x9D: opcode1 = "popf"; break; case 0x0F: // 2 byte extended opcode instr++; diff --git a/disassembler/disassembler_x86.h b/disassembler/disassembler_x86.h index 71c3e4161c..31b62bccf2 100644 --- a/disassembler/disassembler_x86.h +++ b/disassembler/disassembler_x86.h @@ -33,6 +33,7 @@ class DisassemblerX86 FINAL : public Disassembler { void Dump(std::ostream& os, const uint8_t* begin, const uint8_t* end) OVERRIDE; private: + size_t DumpNops(std::ostream& os, const uint8_t* instr); size_t DumpInstruction(std::ostream& os, const uint8_t* instr); std::string DumpAddress(uint8_t mod, uint8_t rm, uint8_t rex64, uint8_t rex_w, bool no_ops, |