› Foros › Retro y descatalogado › PlayStation
tchusami escribió:Yo la verdad esta version del MIPS no la he trabajado, trabajé el MIPS 3000 en 1º de carrera, y no veiamos los Delay Slot, aun asi, hay dos tipos de Delay Slot, para 1 o para 3 instrucciones. Es importante saber cual de los dos es el que utiliza este procesador, ya que si no rellenas todos los huecos se ejecutaran instrucciones que no deben y si rellenas mas de la cuenta pueden no ejecutarse instrucciones que si deben ejecutarse, en otro caso si no puedes rellenar con instrucciones utiles puedes hacerlo con nop que es una instruccion que no modifica el estado del procesador.
Espero que te sirva de algo, es lo unico que puedo aportar.
Un saludo,
tchusami.
anonimeitor escribió:El addiu es una simple suma inmediata sin signo ni overflow, así que ese loc_0 que tienes es una constante que estará definida en algún lado, y no un registro.
En la otra cuestión, sí hay un delay con esa instrucción de salto, por lo que s1 valdrá 4 siempre.
anonimeitor escribió:loc_0 es la posición donde está el addiu $SP, -16, así que s1, inicialmente, apunta a esa dirección de memoria, pues v1 es 0. Es un valor fijo que se calcula al compilar, pues hasta entonces no vas a saber dónde se va a situar ese código. Precisamente por eso se pone loc_0, para que sea el compilador quien se encargue de poner el valor inmediato sin signo.
... (lo que haya antes)
1234: addiu $SP, -16
1238: sw $ra, 12($sp)
123C: lui $v1, 0
1240: sw $s2, 8($sp)
1244: lui $s2, 0
1248: sw $s1, 4($sp)
124C: addiu $s1, $v1, 0x1234
1250: sw $s0, 0($sp)
1254: move $s0, $zero
... (lo que haya después)
anonimeitor escribió:Esa da la impresión que lo que hace es poner esa dirección en la pila, como si fuese un parámetro, para ser tratado de alguna forma.
anonimeitor escribió:Manda huevos, que diría uno. Pues me parece un fallo bastante gordo del IDA.
anonimeitor escribió:Normalmente todo suele estar alineado a 4 bytes, que es una de las cosas que da rapidez a estos micros, pero en ocasiones los datos no tienen por qué estarlo, así que por eso se emplean lwl/lwr/swr/swl. Como es lógico, al hacer un memcpy los offsets origen y destino no tienen por qué ser múltiplos de 4, y es el motivo de estas cosas tan aparentemente "extrañas".
Si $a1 apunta a los datos A-B-C-D-E-F-G-... (con letras, para verlo más claro), se hace lo siguiente:Y si no me he equivocado en mucho, creo que eso es lo que hace. No recuerdo si el dato se guarda en $at como A-B-C-D o hay algún valor al revés, pero como sólo suelen usarse los lwl/lwr justo antes de los swl/swr y para poco más, no me interesa mucho saberlo.
- primero lee 32 bits de $a1 en $at:
- "lwl $at, 3($a1)" coge el word a la izquierda de $a1+3, es decir, los bytes 3 y 2, C-D, y lo pone en la parte baja de $at
- "lwr $at, 0($a1)" coge el word a la derecha de $a1+0, es decir los bytes 0 y 1, A-B, y lo pone en la parte alta de $at
- ahora ya tenemos A-B-C-D en $at
(aquí ya se ve lo "raro" de estas instrucciones, pues una lee "hacia adelante" y otra "hacia atrás", pero siempre van a ir juntas porque una lee el word superior del registro y otra el inferior, y da igual el orden en el que se pongan ambas instrucciones)- luego guarda los 32 bits de $at en $a0 usando el mismo sistema (imagino que te has comido el swl, que es totalmente necesario)