private void EvaluateAsmCmp(BinaryASMInstruction cmp) { long?source = null; long?destination = null; var sourceState = EvaluateSource(cmp.Source); if (cmp.Desination is IdentifierExpression identifierDest) { var destState = registers[identifierDest.Identifier]; source = long.Parse(sourceState.Value); destination = long.Parse(destState.Value); } else if (cmp.Desination is IndexingExpression indexingDest) { // // Evaluate. // context.IsAssemblyContext = true; var destState = VisitAssemblyInstruction(indexingDest.Expression); context.IsAssemblyContext = false; // // Get the value from the heap. // var offset = (int)long.Parse(destState.Value); source = long.Parse(sourceState.Value); destination = heap.Read(offset); } var result = destination - source; flags["SF"] = 0; flags["ZF"] = 0; flags["CF"] = 0; if (result <= -1) { flags["SF"] = 1; } if (result == 0) { flags["ZF"] = 1; } if (source > destination) { flags["CF"] = 1; } }
private void EvaluateAsmShl(BinaryASMInstruction shl) { var sourceState = EvaluateSource(shl.Source); if (shl.Desination is IdentifierExpression identifierDest) { var destState = registers[identifierDest.Identifier]; var result = (int.Parse(sourceState.Value) << int.Parse(destState.Value)); destState.Value = result.ToString(); registers[identifierDest.Identifier] = destState; if (context.IsExplain) { printer.Print(new Run() { Text = identifierDest.Identifier, Color = Colors.White }); PrintAsBitSet((int)long.Parse(destState.Value)); } } else if (shl.Desination is IndexingExpression indexingDest) { // // Evaluate. // context.IsAssemblyContext = true; var destState = VisitAssemblyInstruction(indexingDest.Expression); context.IsAssemblyContext = false; // // Get the value from the heap. // var offset = (int)long.Parse(destState.Value); var sourceValue = (int)long.Parse(sourceState.Value); var destValue = heap.Read(offset); var result = (sourceValue << destValue); heap.Write(result, offset); if (context.IsExplain) { printer.Print(new Run() { Text = $"[{offset}] : {result}", Color = Colors.White }); PrintAsBitSet(result); } } }