public string GetSymbolPostfix(ConcreteInstruction instr) { if (verbose && instr.NoOfArgBytes > 0) { string postfix = dualScope.findUsedSymbol(instr.Argument); return(postfix == null ? "" : " " + postfix); } return(""); }
private void OutputDisassembledPart(ConcreteInstruction instr) { int missingArgBytes = instr.MissingBytes; switch (instr.NoOfArgBytes) { case 0: output.WriteLine(""); break; case 1: if (0 == missingArgBytes) { if (verbose && instr.IsBranchInstruction) { // special case for branch instructions output.WriteLine(" {0}", GetArg1OrBranchDestination(instr)); } else if (verbose && instr.IsZeroAddressing) { // special postfix for instructions with symbols output.WriteLine(" {0:X2}{1}", instr.Arg1, GetSymbolPostfix(instr)); } else { output.WriteLine(" {0:X2}", instr.Arg1); } } else { output.WriteLine(" ??"); } break; case 2: if (0 == missingArgBytes) { // special postfix for instructions with symbols output.WriteLine(" {1:X2}{0:X2}{2}", instr.Arg1, instr.Arg2, GetSymbolPostfix(instr)); } else if (1 == missingArgBytes) { output.WriteLine(" ??{0:X2}", instr.Arg1); } else { output.WriteLine(" ????"); } break; default: Debug.Fail("bad instruction.NoOfArgBytes"); output.WriteLine("?????"); break; } }
public string GetArg1OrBranchDestination(ConcreteInstruction instr) { if (instr.IsBranchInstruction) { sbyte offset = (sbyte)instr.Arg1; int destination = CalcRealAddr(instr) + 2 + offset; return(string.Format("{0}{1}>{2:X2}", offset >= 0 ? "+" : "", offset, destination & 0xFF)); } else { return(string.Format("{0:X2}", instr.Arg1)); } }
public void OnNext(byte value) { if (IsInTextDataMode) { if (TextDataBlock.isPrintable(value)) { textDataBlock.Append(value); if (textDataBlock.CurNoOfBytes == 16) { FlushTextDataAndLeaveTextDataMode(); EnterTextDataMode(); } } else { FlushTextDataAndLeaveTextDataMode(); // recurse to processs value now OnNext(value); } } else { if (instr == null) { instr = new ConcreteInstruction(posStart, value); } else { instr.Append(value); } if (instr.IsComplete) { FlushInstruction(); if (instr.IsTextDataLabel) { EnterTextDataMode(); } instr = null; } } }