#include namespace vm::instrs { profiler_t svsp = { "SVSP", mnemonic_t::svsp, {{// MOV REG, VSP [](const zydis_reg_t vip, const zydis_reg_t vsp, const zydis_decoded_instr_t& instr) -> bool { return instr.mnemonic == ZYDIS_MNEMONIC_MOV && instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[1].reg.value == vsp; }, // SUB VSP, OFFSET [](const zydis_reg_t vip, const zydis_reg_t vsp, const zydis_decoded_instr_t& instr) -> bool { return instr.mnemonic == ZYDIS_MNEMONIC_SUB && instr.operands[0].type == ZYDIS_OPERAND_TYPE_REGISTER && instr.operands[0].reg.value == vsp && instr.operands[1].type == ZYDIS_OPERAND_TYPE_IMMEDIATE; }, // MOV [VSP], REG [](const zydis_reg_t vip, const zydis_reg_t vsp, const zydis_decoded_instr_t& instr) -> bool { return instr.mnemonic == ZYDIS_MNEMONIC_MOV && instr.operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY && instr.operands[0].mem.base == vsp && instr.operands[0].mem.disp.has_displacement == false && instr.operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER; }}}, [](zydis_reg_t& vip, zydis_reg_t& vsp, hndlr_trace_t& hndlr) -> std::optional { vinstr_t res{mnemonic_t::svsp}; const auto mov_vsp_reg = std::find_if( hndlr.m_instrs.begin(), hndlr.m_instrs.end(), [&](emu_instr_t& instr) -> bool { const auto& i = instr.m_instr; return i.mnemonic == ZYDIS_MNEMONIC_MOV && i.operands[0].type == ZYDIS_OPERAND_TYPE_MEMORY && i.operands[0].mem.base == vsp && i.operands[0].mem.disp.has_displacement == false && i.operands[1].type == ZYDIS_OPERAND_TYPE_REGISTER; }); res.imm.has_imm = false; res.stack_size = mov_vsp_reg->m_instr.operands[1].size; return res; }}; }