1
0
Fork 0

GUI: highlight volatile registers for a call in the registers view

This commit is contained in:
Duncan Ogilvie 2020-06-18 17:41:14 +02:00
parent d73d4058df
commit fdc2edba4e
1 changed files with 42 additions and 0 deletions

View File

@ -266,6 +266,48 @@ Instruction_t QBeaEngine::DisassembleAt(byte_t* data, duint size, duint origBase
if(reginfo[i])
wInst.regsReferenced.emplace_back(cp.RegName(ZydisRegister(i)), reginfo[i]);
// Info about volatile and nonvolatile registers
if(cp.IsBranchType(Zydis::BranchType::BTCall))
{
enum : uint8_t
{
Volatile = Zydis::RAIImplicit | Zydis::RAIWrite,
Parameter = Volatile | Zydis::RAIRead,
};
#define info(reg, type) wInst.regsReferenced.emplace_back(#reg, type)
#ifdef _WIN64
// https://docs.microsoft.com/en-us/cpp/build/x64-software-conventions
info(rax, Volatile);
info(rcx, Parameter);
info(rdx, Parameter);
info(r8, Parameter);
info(r9, Parameter);
info(r10, Volatile);
info(r11, Volatile);
info(xmm0, Parameter);
info(ymm0, Parameter);
info(xmm1, Parameter);
info(ymm1, Parameter);
info(xmm2, Parameter);
info(ymm2, Parameter);
info(xmm3, Parameter);
info(ymm3, Parameter);
info(xmm4, Parameter);
info(ymm4, Parameter);
info(xmm5, Parameter);
info(ymm5, Parameter);
#else
// https://en.wikipedia.org/wiki/X86_calling_conventions#Caller-saved_(volatile)_registers
info(eax, Volatile);
info(edx, Volatile);
info(ecx, Volatile);
#endif // _WIN64
#undef info
}
return wInst;
}