blob: d521845437bcae154e9d9abe32040728fc5867b2 [file] [log] [blame]
Nguyen Anh Quynh30e4d7f2014-05-08 22:54:58 +08001/* Capstone Disassembly Engine */
Nguyen Anh Quynhbfcaba52015-03-04 17:45:23 +08002/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08003
reverser160e1982015-04-09 18:28:19 +01004#if defined(CAPSTONE_HAS_OSXKERNEL)
5#include <libkern/libkern.h>
6#else
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08007#include <stdio.h>
8#include <stdlib.h>
reverser160e1982015-04-09 18:28:19 +01009#endif
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080010#include <string.h>
11
12#include "MCInst.h"
13#include "utils.h"
14
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +070015#define MCINST_CACHE (ARR_SIZE(mcInst->Operands) - 1)
16
Nguyen Anh Quynh495295e2014-06-16 15:54:32 +080017void MCInst_Init(MCInst *inst)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080018{
Nguyen Anh Quynh495295e2014-06-16 15:54:32 +080019 inst->OpcodePub = 0;
20 inst->size = 0;
Nguyen Anh Quynhff7bba32014-11-03 16:32:06 +080021 inst->has_imm = false;
22 inst->op1_size = 0;
Nguyen Anh Quynhe19490e2015-01-21 12:15:14 +080023 inst->writeback = false;
Nguyen Anh Quynh29f777b2015-04-07 11:59:26 +080024 inst->ac_idx = 0;
Nguyen Anh Quynhdabc9f22016-07-15 20:37:19 +080025 inst->popcode_adjust = 0;
Nguyen Anh Quynh64328e32017-05-07 11:17:23 +080026 inst->assembly[0] = '\0';
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080027}
28
29void MCInst_clear(MCInst *inst)
30{
31 inst->size = 0;
32}
33
Nguyen Anh Quynh0f648ea2014-06-10 01:01:23 +070034// do not free @Op
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +070035void MCInst_insert0(MCInst *inst, int index, MCOperand *Op)
36{
37 int i;
38
39 for(i = inst->size; i > index; i--)
40 //memcpy(&(inst->Operands[i]), &(inst->Operands[i-1]), sizeof(MCOperand));
41 inst->Operands[i] = inst->Operands[i-1];
42
43 inst->Operands[index] = *Op;
44 inst->size++;
45}
46
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080047void MCInst_setOpcode(MCInst *inst, unsigned Op)
48{
49 inst->Opcode = Op;
50}
51
Nguyen Anh Quynh6b7abe32013-11-30 00:54:24 +080052void MCInst_setOpcodePub(MCInst *inst, unsigned Op)
53{
54 inst->OpcodePub = Op;
55}
56
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080057unsigned MCInst_getOpcode(const MCInst *inst)
58{
59 return inst->Opcode;
60}
61
Nguyen Anh Quynh6b7abe32013-11-30 00:54:24 +080062unsigned MCInst_getOpcodePub(const MCInst *inst)
63{
64 return inst->OpcodePub;
65}
66
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080067MCOperand *MCInst_getOperand(MCInst *inst, unsigned i)
68{
69 return &inst->Operands[i];
70}
71
72unsigned MCInst_getNumOperands(const MCInst *inst)
73{
74 return inst->size;
75}
76
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080077// This addOperand2 function doesnt free Op
Nguyen Anh Quynh264ca372014-06-16 14:52:09 +080078void MCInst_addOperand2(MCInst *inst, MCOperand *Op)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080079{
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080080 inst->Operands[inst->size] = *Op;
81
82 inst->size++;
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080083}
84
85void MCOperand_Init(MCOperand *op)
86{
87 op->Kind = kInvalid;
88 op->FPImmVal = 0.0;
89}
90
91bool MCOperand_isValid(const MCOperand *op)
92{
93 return op->Kind != kInvalid;
94}
95
96bool MCOperand_isReg(const MCOperand *op)
97{
98 return op->Kind == kRegister;
99}
100
101bool MCOperand_isImm(const MCOperand *op)
102{
103 return op->Kind == kImmediate;
104}
105
106bool MCOperand_isFPImm(const MCOperand *op)
107{
108 return op->Kind == kFPImmediate;
109}
110
111/// getReg - Returns the register number.
112unsigned MCOperand_getReg(const MCOperand *op)
113{
114 return op->RegVal;
115}
116
117/// setReg - Set the register number.
118void MCOperand_setReg(MCOperand *op, unsigned Reg)
119{
120 op->RegVal = Reg;
121}
122
123int64_t MCOperand_getImm(MCOperand *op)
124{
125 return op->ImmVal;
126}
127
128void MCOperand_setImm(MCOperand *op, int64_t Val)
129{
130 op->ImmVal = Val;
131}
132
133double MCOperand_getFPImm(const MCOperand *op)
134{
135 return op->FPImmVal;
136}
137
138void MCOperand_setFPImm(MCOperand *op, double Val)
139{
140 op->FPImmVal = Val;
141}
142
Nguyen Anh Quynh0f648ea2014-06-10 01:01:23 +0700143MCOperand *MCOperand_CreateReg1(MCInst *mcInst, unsigned Reg)
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +0700144{
145 MCOperand *op = &(mcInst->Operands[MCINST_CACHE]);
146
147 op->Kind = kRegister;
148 op->RegVal = Reg;
149
150 return op;
151}
Nguyen Anh Quynhcf081382014-06-06 00:56:46 +0800152
153void MCOperand_CreateReg0(MCInst *mcInst, unsigned Reg)
154{
155 MCOperand *op = &(mcInst->Operands[mcInst->size]);
156 mcInst->size++;
157
158 op->Kind = kRegister;
159 op->RegVal = Reg;
160}
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +0700161
Nguyen Anh Quynh0f648ea2014-06-10 01:01:23 +0700162MCOperand *MCOperand_CreateImm1(MCInst *mcInst, int64_t Val)
Nguyen Anh Quynh937e4832014-06-04 22:51:51 +0700163{
164 MCOperand *op = &(mcInst->Operands[MCINST_CACHE]);
165
166 op->Kind = kImmediate;
167 op->ImmVal = Val;
168
169 return op;
170}
Nguyen Anh Quynhcf081382014-06-06 00:56:46 +0800171
172void MCOperand_CreateImm0(MCInst *mcInst, int64_t Val)
173{
174 MCOperand *op = &(mcInst->Operands[mcInst->size]);
175 mcInst->size++;
176
177 op->Kind = kImmediate;
178 op->ImmVal = Val;
179}