Closed nicolaspoli closed 1 month ago
¡Hola!
Algunas de las funciones externas (por ejemplo, las que imprimen texto), hacen uso de los registros caller-saved a0 y a1. Dado que son los que poseen los punteros a tus Pokémon, si no cuidas respaldar su valor antes y recuperarlo posterior al llamado, podrías terminar haciendo operaciones de lectura con un valor que tiene una dirección no habilitada.
En resumen: respalda a0 y a1 antes de cada llamado de subrutina. Luego, recupéralos y vuelve a hacer las lecturas y escrituras. Ahí debería funcionar.
¡Saludos!
Hola, gracias por responder!
Si los respaldo :c por ejemplo si hago el respaldo
[censurado]
y luego de la llamada intento hacer
[censurado]
la linea "lw t5, 0(a0)" da el error que comento arriba
Si te fijas bien en lo que compartiste, primero usas a0 como dirección y luego lo recuperas. Debe ser al revés:
lw a0, 4(sp) lw t5, 0(a0)
Ahí sí estás usando el valor original de a0 como dirección.
Avísame si con eso se arregla.
pero eso no haría que perdiera el valor de a0 que se guarda de la subrutina primero? (esto es attack)
Hola! En general todas las subrutinas que deben llamar cambian varios registros, entre ellos el registro a0 y a1. Si luego de una subrutina quieres usar estos registros dado que contenían un valor relevante para tu subrutina, debes respaldarlos antes en el stack y luego, al terminar la subrutina que fue llamada, puedes recuperarlos (buscandolos en el stack). Y porfavor no incluir código en las issues :)
nunca le respondí al final ups, ahora que por fin terminé, les doy las gracias por la ayuda :)
Hola!
Constantemente estoy teniendo el error "Runtime exception at 0x004005d0: Load address not aligned to word boundary 0xfffffffd" con el uso de lw, y el equivalente en sw. Por que podría ser? He buscado info pero las respuestas que encuentro no veo que se puedan aplicar a este caso
Gracias de antemano