예제 #1
0
        public string Visit(CIL_StrStr node)
        {
            var code_result = "";
            var stringref   = context_function[node.StrId];
            var destiny     = context_function[node.Result];

            code_result += $"\t lw $t0 {stringref}\n";
            code_result += $"\t lw $t0 0($t0)\n";
            code_result += $"\t addi $t0 $t0 -8\n";
            //I
            code_result += $"\t lw $t1 {context_function[node.I]}\n";
            //L
            code_result += $"\t lw $t2 {context_function[node.L]}\n";

            //L+I inside?

            code_result += $"\t lw $t3 {stringref}\n";
            code_result += $"\t move $a0 $t1\n";
            code_result += $"\t add $a0 $a0 $t2\n";
            code_result += $"\t sle $t4, $a0, $t0\n";
            code_result += $"\t la $a0 error_indexout\n";
            code_result += $"\t beq $t4, $zero, exception\n";

            code_result += $"\t lw $t0 {stringref}\n";
            code_result += $"\t lw $t0 0($t0)\n";
            code_result += $"\t lw $t3 {stringref}\n";
            code_result += $"\t li $a0 0\n";
            code_result += $"\t addi $a0 $t2 0\n";
            //branch para la excepttion

            //copy the substring
            //allocate first
            code_result += $"\t addi $a0 $a0 8\n";
            code_result += $"\t li $v0 9\n";
            code_result += $"\t syscall\n"; // allocate
            code_result += $"\t sw $v0 {context_function[node.Result]}\n";

            code_result += $"\t la $t2 String\n";

            code_result += $"\t sw $a0 0($v0)\n"; // save len

            code_result += $"\t sw $t2 4($v0)\n"; // save type

            code_result += $"\t lw $t0 {stringref}\n";

            code_result += $"\t lw $t1 {context_function[node.I]}\n";


            code_result += $"\t addi $t0, $t0, 8\n"; //saltate el tipo y tamano
            code_result += $"\t addi $v0, $v0, 8\n"; //saltate el tipo y tamano

            //I
            code_result += $"\t lw $t1 {context_function[node.I]}\n";
            //L
            code_result += $"\t lw $t2 {context_function[node.L]}\n";

            code_result += $"\t add $t0, $t0, $t1\n";//parate en I

            code_result += $"\t .sub: \n";
            code_result += $"\t beq $t2 $zero .endsub\n";
            code_result += $"\t lb $t3 0($t0)\n";
            code_result += $"\t sb $t3 0($v0)\n";
            code_result += $"\t addi $t2, $t2, -1\n";
            code_result += $"\t addi $t0, 1\n";
            code_result += $"\t addi $v0, 1\n";
            code_result += $"\t j .sub\n";
            code_result += $"\t .endsub: \n";


            return(code_result);
        }
예제 #2
0
 public string Visit(CIL_StrStr node)
 {
     throw new NotImplementedException();
 }