Example #1
0
        public string Visit(CIL_LoadStr node)
        {
            var string_content = datareference[node.StrId];
            var string_len     = string_content.Length;
            var code_result    = "";

            //allocate the space in node.result
            code_result += $"\t li $a0 {string_len+8}\n";                  //Set $a0 with the param, meaning the size of the allocation
            code_result += $"\t li $v0 9\n";
            code_result += $"\t syscall\n";                                // llama a la funcion allocate
            code_result += $"\t sw $v0 {context_function[node.Result]}\n"; //guarda la direccion de la memoria allocada

            //llena la direccion allocada con //tamano,typo,datos
            code_result += $"\t li $t0 {string_len + 8}\n";                //carga en t0 el tamano
            code_result += $"\t lw $t1 {context_function[node.Result]}\n"; //obtiene la direccion en t1
            code_result += $"\t sw $t0 0($t1)\n";                          //guarda en la primera posicion el tamano
            code_result += $"\t la $t2 String\n";                          //guarda la direccion del tipo String
            code_result += $"\t sw $t2 4($t1)\n";

            code_result += $"\t la $a1 {node.StrId}\n";
            code_result += $"\t lw $t2 {context_function[node.Result]}\n";
            var idx = 0;

            //llena en los bytes restantes el valor del string
            for (int i = 8; i < string_len + 8; i++)
            {
                code_result += $"\t lbu $t1 {idx}($a1)\n";
                code_result += $"\t sb $t1 {i}($t2)\n";
                idx++;
            }
            return(code_result);
        }
Example #2
0
        public string Visit(CIL_LoadStr node)
        {
            int idx  = dataaddr[node.StrId];
            int size = mem.GetValue(idx);
            int all  = mem.Allocate(size + 1);

            for (int i = 0; i < size + 1; i++)
            {
                mem.SetValue(all + i, mem.GetValue(idx + i));
            }
            mem.SetValue(variableaddr.Peek()[node.Result], all);
            //(new CIL_IOPrint(node.Result)).Visit(this);
            return("");
        }