From 120235ac6830fac5cc9f9378683056d32a420f5b Mon Sep 17 00:00:00 2001 From: Riccardo Schirone Date: Thu, 23 Sep 2021 09:39:14 +0200 Subject: [PATCH] Fix pimm/cimm opex printing in ARM instructions (#1730) * Fix pimm/cimm opex printing in ARM instructions * Add test for opex cimm/pimm in ARM --- librz/analysis/p/analysis_arm_cs.c | 8 ++++++-- test/db/cmd/cmd_ao | 13 +++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/librz/analysis/p/analysis_arm_cs.c b/librz/analysis/p/analysis_arm_cs.c index 322ca2fe7d..a65129868e 100644 --- a/librz/analysis/p/analysis_arm_cs.c +++ b/librz/analysis/p/analysis_arm_cs.c @@ -265,9 +265,11 @@ static void opex(RzStrBuf *buf, csh handle, cs_insn *insn) { pj_kd(pj, "value", op->fp); break; case ARM_OP_CIMM: + pj_ks(pj, "type", "cimm"); + pj_ki(pj, "value", op->imm); break; case ARM_OP_PIMM: - pj_ks(pj, "type", "cimm"); + pj_ks(pj, "type", "pimm"); pj_ki(pj, "value", op->imm); break; case ARM_OP_SETEND: @@ -3494,7 +3496,9 @@ jmp $$ + 4 + ( [delta] * 2 ) case ARM_INS_LDRT: op->cycles = 4; // 0x000082a8 28301be5 ldr r3, [fp, -0x28] - op->scale = INSOP(1).mem.scale << LSHIFT(1); + if (INSOP(1).mem.scale != -1) { + op->scale = INSOP(1).mem.scale << LSHIFT(1); + } op->ireg = cs_reg_name(handle, REGBASE(1)); op->disp = MEMDISP(1); if (REGID(0) == ARM_REG_PC) { diff --git a/test/db/cmd/cmd_ao b/test/db/cmd/cmd_ao index 674c3be6e2..d3929e968c 100644 --- a/test/db/cmd/cmd_ao +++ b/test/db/cmd/cmd_ao @@ -94,3 +94,16 @@ stackptr: 8 ] EOF RUN + +NAME=pimm/cimm +FILE== +CMDS=<