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)"); } }
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)"); } }
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; } }