33
44void ARM32Common::emulate (Capstone* capstone, RDEmulateResult* result, const cs_insn* insn)
55{
6- rd_address address = ARM_PC (RDEmulateResult_GetAddress (result));
6+ rd_address address = arm_address (RDEmulateResult_GetAddress (result));
77 const auto & arm = insn->detail ->arm ;
88
9- if (address == 0x08000110 )
10- {
11- int zzz = 0 ;
12- zzz++;
13- }
14-
159 switch (insn->id )
1610 {
1711 case ARM_INS_B: {
@@ -28,26 +22,26 @@ void ARM32Common::emulate(Capstone* capstone, RDEmulateResult* result, const cs_
2822 case ARM_INS_BLX: {
2923 if (arm.operands [0 ].type != ARM_OP_IMM) return ;
3024
31- if (ARM_IS_THUMB (arm.operands [0 ].imm ))
32- RDContext_SetAddressAssembler (capstone->context (), ARM_PC (arm.operands [0 ].imm ), capstone->endianness () == Endianness_Big ? THUMBBE_ID : THUMBLE_ID);
25+ if (arm_is_thumb (arm.operands [0 ].imm ))
26+ RDContext_SetAddressAssembler (capstone->context (), arm_address (arm.operands [0 ].imm ), capstone->endianness () == Endianness_Big ? THUMBBE_ID : THUMBLE_ID);
3327 else
34- RDContext_SetAddressAssembler (capstone->context (), ARM_PC (arm.operands [0 ].imm ), capstone->endianness () == Endianness_Big ? ARM32BE_ID : ARM32LE_ID);
28+ RDContext_SetAddressAssembler (capstone->context (), arm_address (arm.operands [0 ].imm ), capstone->endianness () == Endianness_Big ? ARM32BE_ID : ARM32LE_ID);
3529
3630 if (arm.cc != ARM_CC_AL) {
3731
3832 }
39- else RDEmulateResult_AddCall (result, ARM_PC (arm.operands [0 ].imm ));
33+ else RDEmulateResult_AddCall (result, arm_address (arm.operands [0 ].imm ));
4034
4135 return ;
4236 }
4337
4438 case ARM_INS_BL: {
4539 if (capstone->mode () & CS_MODE_THUMB)
46- RDContext_SetAddressAssembler (capstone->context (), ARM_PC (arm.operands [0 ].imm ), capstone->endianness () == Endianness_Big ? THUMBBE_ID : THUMBLE_ID);
40+ RDContext_SetAddressAssembler (capstone->context (), arm_address (arm.operands [0 ].imm ), capstone->endianness () == Endianness_Big ? THUMBBE_ID : THUMBLE_ID);
4741 else
48- RDContext_SetAddressAssembler (capstone->context (), ARM_PC (arm.operands [0 ].imm ), capstone->endianness () == Endianness_Big ? ARM32BE_ID : ARM32LE_ID);
42+ RDContext_SetAddressAssembler (capstone->context (), arm_address (arm.operands [0 ].imm ), capstone->endianness () == Endianness_Big ? ARM32BE_ID : ARM32LE_ID);
4943
50- RDEmulateResult_AddCall (result, ARM_PC (arm.operands [0 ].imm )); return ;
44+ RDEmulateResult_AddCall (result, arm_address (arm.operands [0 ].imm )); return ;
5145 return ;
5246 }
5347
@@ -154,20 +148,38 @@ void ARM32Common::processOperands(Capstone* capstone, const cs_insn* insn, RDEmu
154148
155149bool ARM32Common::isMemPC (const arm_op_mem& mem) { return (mem.index == ARM_REG_INVALID) && (mem.base == ARM_REG_PC); }
156150
151+ void ARM32Common::renderDereference (rd_location location, const RDRendererParams* rp)
152+ {
153+ auto * doc = RDContext_GetDocument (rp->context );
154+ auto flags = RDDocument_GetFlags (doc, location);
155+
156+ if (flags & AddressFlags_Pointer) {
157+ auto loc = RDDocument_Dereference (doc, location);
158+
159+ if (loc.valid ) {
160+ RDRenderer_Text (rp->renderer , " =" );
161+ RDRenderer_Reference (rp->renderer , arm_address (loc.address ));
162+ return ;
163+ }
164+ }
165+
166+ RDRenderer_Reference (rp->renderer , location);
167+ }
168+
157169void ARM32Common::renderOperand (Capstone* capstone, const cs_insn* insn, const cs_arm_op& op, const RDRendererParams* rp)
158170{
159171 const auto & arm = insn->detail ->arm ;
160172
161173 switch (op.type )
162174 {
163175 case ARM_OP_MEM: {
164- if (ARM32Common::isMemPC (op.mem )) RDRenderer_Reference (rp-> renderer , ARM32Common::pc (capstone, insn) + op.mem .disp ); // [pc]
176+ if (ARM32Common::isMemPC (op.mem )) ARM32Common::renderDereference ( ARM32Common::pc (capstone, insn) + op.mem .disp , rp ); // [pc]
165177 else ARM32Common::renderMemory (capstone, arm, op, rp);
166178 break ;
167179 }
168180
181+ case ARM_OP_IMM: ARM32Common::renderDereference (op.imm , rp); break ;
169182 case ARM_OP_REG: RDRenderer_Register (rp->renderer , capstone->regName (op.reg )); break ;
170- case ARM_OP_IMM: RDRenderer_Reference (rp->renderer , op.imm ); break ;
171183 case ARM_OP_FP: RDRenderer_Text (rp->renderer , " ARM_OP_FP" ); break ;
172184 case ARM_OP_CIMM: RDRenderer_Text (rp->renderer , " ARM_OP_CIMM" ); break ;
173185 case ARM_OP_PIMM: RDRenderer_Text (rp->renderer , " ARM_OP_PIMM" ); break ;
0 commit comments