2010-12-31 20 views
8

Estoy dedicando un tiempo a la programación de ensamblaje (Gas, en particular) y recientemente aprendí sobre la directiva de alineación. Creo que he entendido lo básico, pero me gustaría obtener una comprensión más profunda de su naturaleza y cuándo utilizar la alineación.¿Cuándo deberían usarse directivas explícitas de alineación en el ensamblaje?

Por ejemplo, me pregunté sobre el código de ensamblado de una simple declaración de cambio de C++. Sé que en determinadas circunstancias cambian declaraciones se basan en las tablas de salto, como en las siguientes líneas de código:

.section .rodata 
    .align 4 
    .align 4 
.L8: 
    .long .L2 
    .long .L3 
    .long .L4 
    .long .L5 
    ... 

.Align 4 alinea los datos siguientes en la siguiente límite de 4 bytes que asegura que ir a buscar estos memoria ubicaciones es eficiente, ¿verdad? Creo que esto se hace porque puede haber cosas sucediendo antes de la declaración de cambio que causó la desalineación. Pero ¿por qué hay realmente dos llamadas a .align? ¿Hay alguna regla práctica para llamar a .align o simplemente debe hacerse cuando se almacena un nuevo bloque de datos en la memoria y algo antes de esto podría haber causado la desalineación?

En el caso de las matrices, parece que la alineación se realiza en los límites de 32 bytes tan pronto como la matriz ocupa al menos 32 bytes. ¿Es más eficiente hacerlo de esta manera o hay otra razón para el límite de 32 bytes?

Agradecería cualquier explicación o sugerencia sobre literatura.

+2

Mi dominio del lenguaje ensamblador está limitado a 6510, que no tenía instrucciones alineadas. Pero basado en mi conocimiento de la alineación de la memoria en la configuración de C++, supongo que la instrucción de "alineación" no es una instrucción real de la CPU. Podría ser simplemente una directiva de ensamblador, indicando dónde insertar los próximos códigos de operación. Si es así, dos directivas de alineación en una fila son lo mismo que encontrar una sola. –

+0

Pensé que '.align 2' alinea el código con 2^2 = 4 bytes. En su caso donde tiene '.align 4' la alineación está en 2^4 = 16 bytes, creo. – 71GA

Respuesta

7

Existen más de una directivas .align solo por la forma en que el compilador funciona internamente; uno hubiera sido suficiente y emitir solo uno requiere trabajo adicional.

En cuanto a la alineación en general, se trata de un tema complejo, pero aquí está un artículo para Intel x64 que se analizan algunas de las cuestiones que está interesado en:

otra arquitectura puede ser muy diferente.

+0

Sospeché que la segunda directiva .align se debe a cómo funciona el compilador, pero es bueno saberlo ahora. Gracias también por el enlace – jena

Cuestiones relacionadas