asamblare inline în CGC

Limbajul C ++ suporta asamblare inline, care se reflectă în limbajul standard de.
Cu toate acestea, această caracteristică este profund specific individual compilator / arhitectura, astfel încât standardul de puține și limitate la următoarele:

7.4 Declarația asm [dcl.asm]
O declarație asm are forma
asm-definition:
asm (string-literal);
Declarația asm este condiționat susținut; înțelesul său este definit de implementare. [Notă: De obicei este folosit pentru a transmite informații prin punerea în aplicare a unui limbaj de asamblare. nota-end]

asamblare inline C standard nu stabilește și le menționează doar în lista de extensii comune:


Cele mai multe compilatoare populare acceptă această caracteristică într-o formă sau alta.
MSVC compilator le suportă la 32 de biți, dar nu și pentru codul de 64 de biți. De asemenea, după cum se poate observa, MSVC introduce sintaxa de asamblare este diferită de cea specificată în standardul.

test_asm.s obține fișierul (extinderea tradiționale fișierele de limbă de asamblare pentru GCC este .s):

Acest model este destul de natural, duce la inserțiile de asamblare logice, care sunt utilizate GCC.
inserturi CCG, după potențialul de text macro insera de asamblare direct în fișierul de ieșire într-un limbaj de asamblare.
Exemplu (inserțiilor de beton sintaxă de asamblare, vezi mai jos.)

După cum puteți vedea, GCC a declarat inserați în codul explicit.

Modelul utilizat de către CCG are mai multe proprietăți importante.

În primul rând, compilatorul aproape nici un „spioni“ în specificat Încorporați de asamblare programator. El, dacă este necesar, conduce macro (a se vedea. De mai jos), dar, în general, transmite codul de asamblare este aproape „așa cum este“, și nu are aproape nici o idee despre ceea ce se întâmplă în interior. În special, de detectare a erorilor este angajată în asamblare (transferuri GCC de programator de mesaje de eroare de asamblare).

În al doilea rând, în consecință, de asamblare pentru a introduce un compilator (în special de optimizare) opacă comandă unică (cutie neagră). Toate informațiile necesare cu privire la aceasta modul în care unitatea interacționează cu mediul înconjurător, compilatorul primește direct de programator de la inserturi specificate în mod explicit operanzi de asamblare (care definesc codul de asamblare comunicare cu variabila C ++, și o listă a resurselor utilizate (registre și așa mai departe. D.) și schimbări ( steaguri de stat, de memorie și așa mai departe. d.) în medalion de asamblare), dar nu de la o analiză detaliată a inserțiilor de text de asamblare (care nu). Tehnic vorbind, GCC oferă programator cu o interfață la registrul de transfer Language. Responsabil pentru informații false specificate în operanzi, se află în întregime pe programator.
În cadrul acestor constrângeri, compilatorul este liber să se ocupe de asamblare inline (precum și cu alte echipe) așa cum vrea el: să se mute, pentru a duplica (de exemplu, prin substituirea inline-funcții.), Sau chiar aruncați-l, dacă optimizatorul ar ajunge la o astfel de decizie.

articole similare