示例#1
0
 public override void OnCodeGenVisit(AssemblyGenerator assembler)
 {
     assembler.AllocMemory(Identifier);
     if (Init != null)
     {
         Init.OnCodeGenVisit(assembler);
         string postfix = ((VariableSymbol)symbol).VariableType == VariableType.Char ? "b" : "l";
         string target  = ((VariableSymbol)symbol).VariableType == VariableType.Char ? "%al" : "%eax";
         assembler.EmitCode($"\tmov{postfix} {target}, {assembler.GetVariableOffset(this.Identifier)}(%ebp)");
     }
 }
示例#2
0
        public override void OnCodeGenVisit(AssemblyGenerator assembler)
        {
            int offset = assembler.GetVariableOffset(Identifier);

            Value.OnCodeGenVisit(assembler);
            if (Identifier.isVariable())
            {
                assembler.EmitCode($"\tmovl %eax, {offset}(%ebp)");
            }
            else
            {
                assembler.EmitCode($"\tmovl %eax, {offset}(%ebp)");
            }
        }
示例#3
0
        public override void OnCodeGenVisit(AssemblyGenerator assembler)
        {
            Expression.OnCodeGenVisit(assembler);
            switch (Operator)
            {
            case UnaryOperator.Not:
                assembler.EmitCode($"\tsete %al");
                break;

            case UnaryOperator.Address:
                if (Expression.Type != SyntaxNodeType.Identifier)
                {
                    throw new SemanticError("Cannot address rvalue");
                }
                Identifier addrVariable = Expression.As <Identifier>();
                assembler.EmitCode($"\tleal {assembler.GetVariableOffset(addrVariable)}(%ebp),%eax");
                break;

            case UnaryOperator.Dereference:
                assembler.EmitCode($"\tmovl (%eax),%eax");
                break;
            }
        }