Exemple #1
0
        private ParsedOperand ParsePtrOperand(PrimitiveType width)
        {
            Expect(Token.PTR);
            ParsedOperand op = ParseOperand();

            op.Operand.Width = width;
            return(op);
        }
Exemple #2
0
        public ParsedOperand [] ParseOperandList(int min, int max)
        {
            OperandParser        opp = asm.CreateOperandParser(lexer);
            List <ParsedOperand> ops = new List <ParsedOperand>();

            asm.SegmentOverride = RegisterStorage.None;
            asm.AddressWidth    = asm.SegmentAddressWidth;
            if (lexer.PeekToken() != Token.EOL)
            {
                ops.Add(opp.ParseOperand());
                if (opp.SegmentOverride != RegisterStorage.None)
                {
                    asm.SegmentOverride = opp.SegmentOverride;
                }
                if (opp.AddressWidth != null)
                {
                    asm.AddressWidth = opp.AddressWidth;
                }

                while (lexer.PeekToken() == Token.COMMA)
                {
                    lexer.DiscardToken();
                    opp.DataWidth = ops[0].Operand.Width;
                    ops.Add(opp.ParseOperand());
                    if (opp.SegmentOverride != RegisterStorage.None)
                    {
                        if (asm.SegmentOverride != RegisterStorage.None)
                        {
                            Error("Can't have two segment overrides in one instruction");
                        }
                        asm.SegmentOverride = opp.SegmentOverride;
                    }
                    if (opp.AddressWidth != null)
                    {
                        asm.AddressWidth = opp.AddressWidth;
                    }
                }
            }

            if (min <= ops.Count && ops.Count <= max)
            {
                ParsedOperand [] o = new ParsedOperand[ops.Count];
                ops.CopyTo(o);
                return(o);
            }
            else
            {
                if (min == max)
                {
                    Error(string.Format("Instruction expects {0} operand(s).", min));
                }
                else
                {
                    Error(string.Format("Instruction expects between {0} and {1} operand(s).", min, max));
                }
                return(null);
            }
        }