Exemple #1
0
        public Op GetJumpOp(AssemblyBuilder.AssemblyFunctionBuilder currentFunction)
        {
            switch (type)
            {
            case OperandTokenType.Literal:
                if (isAddressOf)
                {
                    throw new InvalidOperationException();
                }


                return(new Op(isDereference ? Operands.AddressInfoMask : Operands.LiteralInfoMask, op));

            case OperandTokenType.Label:
                Boolean isFrameOffset = true;
                UInt64  labelOp;
                if (!currentFunction.instructionLabels.TryGetValue(text, out labelOp))
                {
                    //
                    // TODO: Add check for dataOffset.  If it is true, then set isFrameOffset to false
                    //
                    throw new FormatException(String.Format("For Op {0}, could not find instruction label '{1}'",
                                                            ToString(), text));
                }
                if (isAddressOf)
                {
                    throw new NotImplementedException();
                }

                if (isDereference)
                {
                    return(new Op(isFrameOffset ? Operands.FrameOffsetDereferenceInfoMask : Operands.AddressDereferenceInfoMask,
                                  labelOp + op));
                }
                return(new Op(isFrameOffset ? Operands.FrameOffsetInfoMask : Operands.AddressInfoMask,
                              labelOp));

            case OperandTokenType.FramePointer:
                throw new InvalidOperationException();

            case OperandTokenType.DataPointer:
                throw new InvalidOperationException();

            default:
                throw new InvalidOperationException(String.Format("Toke Type {0} unrecognized", type));
            }
        }
Exemple #2
0
        public MemoryOp GetMemoryOp(AssemblyBuilder.AssemblyFunctionBuilder currentFunction)
        {
            switch (type)
            {
            case OperandTokenType.Literal:
                if (isAddressOf)
                {
                    throw new InvalidOperationException();
                }
                if (!isDereference)
                {
                    throw new InvalidOperationException("You must dereference a literal (add '(#num)') if you are writing to it");
                }

                return(new MemoryOp(Operands.AddressInfoMask, op));

            case OperandTokenType.Label:
                Boolean isFrameOffset = true;
                UInt64  labelOp;
                if (!currentFunction.frameOffsetLabels.TryGetValue(text, out labelOp))
                {
                    //
                    // TODO: Add check for dataOffset.  If it is true, then set isFrameOffset to false
                    //
                    throw new FormatException(String.Format("For Op {0}, could not find label '{1}'",
                                                            ToString(), text));
                }

                if (isAddressOf)
                {
                    throw new InvalidOperationException("For a memory op, you can't use address of ('&') on a label because it is not writable");
                }

                if (isDereference)
                {
                    return(new MemoryOp(isFrameOffset ? Operands.FrameOffsetDereferenceInfoMask : Operands.AddressDereferenceInfoMask,
                                        labelOp + op));
                }
                return(new MemoryOp(isFrameOffset ? Operands.FrameOffsetInfoMask : Operands.AddressInfoMask, labelOp));

            case OperandTokenType.FramePointer:
                if (isAddressOf)
                {
                    throw new InvalidOperationException();
                }
                if (!isDereference)
                {
                    throw new NotImplementedException("Right now, the frame pointer must be dereferenced");
                }

                return(new MemoryOp(Operands.FrameOffsetInfoMask, op));

            case OperandTokenType.DataPointer:
                if (isAddressOf)
                {
                    throw new InvalidOperationException();
                }
                if (!isDereference)
                {
                    throw new NotImplementedException("Right now, the data pointer must be dereferenced");
                }

                return(new MemoryOp(Operands.AddressInfoMask, op));

            default:
                throw new InvalidOperationException(String.Format("Toke Type {0} unrecognized", type));
            }
        }