diff --git a/libMEDSannotation/include/MEDS_Register.hpp b/libMEDSannotation/include/MEDS_Register.hpp index 5452489f0f405e89f0a15c15f2c2d4e58f3f292b..6e57372cd8ffb4bf2f9f4318af18fc77adbe1402 100644 --- a/libMEDSannotation/include/MEDS_Register.hpp +++ b/libMEDSannotation/include/MEDS_Register.hpp @@ -8,7 +8,7 @@ namespace MEDS_Annotation class Register { public: - enum RegisterName { UNKNOWN, EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, AX, BX, CX, DX, BP, SP, SI, DI, AH, BH, CH, DH, AL, BL, CL, DL }; + enum RegisterName { UNKNOWN, EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, AX, BX, CX, DX, BP, SP, SI, DI, AH, BH, CH, DH, AL, BL, CL, DL, RAX, RBX, RCX, RDX, RBP, RSP, RSI, RDI, R8, R9, R10, R11, R12, R13, R14, R15, R8D, R9D, R10D, R11D, R12D, R13D, R14D, R15D, R8W, R9W, R10W, R11W, R12W, R13W, R14W, R15W, SIL, DIL, BPL, SPL, R8B, R9B, R10B, R11B, R12B, R13B, R14B, R15B }; static RegisterName getRegister(std::string); static RegisterName getRegister(char *str); static bool is32bit(RegisterName); diff --git a/libtransform/src/transform.cpp b/libtransform/src/transform.cpp index a744d63d772d5d2d0eb3acbb5c6f0d839438b270..f00cda0de4df59b6592b6e1a1b2eca782fda7407 100644 --- a/libtransform/src/transform.cpp +++ b/libtransform/src/transform.cpp @@ -83,43 +83,80 @@ void Transform::addPushRegister(Instruction_t *p_instr, Register::RegisterName p string dataBits; dataBits.resize(1); - if (p_reg == Register::EAX) + if (p_reg == Register::EAX || p_reg == Register::RAX) { dataBits[0] = 0x50; } - else if (p_reg == Register::EBX) + else if (p_reg == Register::EBX || p_reg == Register::RBX) { dataBits[0] = 0x53; } - else if (p_reg == Register::ECX) + else if (p_reg == Register::ECX || p_reg == Register::RCX) { dataBits[0] = 0x51; } - else if (p_reg == Register::EDX) + else if (p_reg == Register::EDX || p_reg == Register::RDX) { dataBits[0] = 0x52; } - else if (p_reg == Register::ESI) + else if (p_reg == Register::ESI || p_reg == Register::RSI) { dataBits[0] = 0x56; } - else if (p_reg == Register::EDI) + else if (p_reg == Register::EDI || p_reg == Register::RDI) { dataBits[0] = 0x57; } - else if (p_reg == Register::EBP) + else if (p_reg == Register::EBP || p_reg == Register::RBP) { dataBits[0] = 0x55; } - else if (p_reg == Register::ESP) + else if (p_reg == Register::ESP || p_reg == Register::RSP) { dataBits[0] = 0x54; } else { - cerr << "Transform::addPushRegister: unhandled register: " << p_reg << endl; - assert(0); - return; + dataBits.resize(2); + dataBits[0] = 0x41; + if (p_reg == Register::R8) + { + dataBits[1] = 0x50; + } + else if (p_reg == Register::R9) + { + dataBits[1] = 0x51; + } + else if (p_reg == Register::R10) + { + dataBits[1] = 0x52; + } + else if (p_reg == Register::R11) + { + dataBits[1] = 0x53; + } + else if (p_reg == Register::R12) + { + dataBits[1] = 0x54; + } + else if (p_reg == Register::R13) + { + dataBits[1] = 0x55; + } + else if (p_reg == Register::R14) + { + dataBits[1] = 0x56; + } + else if (p_reg == Register::R15) + { + dataBits[1] = 0x57; + } + else + { + cerr << "Transform::addPushRegister: unhandled register: " << p_reg << endl; + assert(0); + return; + } } addInstruction(p_instr, dataBits, p_fallThrough, NULL); @@ -130,43 +167,80 @@ void Transform::addPopRegister(Instruction_t *p_instr, Register::RegisterName p_ string dataBits; dataBits.resize(1); - if (p_reg == Register::EAX) + if (p_reg == Register::EAX || p_reg == Register::RAX) { dataBits[0] = 0x58; } - else if (p_reg == Register::EBX) + else if (p_reg == Register::EBX || p_reg == Register::RBX) { dataBits[0] = 0x5b; } - else if (p_reg == Register::ECX) + else if (p_reg == Register::ECX || p_reg == Register::RCX) { dataBits[0] = 0x59; } - else if (p_reg == Register::EDX) + else if (p_reg == Register::EDX || p_reg == Register::RDX) { dataBits[0] = 0x5a; } - else if (p_reg == Register::ESI) + else if (p_reg == Register::ESI || p_reg == Register::RSI) { dataBits[0] = 0x5e; } - else if (p_reg == Register::EDI) + else if (p_reg == Register::EDI || p_reg == Register::RDI) { dataBits[0] = 0x5f; } - else if (p_reg == Register::EBP) + else if (p_reg == Register::EBP || p_reg == Register::RBP) { dataBits[0] = 0x5d; } - else if (p_reg == Register::ESP) + else if (p_reg == Register::ESP || p_reg == Register::RSP) { dataBits[0] = 0x5c; } else { - cerr << "Transform::addPopRegister: unhandled register"; - assert(0); - return; + dataBits.resize(2); + dataBits[0] = 0x41; + if (p_reg == Register::R8) + { + dataBits[1] = 0x58; + } + else if (p_reg == Register::R9) + { + dataBits[1] = 0x59; + } + else if (p_reg == Register::R10) + { + dataBits[1] = 0x5a; + } + else if (p_reg == Register::R11) + { + dataBits[1] = 0x5b; + } + else if (p_reg == Register::R12) + { + dataBits[1] = 0x5c; + } + else if (p_reg == Register::R13) + { + dataBits[1] = 0x5d; + } + else if (p_reg == Register::R14) + { + dataBits[1] = 0x5e; + } + else if (p_reg == Register::R15) + { + dataBits[1] = 0x5f; + } + else + { + cerr << "Transform::addPopRegister: unhandled register"; + assert(0); + return; + } } addInstruction(p_instr, dataBits, p_fallThrough, NULL);