2010-12-31 10 views
8

Sto passando un po 'di tempo alla programmazione degli assiemi (in particolare Gas) e di recente ho imparato a conoscere la direttiva di allineamento. Penso di aver capito le basi, ma vorrei ottenere una comprensione più profonda della sua natura e quando usare l'allineamento.Quando devono essere utilizzate direttive di allineamento esplicite nell'assemblaggio?

Per esempio, mi sono chiesto il codice assembly di una semplice istruzione switch C++. So che, in determinate circostanze passare dichiarazioni sono basate sulle tabelle di salto, come nei seguenti poche righe di codice:

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

.align 4 allinea i seguenti dati sulla prossima limite di 4 byte che assicura che il recupero della memoria questi le posizioni sono efficienti, giusto? Penso che questo sia fatto perché potrebbero esserci cose che accadono prima dell'istruzione switch che ha causato disallineamenti. Ma perché in realtà ci sono due chiamate a .align? Ci sono regole pratiche per chiamare .align o dovrebbe semplicemente essere fatto ogni volta che un nuovo blocco di dati viene memorizzato in memoria e qualcosa prima di questo potrebbe aver causato disallineamenti?

In caso di matrici, sembra che l'allineamento venga eseguito su limiti a 32 byte non appena l'array occupa almeno 32 byte. È più efficiente farlo in questo modo o esiste un altro motivo per il limite di 32 byte?

Apprezzerei qualsiasi spiegazione o suggerimento sulla letteratura.

+2

La mia padronanza del linguaggio assembly è limitata a 6510, che non aveva istruzioni di allineamento. Ma basandomi sulla mia conoscenza dell'allineamento della memoria nelle impostazioni del C++, direi che l'istruzione "align" non è un'effettiva istruzione della CPU. Potrebbe essere solo una direttiva assemblatore, che indica dove inserire i prossimi codici operativi. In tal caso, due direttive allineate di seguito sono le stesse che incontrarne solo una. –

+0

Ho pensato che '.align 2' allinea il codice al 2^2 = 4 byte. Nel tuo caso in cui hai '.align 4' l'allineamento è su 2^4 = 16 byte, penso. – 71GA

risposta

7

Esistono più di una direttiva .align solo per il modo in cui il compilatore funziona internamente; uno sarebbe stato sufficiente ed emettere solo uno prende lavoro extra.

Per quanto riguarda l'allineamento in generale, si tratta di un argomento complesso, ma ecco un articolo per Intel x64 che discute alcuni dei problemi che ti interessa:

Altro architettura può essere molto diverso.

+0

Ho il sospetto che la seconda direttiva .align sia dovuta a come funziona il compilatore, ma è una buona cosa conoscerlo ora. Grazie anche per il link – jena

Problemi correlati