Beispiel #1
0
        public string Visit(CIL_StrConcat node)
        {
            var code_result = "";

            var string1_len = context_function[node.StrId];
            var string2_len = context_function[node.StrId2];

            //allocate the space in node.result
            code_result += $"\t lw $t0 {string1_len}\n";
            code_result += $"\t lw $t0 0($t0)\n";

            code_result += $"\t li $a0 0\n";
            code_result += $"\t lw $t1 {string2_len}\n";
            code_result += $"\t lw $t1 0($t1)\n";
            code_result += $"\t add $a0 $t0 $t1\n";
            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";
            //guarda la direccion de la memoria allocada

            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 {string1_len}\n";
            code_result += $"\t lw $t1 {string2_len}\n";

            code_result += $"\t lw $t2 0($t0)\n";
            code_result += $"\t addi $t2 $t2 -8\n";

            code_result += $"\t lw $t4 0($t1)\n";
            code_result += $"\t addi $t4 $t4 -8\n";



            code_result += $"\t addi $t0 $t0 8\n";
            code_result += $"\t addi $t1 $t1 8\n";
            code_result += $"\t addi $v0 $v0 8\n";


            // en V0 = newstr, T0 = str1, T1 = str2, t2 = len(str1);

            code_result += $"\t .concat1: \n";
            code_result += $"\t beq $t2 $zero .endconcat1\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 .concat1\n";
            code_result += $"\t .endconcat1: \n";

            code_result += $"\t move $t2 $t4\n";

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

            return(code_result);
        }
Beispiel #2
0
 public string Visit(CIL_StrConcat node)
 {
     throw new NotImplementedException();
 }