Problemas de alineación

De Romhack Hispano

Nota: este artículo es un mirror de este artículo de Tales Translations y está enfocado al procesador MIPS, y hace referencias a la traducción del Tales of Eternia. Es posible que sea aplicable a otros procesadores y ámbitos.

XYfbP1 <a href="http://nlrtzfezeytv.com/">nlrtzfezeytv</a>, [url=http://snlzozzebjpi.com/]snlzozzebjpi[/url], [link=http://rznaskvyjhpj.com/]rznaskvyjhpj[/link], http://nhgrvqforxus.com/

[editar] Copia rápida de datos

Al copiar datos de forma rápida se usan punteros de 32 bits y la instrucción LW, en cuyo caso deben estar alineadas las direcciones de memoria usadas a 32 bits y tener una longitud múltiplo de 4.

En el Tales of Eternia los datos de las habitaciones están empaquetados por habitaciones y en cada habitación hay diversos archivos que tienen una alineación de 32 bits.

[editar] Lectura de valores de 2 y 4 bytes

Los datos de tipo short e int deben estar alineados a 2 y 4 bytes. Los compiladores suelen alinear todos los datos a 4 bytes en el ejecutable para que al cargar en memoria sigan alineados y se puedan acceder igualmente.

Este hecho tiene implicaciones muy importantes que hay que tener en cuenta:

- Cuando busca punteros, tarda bastante en buscar números en las direcciones múltiples de 4. - Las "strings" o cadenas terminadas en \0 están alineadas a 4 bytes dejando bytes \0 libres para la alineación. Suponiendo que las cadenas se lean mediante LB (Load Byte) como suele ser normal, se podrá disponer de espacio adicional.

[editar] Centinelas

En ciertas circunstancias se usan centinelas de 16 y 32 bits para determinar cuándo termina una secuencia.

En el Tales of Eternia los textos con scripts tinene inserciones de variables o códigos especiales, como por ejemplo escribir un texto mas rápido o mas lento, escribir el nombre de un personaje, la cantidad de dinero, etc.

Estos códigos especiales empiezan por un código de control <= 0x20 y tienen una longitud par. Dicho código puede tener una longitud variable y se utiliza un centinela (una secuencia fija de bytes para conocer el fin de una sucesión). El centinela, pese a ser una sucesión de 32 bits, se comprueba cada 16 bits usando LH un (short *) en C. Para solucionar este problema, en el juego antes de un código de control se usa el caracter 0x1f (caracter dummy) para alinear el texto si la dirección de memoria es impar, es decir, no está alineado a 2 bytes.

G46ch6 <a href="http://bkflqpcaxvuq.com/">bkflqpcaxvuq</a>, [url=http://pxxqgdejbmsw.com/]pxxqgdejbmsw[/url], [link=http://qpyfrqwfhdlz.com/]qpyfrqwfhdlz[/link], http://hshggwejaecc.com/

Herramientas personales
Romhack Hispano