예제 #1
0
        public void EmitInstruction(InstructionNode node)
        {
            EmitOpCode((OpCodes)Enum.Parse(typeof(OpCodes), node.Name, true));

            var type = node.GetTypeInfo();

            switch (type)
            {
            case InstructionType.LitReg:
                EmitLit(node.GetArg <HexLiteralNode>(0));
                EmitReg(node.GetArg <RegisterLiteralNode>(1));
                break;

            case InstructionType.RegLit:
                EmitReg(node.GetArg <RegisterLiteralNode>(0));
                EmitLit(node.GetArg <HexLiteralNode>(1));
                break;

            case InstructionType.RegLit8:
                EmitReg(node.GetArg <RegisterLiteralNode>(0));
                EmitLit8(node.GetArg <LiteralNode>(1));
                break;

            case InstructionType.Reg:
                EmitReg(node.GetArg <RegisterLiteralNode>(0));
                break;

            case InstructionType.RegReg:
                EmitReg(node.GetArg <RegisterLiteralNode>(0));
                EmitReg(node.GetArg <RegisterLiteralNode>(1));
                break;

            case InstructionType.RegPtrReg:
                EmitReg(node.GetArg <RegisterLiteralNode>(0));
                EmitReg(node.GetArg <RegisterLiteralNode>(1));
                break;

            case InstructionType.Lit:
                EmitLit(node.GetArg <HexLiteralNode>(0));
                break;

            case InstructionType.LitMem:
                EmitLit(node.GetArg <HexLiteralNode>(0));
                EmitMem(node.GetArg <AddressLiteralNode>(1));
                break;

            case InstructionType.RegMem:
                EmitReg(node.GetArg <RegisterLiteralNode>(0));
                EmitMem(node.GetArg <AddressLiteralNode>(1));
                break;

            case InstructionType.MemReg:
                EmitMem(node.GetArg <AddressLiteralNode>(0));
                EmitReg(node.GetArg <RegisterLiteralNode>(1));
                break;

            case InstructionType.LitOffReg:
                EmitLit(node.GetArg <HexLiteralNode>(0));
                EmitReg(node.GetArg <RegisterLiteralNode>(1));
                EmitReg(node.GetArg <RegisterLiteralNode>(2));
                break;
            }
        }