Exemplo n.º 1
0
    def __init__(self):
        self.dotdata = []
        self.main_procedure = mips.MIPSProcedureNode("main")
        self.current_procedure = self.main_procedure
        self.dottext = [self.main_procedure]

        self.main_size = None
Exemplo n.º 2
0
    def generate_abort(self):
        #falta imprimir el mensaje
        self.current_procedure = mips.MIPSProcedureNode(ABORT)

        self.register_comment("Printing message")
        self.register_instruction(mips.MIPSLoadInmediateNode, v0,
                                  SYSCALL_PRINT_STR)
        self.register_instruction(mips.MIPSSyscallNode)
        self.register_empty()

        self.register_comment("Aborting execution")
        self.register_instruction(mips.MIPSLoadInmediateNode, v0, SYSCALL_EXIT)
        self.register_instruction(mips.MIPSSyscallNode)
        self.register_empty()

        self.dottext.append(self.current_procedure)
Exemplo n.º 3
0
    def visit(self, node: cil.CILFunctionNode):
        self.current_procedure = mips.MIPSProcedureNode(
            node.method_info.method_name)

        self.register_comment("Pushing $ra")
        self.register_push(ra)
        self.register_empty()

        self.register_comment("Saving $fp")
        self.register_instruction(mips.MIPSMoveNode, fp, sp)
        self.register_empty()

        self.register_comment("Reserving space for locals")
        self.register_instruction(mips.MIPSAddInmediateNode, sp, sp,
                                  -4 * len(node.localvars))
        self.register_empty()

        self.generate_args_offsets(node.arguments)
        self.generate_locals_offsets(node.localvars)

        self.register_comment("Executing instructions")
        for inst in node.instructions:
            self.visit(inst)
            self.register_empty()

        self.register_comment("Restoring saved $ra")
        self.register_instruction(mips.MIPSLoadWordNode, ra, RA_OFFSET,
                                  fp)  #stored $ra
        self.register_empty()

        self.register_comment("Restoring saved $fp")
        self.register_instruction(mips.MIPSLoadWordNode, fp, OLD_FP_OFFSET,
                                  fp)  #stored (old)$fp
        self.register_empty()

        AR = 4 * (len(node.localvars) + len(node.arguments) + 2)
        self.register_comment("Cleaning stack after call")
        self.register_instruction(mips.MIPSAddInmediateNode, sp, sp, AR)
        self.register_empty()

        self.register_comment("Return jump")
        self.register_instruction(mips.MIPSJumpRegisterNode, ra)
        self.register_empty()

        self.dottext.append(self.current_procedure)
Exemplo n.º 4
0
    def generate_strcmp_code(self):
        self.current_procedure = mips.MIPSProcedureNode(STR_CMP)

        #comparing lengths
        self.register_instruction(mips.MIPSCommentNode, "Comparing lengths")
        self.register_instruction(mips.MIPSLoadWordNode, s0,
                                  LENGTH_ATTR_OFFSET, t0)  #length offset
        self.register_instruction(mips.MIPSLoadWordNode, s1,
                                  LENGTH_ATTR_OFFSET, t1)
        self.register_instruction(mips.MIPSBranchOnNotEqualNode, s0, s1,
                                  "strcmp_neq")
        self.register_instruction(mips.MIPSEmptyInstruction)

        #comparing char by char
        self.register_instruction(mips.MIPSCommentNode,
                                  "Comparing char by char")
        self.register_instruction(mips.MIPSLoadWordNode, s0, CHARS_ATTR_OFFSET,
                                  t0)  #char array pointer offset
        self.register_instruction(mips.MIPSLoadWordNode, s1, CHARS_ATTR_OFFSET,
                                  t1)
        self.register_instruction(mips.MIPSEmptyInstruction)

        #char by char loop
        self.register_instruction(mips.MIPSLabelNode, "strcmp_loop")
        self.register_instruction(mips.MIPSLoadByteNode, s2, 0, s0)
        self.register_instruction(mips.MIPSLoadByteNode, s3, 0, s1)
        self.register_instruction(mips.MIPSBranchOnNotEqualNode, s2, s3,
                                  "strcmp_neq")

        self.register_instruction(mips.MIPSBranchOnEqualNode, s2, zero,
                                  "strcmp_eq")
        self.register_instruction(mips.MIPSJumpNode, "strcmp_loop")
        self.register_instruction(mips.MIPSEmptyInstruction)

        self.register_instruction(mips.MIPSLabelNode, "strcmp_eq")
        self.register_instruction(mips.MIPSLoadInmediateNode, a0, 1)
        self.register_instruction(mips.MIPSJumpRegisterNode, ra)
        self.register_instruction(mips.MIPSEmptyInstruction)

        self.register_instruction(mips.MIPSLabelNode, "strcmp_neq")
        self.register_instruction(mips.MIPSLoadInmediateNode, a0, 0)
        self.register_instruction(mips.MIPSJumpRegisterNode, ra)
        self.register_instruction(mips.MIPSEmptyInstruction)

        self.dottext.append(self.current_procedure)
Exemplo n.º 5
0
    def generate_copy(self):
        #copies from t1 to t0 a0 bytes
        self.current_procedure = mips.MIPSProcedureNode(COPY)

        self.register_instruction(mips.MIPSLabelNode, "copy_loop")
        self.register_instruction(mips.MIPSBranchOnEqualNode, zero, a0,
                                  "copy_end")
        self.register_instruction(mips.MIPSLoadByteNode, t7, 0, t1)
        self.register_instruction(mips.MIPSStoreByteNode, t7, 0, t0)
        self.register_instruction(mips.MIPSAddInmediateNode, t0, t0, 1)
        self.register_instruction(mips.MIPSAddInmediateNode, t1, t1, 1)
        self.register_instruction(mips.MIPSAddInmediateNode, a0, a0, -1)
        self.register_instruction(mips.MIPSJumpNode, "copy_loop")
        self.register_empty()

        self.register_instruction(mips.MIPSLabelNode, "copy_end")
        self.register_instruction(mips.MIPSJumpRegisterNode, ra)
        self.register_empty()

        self.dottext.append(self.current_procedure)
Exemplo n.º 6
0
    def generate_str_length(self):
        #calculates the length of the null-terminated char array referenced by $a0 and stores it in $a0
        self.current_procedure = mips.MIPSProcedureNode(LENGTH)

        self.register_instruction(mips.MIPSLoadInmediateNode, t6, 0)
        self.register_empty()

        self.register_instruction(mips.MIPSLabelNode, "length_loop")
        self.register_instruction(mips.MIPSLoadByteNode, t7, 0, a0)
        self.register_instruction(mips.MIPSBranchOnEqualNode, zero, t7,
                                  "length_end")

        self.register_instruction(mips.MIPSAddNode, t6, t6, 1)
        self.register_instruction(mips.MIPSAddNode, a0, a0, 1)
        self.register_instruction(mips.MIPSJumpNode, "length_loop")
        self.register_empty()

        self.register_instruction(mips.MIPSLabelNode, "length_end")
        self.register_instruction(mips.MIPSMoveNode, a0, t6)
        self.register_instruction(mips.MIPSJumpRegisterNode, ra)
        self.register_empty()

        self.dottext.append(self.current_procedure)
Exemplo n.º 7
0
    def generate_exit_program(self):
        self.current_procedure = mips.MIPSProcedureNode(EXIT)

        #que vamos a hacer

        self.dottext.append(self.current_procedure)