form = op_code_to_form((uint8_t *)(instr_ptr + length), &length);
-
V3_Print("\t decoded as (%s)\n", op_form_to_str(form));
if (form == INVALID_INSTR) {
return -1;
}
length += ret;
-
instr->instr_length += length;
-
v3_print_instr(instr);
return 0;
ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->dst_operand), ®_code);
-
if (ret == -1) {
PrintError("Error decoding operand\n");
return -1;
instr->num_operands = 2;
break;
+ }
+ case MOV_2CR: {
+ uint8_t reg_code = 0;
+
+ ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->src_operand),
+ ®_code);
- case MOV_2CR: {
- uint8_t reg_code = 0;
-
- ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->src_operand),
- ®_code);
-
- if (ret == -1) {
- PrintError("Error decoding operand for (%s)\n", op_form_to_str(form));
- return -1;
- }
-
- instr_ptr += ret;
-
- instr->dst_operand.type = REG_OPERAND;
- instr->dst_operand.size = operand_width;
- decode_cr(core, reg_code, &(instr->dst_operand));
-
- instr->src_operand.read = 1;
- instr->dst_operand.write = 1;
-
- instr->num_operands = 2;
- break;
- }
- case MOV_CR2: {
- uint8_t reg_code = 0;
-
- ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->dst_operand),
- ®_code);
-
-
- if (ret == -1) {
- PrintError("Error decoding operand for (%s)\n", op_form_to_str(form));
- return -1;
- }
-
- instr_ptr += ret;
-
- instr->src_operand.type = REG_OPERAND;
- instr->src_operand.size = operand_width;
- decode_cr(core, reg_code, &(instr->src_operand));
-
- instr->src_operand.read = 1;
- instr->dst_operand.write = 1;
-
- instr->num_operands = 2;
- break;
+ if (ret == -1) {
+ PrintError("Error decoding operand for (%s)\n", op_form_to_str(form));
+ return -1;
}
- case STOS:
- case STOS_8: {
- instr->is_str_op = 1;
-
- if (instr->prefixes.rep == 1) {
- instr->str_op_length = MASK(core->vm_regs.rcx, operand_width);
- } else {
- instr->str_op_length = 1;
- }
- instr->src_operand.size = operand_width;
- instr->src_operand.type = REG_OPERAND;
- instr->src_operand.operand = (addr_t)&(core->vm_regs.rax);
-
- instr->dst_operand.type = MEM_OPERAND;
- instr->dst_operand.size = operand_width;
- instr->dst_operand.operand = get_addr_linear(core, MASK(core->vm_regs.rdi, addr_width), &(core->segments.es));
+ instr_ptr += ret;
- instr->src_operand.read = 1;
- instr->dst_operand.write = 1;
+ instr->dst_operand.type = REG_OPERAND;
+ instr->dst_operand.size = operand_width;
+ decode_cr(core, reg_code, &(instr->dst_operand));
+
+ instr->src_operand.read = 1;
+ instr->dst_operand.write = 1;
- instr->num_operands = 2;
+ instr->num_operands = 2;
+ break;
+ }
+ case MOV_CR2: {
+ uint8_t reg_code = 0;
+
+ ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->dst_operand),
+ ®_code);
+
- break;
+ if (ret == -1) {
+ PrintError("Error decoding operand for (%s)\n", op_form_to_str(form));
+ return -1;
}
- case INVLPG: {
- uint8_t reg_code = 0;
-
- ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->dst_operand), ®_code);
- if (ret == -1) {
- PrintError("Error decoding operand for (%s)\n", op_form_to_str(form));
- return -1;
- }
+ instr_ptr += ret;
+
+ instr->src_operand.type = REG_OPERAND;
+ instr->src_operand.size = operand_width;
+ decode_cr(core, reg_code, &(instr->src_operand));
- instr_ptr += ret;
+ instr->src_operand.read = 1;
+ instr->dst_operand.write = 1;
- instr->num_operands = 1;
- break;
+ instr->num_operands = 2;
+ break;
+ }
+ case STOS:
+ case STOS_8: {
+ instr->is_str_op = 1;
+
+ if (instr->prefixes.rep == 1) {
+ instr->str_op_length = MASK(core->vm_regs.rcx, operand_width);
+ } else {
+ instr->str_op_length = 1;
}
- case CLTS: {
- // no operands.
- break;
-
+
+ instr->src_operand.size = operand_width;
+ instr->src_operand.type = REG_OPERAND;
+ instr->src_operand.operand = (addr_t)&(core->vm_regs.rax);
+
+ instr->dst_operand.type = MEM_OPERAND;
+ instr->dst_operand.size = operand_width;
+ instr->dst_operand.operand = get_addr_linear(core, MASK(core->vm_regs.rdi, addr_width), &(core->segments.es));
+
+ instr->src_operand.read = 1;
+ instr->dst_operand.write = 1;
+
+ instr->num_operands = 2;
+
+ break;
+ }
+ case INVLPG: {
+ uint8_t reg_code = 0;
+
+ ret = decode_rm_operand(core, instr_ptr, form, instr, &(instr->dst_operand), ®_code);
+
+ if (ret == -1) {
+ PrintError("Error decoding operand for (%s)\n", op_form_to_str(form));
+ return -1;
}
+
+ instr_ptr += ret;
+
+ instr->num_operands = 1;
+ break;
+ }
+ case CLTS: {
+ // no operands.
+ break;
+
}
default:
PrintError("Invalid Instruction form: %s\n", op_form_to_str(form));