Skip to content

Missing Operands in ARM Thumb Mode Disassembly with Capstone 5.0.1280 #2280

@AntoineBlaud

Description

@AntoineBlaud

Issue Description:

When disassembling ARM Thumb instructions using Capstone with the CS_MODE_THUMB mode enabled, there is a problem where some instructions have missing operands.

Observed Behavior:

Some instructions, particularly ldr and str, when disassembled using Capstone with ARM Thumb mode, have only one operand reported, missing the memory operand information which includes the base register, index register, scale, and displacement.

Environment:

  • Capstone version: 5.0.1280
  • Capstone version: 4.0.1024

Code Snippet:

from capstone import *
from capstone.arm_const import ARM_OP_MEM, ARM_OP_REG, ARM_OP_IMM

CODE = b'\x00h\x00h\x07\x90\x0bhk\xb1\x87I\x02\xad\x87J'

def get_reg_name(cs, reg):
    name = cs.reg_name(reg)
    if isinstance(name, str):
        return name.upper()
    return None

print("Capstone", cs_version())

md = Cs(CS_ARCH_ARM, CS_MODE_THUMB)
md.detail = True
for insn in md.disasm(CODE, 0x1000):
    print("0x%x:\t%s\t%s" %(insn.address, insn.mnemonic, insn.op_str))
    print("  Number of Operands:", len(insn.operands))
    for op in insn.operands:
        if op.type == ARM_OP_MEM:
            print("  Operand Type: Memory")
            print("  Base Register:", get_reg_name(md, op.mem.base))
            print("  Index Register:", get_reg_name(md, op.mem.index))
            print("  Scale:", op.mem.scale)
            print("  Disp:", op.mem.disp)
        elif op.type == ARM_OP_REG:
            print("  Operand Type: Register")
            print("  Register:", get_reg_name(md, op.reg))
        elif op.type == ARM_OP_IMM:
            print("  Operand Type: Immediate")
            print("  Value:", op.imm)
        else:
            print("  Operand Type:", op.type)

Output:
Capstone version: 4.0.1024

Capstone (4, 0, 1024)
0x1000: ldr     r0, [r0]
  Number of Operands: 2
  Operand Type: Register
  Register: R0
  Operand Type: Memory
  Base Register: R0
  Index Register: None
  Scale: 1
  Disp: 0
0x1002: ldr     r0, [r0]
  Number of Operands: 2
  Operand Type: Register
  Register: R0
  Operand Type: Memory
  Base Register: R0
  Index Register: None
  Scale: 1
  Disp: 0
0x1004: str     r0, [sp, #0x1c]
  Number of Operands: 2
  Operand Type: Register
  Register: R0
  Operand Type: Memory
  Base Register: SP
  Index Register: None
  Scale: 1
  Disp: 28
0x1006: ldr     r3, [r1]
  Number of Operands: 2
  Operand Type: Register
  Register: R3
  Operand Type: Memory
  Base Register: R1
  Index Register: None
  Scale: 1
  Disp: 0
0x1008: cbz     r3, #0x1026
  Number of Operands: 2
  Operand Type: Register
  Register: R3
  Operand Type: Immediate
  Value: 4134
0x100a: ldr     r1, [pc, #0x21c]
  Number of Operands: 2
  Operand Type: Register
  Register: R1
  Operand Type: Memory
  Base Register: PC
  Index Register: None
  Scale: 1
  Disp: 540
0x100c: add     r5, sp, #8
  Number of Operands: 3
  Operand Type: Register
  Register: R5
  Operand Type: Register
  Register: SP
  Operand Type: Immediate
  Value: 8
0x100e: ldr     r2, [pc, #0x21c]
  Number of Operands: 2
  Operand Type: Register
  Register: R2
  Operand Type: Memory
  Base Register: PC
  Index Register: None
  Scale: 1
  Disp: 540

Capstone version: 5.0.1280

Capstone (5, 0, 1280)
0x1000: ldr     r0, [r0]
  Number of Operands: 1
  Operand Type: Register
  Register: R0
0x1002: ldr     r0, [r0]
  Number of Operands: 1
  Operand Type: Register
  Register: R0
0x1004: str     r0, [sp, #0x1c]
  Number of Operands: 1
  Operand Type: Register
  Register: R0
0x1006: ldr     r3, [r1]
  Number of Operands: 1
  Operand Type: Register
  Register: R3
0x1008: cbz     r3, #0x1026
  Number of Operands: 2
  Operand Type: Register
  Register: R3
  Operand Type: Immediate
  Value: 4134
0x100a: ldr     r1, [pc, #0x21c]
  Number of Operands: 2
  Operand Type: Register
  Register: R1
  Operand Type: Memory
  Base Register: PC
  Index Register: None
  Scale: 1
  Disp: 540
0x100c: add     r5, sp, #8
  Number of Operands: 3
  Operand Type: Register
  Register: R5
  Operand Type: Register
  Register: SP
  Operand Type: Immediate
  Value: 8
0x100e: ldr     r2, [pc, #0x21c]
  Number of Operands: 2
  Operand Type: Register
  Register: R2
  Operand Type: Memory
  Base Register: PC
  Index Register: None
  Scale: 1

Metadata

Metadata

Assignees

No one assigned

    Labels

    ARMArchPythonBindingsbugSomething is not working as it should

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions