private void ReloadListButton_Click(object sender, EventArgs e) { ArmDisassembleMode disassembleMode = ArmDisassembleMode.Arm; if (thumb.Checked) { disassembleMode = ArmDisassembleMode.Thumb; } uint addr = (uint)ReadStartAddress.Value; if ((addr & 1) == 1) { disassembleMode = ArmDisassembleMode.Thumb; addr--; } if (addr >= GBAMemory.ROM_ADDR) { addr -= GBAMemory.ROM_ADDR; U.ForceUpdate(ReadStartAddress, addr); } if (addr >= (uint)Program.ROM.Data.Length) { return; } int count = (int)ReadCount.Value; if (count == 0) { count = 1; U.ForceUpdate(ReadCount, count); } assembly.Clear(); using (CapstoneArmDisassembler disassembler = CapstoneDisassembler.CreateArmDisassembler(disassembleMode)) { disassembler.DisassembleSyntax = DisassembleSyntax.Intel; if (syntax_att.Checked) { disassembler.DisassembleSyntax = DisassembleSyntax.Att; } if (syntax_msam.Checked) { disassembler.DisassembleSyntax = DisassembleSyntax.Masm; } // ... // // By enabling Skip Data Mode, we let Capstone will automatically skip over data and continue // disassembling at the next valid instruction it finds. if (skip_data.Checked) { disassembler.EnableSkipDataMode = true; } ArmInstruction[] instructions = disassembler.Disassemble(Program.ROM.Data.Skip((int)addr).ToArray(), GBAMemory.ROM_ADDR + addr, count); foreach (ArmInstruction instruction in instructions) { if (!instruction.IsSkippedData) { var address = instruction.Address; ArmInstructionId id = instruction.Id; if (!instruction.IsDietModeEnabled) { // ... // // An instruction's mnemonic and operand text are only available when Diet Mode is disabled. // An exception is thrown otherwise! var mnemonic = instruction.Mnemonic; var operand = instruction.Operand; assembly.AppendText(string.Format("/* {0:X} */ \t {1} \t {2}", address, mnemonic, operand)); } assembly.AppendText(System.Environment.NewLine); } } } return; }
/// <summary> /// Create an ARM Disassembler. /// </summary> /// <param name="disassembleMode"> /// The hardware mode for the disassembler to use. /// </param> /// <returns> /// An ARM disassembler. /// </returns> /// <exception cref="Capstone.Net.CapstoneException"> /// Thrown if a disassembler could not be created. /// </exception> /// <exception cref="System.OutOfMemoryException"> /// Thrown if sufficient memory cannot be allocated to perform the operation as a rare indication that the /// system is under heavy load. /// </exception> public static CapstoneArmDisassembler CreateArmDisassembler(ArmDisassembleMode disassembleMode) { return(new CapstoneArmDisassembler(disassembleMode)); }