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.
Tabla de contenidos |
[editar] ¿En qué consiste que una dirección esté alineada?
Una dirección está alineada a 2 bytes cuando dicha dirección es:
- múltiplo de 2
- dirección % 2 == 0
- la dirección es par
- bit menos significativo == 0
- dirección & 1 == 0
Las 5 definiciones son equivalentes.
Una dirección está alineada a 4 bytes cuando dicha dirección es:
- múltiplo de 4
- dirección % 4 == 0
- dos bits menos significativos == 0
- dirección & 3 == 0
Las 4 definiciones son equivalentes
[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/

