private void PrintAssemblyCode(Code <int> code, ScopeStructure <int> scope, TextWriter output) { output.Write("\t"); for (int i = 0; i < code.Parameters.Length; i++) { // support EA macro in inline assembly if (!scope.IsLocalLabelExisted(code.Parameters[i].ToString()) && !scope.GetSymbolValue(code.Parameters[i].ToString()).CausedError) { output.Write(" #0x{0:X}", Folding.Fold(code.Parameters[i], (x => this.GetSymbolValue(scope, x))).Result); } else { output.Write(" {0}", code.Parameters[i].ToString()); } if (i == 0) { output.Write("\t"); if (code.Parameters[0].ToString() == "push" || code.Parameters[0].ToString() == "pop") { output.Write("{"); } } if (i != code.Parameters.Length - 1) { if (i != 0) { output.Write(","); } if (code.Parameters[0].ToString().StartsWith("ldr") || code.Parameters[0].ToString().StartsWith("str")) { if (i == 1) { output.Write("["); } } // Console.WriteLine(code.Parameters[i + 1].ToString()); if (System.Text.RegularExpressions.Regex.IsMatch(code.Parameters[i + 1].ToString(), @"^\d+$")) { output.Write("#"); } } else { if (code.Parameters[0].ToString() == "push" || code.Parameters[0].ToString() == "pop") { output.Write(" }"); } else if (code.Parameters[0].ToString().StartsWith("ldr") || code.Parameters[0].ToString().StartsWith("str")) { output.Write(" ]"); } output.Write("\n"); } } }
private int?GetSymbolValue(ScopeStructure <int> scope, string symbolName) { if (symbolName.Equals(currentOffsetCode, StringComparison.OrdinalIgnoreCase) || symbolName.Equals(offsetChanger, StringComparison.OrdinalIgnoreCase)) { return(new int?(this.currentOffset)); } CanCauseError <IExpression <int> > symbolValue = scope.GetSymbolValue(symbolName); if (symbolValue.CausedError) { return(new int?()); } CanCauseError <int> canCauseError = Folding.Fold(symbolValue.Result, (x => this.GetSymbolValue(scope, x))); if (canCauseError.CausedError) { return(new int?()); } return(new int?(canCauseError.Result)); }