package zinara.ast.instructions; import zinara.ast.expression.Expression; import zinara.ast.expression.BooleanExp; import zinara.ast.type.Type; import zinara.code_generator.*; import zinara.exceptions.InvalidCodeException; import zinara.exceptions.TypeClashException; import java.io.IOException; public class Return extends Instruction{ private Expression expr; public Return(Expression ex){ this.expr = ex; } public Expression getExpression(){ return this.expr; } public String toString() { return "<Return " + expr + ">"; } public void tox86(Genx86 generator) throws IOException,InvalidCodeException{ expr.register = register; //Type exprType = expr.getType(); Type exprType = expr.type; String expReg = generator.regName(expr.register,exprType); String asm = ""; String frame_p = generator.frame_pointer(); String stack_p = generator.stack_pointer(); String word_size = Integer.toString(generator.word_size()); /*En x86, el resultado de las funciones se deja en rax(64bits)/eax(32bits) */ String ax = generator.regName(0,exprType); if (expr instanceof BooleanExp){ String ret = generator.newLabel(); boolValue(generator,expr,ret,ax); generator.writeLabel(ret); } else expr.tox86(generator); //Resultado en el registro ax asm += generator.mov(ax,expReg); //Se desempila todo que esta despues de la cadena dinamica asm += generator.mov(stack_p,frame_p); //Se restaura la cadena dinamica asm += generator.mov(frame_p,"["+stack_p+"]"); //Se pone el stack pointer a apuntar a la direccion de retorno asm += generator.add(stack_p,word_size); //Return asm += generator.ret(); generator.write(asm); } }