Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
        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);
                }
            }
        }