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
Issue Description:
When disassembling ARM Thumb instructions using Capstone with the
CS_MODE_THUMBmode enabled, there is a problem where some instructions have missing operands.Observed Behavior:
Some instructions, particularly
ldrandstr, 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:
Code Snippet:
Output:
Capstone version: 4.0.1024
Capstone version: 5.0.1280