Autor |
Mensaje |
yuafan2
Nivel 4
Edad: 36
Registrado: 06 Feb 2007
Mensajes: 69
Ubicación: San Miguel - Bs As.
Carrera: Informática
|
|
Hola, necesitaria si alguien me puede ayudar a coomprender que esta haciendo el siguiente codigo en mips, porq la verdad que no entiendo nada.
Saludos
ADD r2,r0,r0
004 loop SLLI r1,r2, 2
008 SW 16(r1),r2
00C ADDI r2,r2,1
SLI r3,r2,12
SLT $at, $r3, $zero;
BEQ $at, $zero, loop
JMP label
….
….
512 label ADD r5,r6,r7
|
|
|
|
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
Está medio horrible el formato en el que lo pegaste, y además con ese fragmento no puede hacerse seguimiento de valores porque depende de cosas que pasaron antes.
Acá tenés la referencia de los mnemónicos: http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html (algunos de los que tenés en tu ejemplo tienen sufijos para el tipo de variable)
Las cosas que pusiste antes de las instrucciones son o número de byte del código o etiquetas (004, 008, 00C, 512: números, loop y label: etiquetas). Ese "$r3" en el STL tiene pinta de error, debería decir "r3" a secas.
Tal vez te sirva pegarle un vistazo a esto: https://www.cs.tcd.ie/Jeremy.Jones/vivio/dlx/dlxtutorial.htm
(Lo único que no tenés ahí es lo del SLT + BEQ; básicamente lo branches de MIPS no hacen comparaciones de números, lo que hace el SLT es guardar el resultado de la comparación como un booleano en "$at" (donde ese $at es algún registro que está decidiendo el ensamblador o alguna macro) y el BEQ hace el loop dependiendo de si "$at" está o no en cero.)
Igual, el código que tenés es medio un pijazo; está accediendo a vectores de enteros de 32bits y parte del código que ves es hacer el direccionamiento de eso. Las multiplicaciones de los índices por el sizeof(int) las está haciendo con corrimientos de bits.
|
|
|
|
_________________
|
|
|
|
|
Hache
Nivel 8
Registrado: 13 May 2010
Mensajes: 574
Carrera: Informática
|
|
Que no es algo como....
Código:
|
r2 = r2+r0;
do{
r1 = r2<<2;
*r1 = r2;
r2 = r2+1;
if(r2<12)
r3=1;
if(r3<0)
at=1;
}while(at=0);
...
...
r5=r6+r7;
|
Claro que me puedo equivocar....
Sebastian Santisi escribió:
|
Igual, el código que tenés es medio un pijazo
|
|
|
|
|
_________________
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
Editando sobre el tuyo:
Código:
|
r2 = 2*r0;
do{
r1 = r2<<2;
v[r1] = r2; // Donde v es un vector que arranca en 16; las dos últimas líneas, yo las veo equivalentes a "v[r2] = r2", con int v[].
r2++;
/*
La verdad es que no sé qué es SLI, pero si fuera lo que entendiste vos me suena más a "r3 = r2 < 12" que a:
if(r2<12)
r3=1;
De todos modos, no me suena a que sea una comparación el SLI; se me hace que debería decir SUB y que el objetivo final es iterar mientras que r2 < 12 */
*/
while(r3 >= 0);
r5=r6+r7; // Esta línea queda inmediata al while.
|
[edit]
O sea, completo y emprolijado me suena a:
Código:
|
int *v = 16;
for(i = 2*a; i < 12; i++)
v[i] = i;
|
Y si me dicen que r0 vale cero queda pipí-cucú.
[/edit]
|
|
|
|
_________________
Última edición por Sebastian Santisi el Dom Jul 28, 2013 10:50 pm, editado 1 vez
|
|
|
|
|
Hache
Nivel 8
Registrado: 13 May 2010
Mensajes: 574
Carrera: Informática
|
|
Tenes razon. Bah, interpreté que SLI es 'set if less than', asi que claro, si no es tiene que poner cero.
|
|
|
|
_________________
|
|
|
|
|
|
|
Ver tema siguiente
Ver tema anterior
Podés publicar nuevos temas en este foro No podés responder a temas en este foro No podés editar tus mensajes en este foro No podés borrar tus mensajes en este foro No podés votar en encuestas en este foro No Podéspostear archivos en este foro No Podés bajar archivos de este foro
|
Todas las horas son ART, ARST (GMT - 3, GMT - 2 Horas)
Protected by CBACK CrackerTracker365 Attacks blocked.
|