Domanda

Ricordo alcune regole di un tempo fa (processori Intel pre-32 bit), quando era abbastanza frequente (almeno per me) dover analizzare l'output dell'assembly generato dai compilatori C / C ++ (nel mio caso, Borland / Turbo su quella volta) per trovare colli di bottiglia delle prestazioni e mescolare in modo sicuro le routine di assemblaggio con il codice C / C ++. Cose come l'uso del registro SI per il puntatore this , AX viene utilizzato per i valori di ritorno, i registri devono essere conservati quando ritorna una routine di assemblaggio, ecc.

Ora mi chiedevo se ci fosse qualche riferimento per i più popolari compilatori C / C ++ (Visual C ++, GCC, Intel ...) e processori (Intel, ARM, ...) e, in caso contrario, dove trovare il pezzi per crearne uno. Idee?

È stato utile?

Soluzione

Stai chiedendo informazioni sull'interfaccia binaria dell'applicazione " (ABI) e convenzioni di chiamata. Questi sono in genere impostati da sistemi operativi e librerie e applicati da compilatori e linker. Google per " ABI " o " convenzione di chiamata. " Alcuni punti di partenza da Wikipedia e Debian per ARM .

Altri suggerimenti

Convenzioni di chiamata "di Agner Fog" " il documento riassume, tra le altre cose, gli ABI Windows e Linux a 64 e 32 bit: http: // www .agner.org / optimize / calling_conventions.pdf . Vedere la Tabella 4 a pag. 10 per un riepilogo dell'utilizzo del registro.

Un avvertimento per esperienza personale: non incorporare ipotesi sull'ABI nell'assemblaggio in linea. Se si scrive una funzione nell'assembly inline che presuppone il ritorno e / o il trasferimento dei parametri in registri particolari (ad es. Eax, rdi, rsi), si interromperà se / quando la funzione è incorporata dal compilatore.

Il compilatore Open Watcom C / C ++ supporta due convenzioni di chiamata, basate sul registro (impostazione predefinita) e basate sullo stack (molto simili a quelle utilizzate dagli altri compilatori). La Guida dell'utente per questo compilatore li descrive entrambi ed è disponibile gratuitamente online , insieme al compilatore stesso . Puoi trovare questi argomenti nella Guida dell'utente particolarmente utile:

  • 10.4.1 Passaggio di argomenti mediante convenzioni di chiamata basate sul registro
  • 10.4.6 Uso delle convenzioni di chiamata basate su stack
  • 10.5 Convenzioni di chiamata per applicazioni basate su 80x87

Bene, oggi se l'ottimizzazione è attiva, non ce ne sono. Ma GCC ti consente di dichiarare che le tue istruzioni di assemblaggio dovrebbero usare una particolare variabile indipendentemente dal fatto che sia nel registro o meno, o addirittura di forzare GCC a mettere quella variabile in un registro utilizzabile con le tue istruzioni. Puoi anche dichiarare che registra le riserve del tuo blocco di assemblaggio in linea per se stesso (quindi il compilatore dovrebbe generare un codice di salvataggio / ripristino appropriato attorno al tuo pezzo inline, se necessario)

Credo, ma non sono affatto sicuro che GCC utilizzi Itanium ABI per gran parte della sua funzione; le incompatibilità tra esso e l'ABI che utilizza sono documentato .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top