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); }
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(""); }