2009-06-19 9 views
10

Apparentemente nessuno usa l'assemblaggio oggigiorno se non quello di sviluppare driver di periferica, o il nucleo centrale dei kernel OS ecc. Qualcuno ne ha la conoscenza al momento utilizzata per altre cose?Che tipo di progetti (oltre alle ovvie cose del SO) usano il linguaggio assembly?

Intendo stile PC e hardware più grande, roba non incorporata con piccoli processori piccolissimi.

+1

Non c'è bisogno di roba incastonata, c'è qualche corteccia quad core e microcontrollori embedded simili che possono fumare il tipico PC di vendita al dettaglio. Anche queste applicazioni sono per lo più C/C++, con un po 'più di montaggio in virtù del fatto che il team di sviluppo probabilmente conosce il montaggio. – marr75

+0

Non avevo intenzione di sminuire, è solo che la mia curiosità era specifica per il mondo PC/server. – JCCyC

risposta

8

Boost, essendo come un moderno C++ così com'è, utilizza l'assemblaggio in linea per bit a prestazioni critiche a basso livello come atomic shared counters.

Modifica: come note @TokenMacGuy correttamente, "prestazioni" è una parola sbagliata qui. Boost utilizza il linguaggio assembly per cose che non possono essere eseguite in standard C++ come atomics (e gli intrinseci del compilatore non sono disponibili per qualche motivo.)

+0

Yowza. Questo non è il linguaggio di assemblaggio di tuo zio. Sembra strano come l'inferno. Bene, sono abituato al venerabile MASM/TASM e allo stile di assemblaggio in linea di Borland. – JCCyC

+1

Mi chiedo qual è il set di istruzioni di tuo zio, risc :)? –

+0

@ JCCyC, yah dove il codice era un comando per riga e formattato in colonne ... –

3

Credo che la casa progetto di calcolo parallelo Folding @ utilizza codice assembly ottimizzato per la massima velocità *

  * Nota:. Questo non significa che il montaggio è sempre più veloce, allora C/C++.

8

Più o meno ovviamente, la programmazione degli assiemi è necessaria per i back-end del compilatore e le tecnologie correlate come i simulatori di CPU dinamici di ricompilazione.

La programmazione in linguaggio assembly viene anche utilizzata con una certa frequenza per la programmazione di videogiochi, per sfruttare le nuove funzionalità della CPU che non sono ancora ben supportate dagli attuali compilatori. Tuttavia, questo è un po 'raro, in questi giorni, specialmente dal momento che su PC ci sono così tante diverse CPU da supportare. Mi aspetto che questo sia un po 'più comune su console con hardware uniforme, però.

Modifica: In questi giorni i giochi fanno la maggior parte del loro calcolo in una GPU. Ottenere il massimo da queste risorse di calcolo non è sempre possibile utilizzando solo OpenGL o DirectX ei fornitori di questi processori offrono una serie di strumenti per spremere di più dal proprio hardware. Sebbene Cuda o OpenCL siano termini ben noti, sono ancora ad un livello relativamente alto di astrazione rispetto all'hardware della GPU, riempiendo un ruolo molto simile al ruolo di C sulle tipiche CPU (Von Neuman). Uno sguardo al developerpages per questi prodotti e troverete decine di modi per utilizzare le risorse di calcolo GPU in modo ottimale, e ad ogni livello di astrazione.

+0

In questi giorni la maggior parte della programmazione del gioco viene eseguita in C o C++. Le principali eccezioni rimanenti sarebbero il codice che sfrutta le unità SIMD (come VMX di X360 o SPU di celle), anche se in questi casi vengono spesso utilizzate le librerie o le intrinseche del compilatore piuttosto che l'assembly inline. – Whatever

+0

Considerando che la maggior parte del lavoro nella programmazione del gioco è vincolata alla GPU e legata all'I/O del disco, la maggior parte del tempo non ci guadagna molto in quel campo. D'altra parte, nella programmazione del gioco, non ti preoccupi tanto della manutenzione del codice, quindi uno degli svantaggi principali dell'assemblaggio non si applica. – jkerian

+0

@Whatever: Non intendevo dedurre che i giochi sono scritti interamente in Assembly. Spero almeno che i giochi siano scritti in qualcosa di più espressivo e solo regioni molto calde di codice vengano trasformate in linguaggio assembly. – SingleNegationElimination

0

So che l'assembly viene utilizzato per il codice molto pesante per i giochi. Ad esempio, i pixel shader hanno un budget di istruzioni davvero limitato; per ottenere gli effetti desiderati, è necessario codificarli sul metallo.

+1

Ma di solito si scrive alle istruzioni disponibili in un processore grafico, non in linguaggio assembly PC. – Nosredna

+0

@Nosredna: Sì, è corretto per quell'esempio. –

+1

Anche gli shader sono scritti in lingue di alto livello (Cg, HLSL, GLslang) in questi giorni. – Whatever

1

L'ultima volta che mi sono imbattuto in assembler è stato quando ho hackerato il codice sorgente di Quake I. Tutte le librerie matematiche (in particolare qualsiasi cosa per i prodotti dot) sono state scritte in MASM da John Carmack. Questa roba era intensiva in virgola mobile, e al tempo C non era all'altezza di un ASM abilmente realizzato a mano per le operazioni fluttuanti. Inoltre, poiché i computer erano molto più limitati dalla CPU e poiché Quake utilizzava la CPU per il rendering, ogni singola operazione contava, quindi l'ASM funzionava al meglio.

0

Penso che i programmi più importanti in cui viene utilizzato l'assembler siano boot loader.

+0

L'avrei archiviato sotto "ovvietà del sistema operativo". – JCCyC

+0

tecnicamente, non è una parte del sistema operativo (si veda ad esempio Linux), ma capisco cosa intendi;) –

0

Ho scritto un assembler IBM 370 nel corso della giornata, per una grande applicazione (prodotto venduto dal produttore , utilizzato dalle grandi aziende) che raccoglieva informazioni dagli hook del sistema operativo. Tuttavia, stavo facendo solo programmazione jane normale: schermi, report, ecc. In assembler. Ha funzionato incredibilmente veloce, ma era interamente in assembler.Sono sicuro che è ancora in esecuzione e venduto oggi per prezzi ben al di sopra di quanto è tipico del software per piattaforme Windows e Linux.

+0

L'IBM 370 ha avuto la programmazione di assemblatori più dolce che abbia mai fatto. Il set di istruzioni è stato progettato per una facile programmazione degli assemblatori manuali e l'assemblatore stesso è stato molto bello per il giorno. –

0

Secondo Knuth, studiando l'efficienza degli algoritmi. Egli menziona nei suoi libri non c'è modo migliore per studiare come funziona un algoritmo rispetto a scrivere in assembly.

0

A volte alcune funzionalità non sono implementabili in un linguaggio di alto livello e al suo posto viene utilizzato l'assembly inline. Ad esempio, alcuni assembly inline nella libreria C++ Qt; Credo che sia usato per parte del sistema di introspezione di oggetti.

Inoltre, glibc (la libreria C per gcc) utilizza l'assembly per l'ottimizzazione. IIRC una delle implementazioni matematiche a virgola mobile basate su software ha significativi blocchi scritti in assembly.

Uno dei motivi principali per l'apprendimento dell'assembly, tuttavia, è il debug. In alcune occasioni, mi sono ritrovato in situazioni in cui non sapendo che l'assemblaggio mi avrebbe impedito di mettere a punto un problema particolarmente appiccicoso.

1

Se passate molto tempo a guardare l'output di assemblaggio del vostro C/C++, noterete molto rapidamente che i migliori compilatori ottimizzanti fanno un assemblaggio migliore rispetto ai programmatori di assemblaggio. Decisioni su quando incorporare una funzione, su come gestire i loop, post rispetto al pre-incremento (che molti compilatori decidono come gestire per te ora) ecc. Best of luck in astuzia un compilatore che ha una grande comunità che lo sviluppa e una capacità molto migliore gestire indirizzi e definizioni di te, in circostanze normali almeno.

Anche i driver di periferica e i kernel del sistema operativo in genere non vengono scritti utilizzando un sacco di assembly. Piccole sezioni critiche per le prestazioni dei programmi in tempo reale sono quelle in cui troverai l'assembly nelle app di oggi.

Diventa ancora peggio quando si inizia a parlare dell'assembly RISC, che tende ad essere incredibilmente efficace per le istruzioni di ottimizzazione come branch e exchange insieme a dozzine di registri general purpose. La maggior parte delle persone non è più intelligente di un compilatore ottimizzante. Quelli che sono in genere scrivono compilatori ottimizzanti.

1

In C, al livello fondamentale, è piuttosto facile vedere come un insieme di istruzioni diventa assemblatore (se si capisce l'architettura sottostante). Ma a volte, l'assemblatore non può essere battuto. Si noti che è possibile scrivere codice di assembly scadente e inefficiente tanto facilmente quanto scrivere codice C criptato. E l'assemblatore è molto meno manutenibile. E non è portatile ovunque.

E tutto dipende dalla qualità del compilatore C che si sta utilizzando. Alcuni fanno meglio di altri. La maggior parte dei compilatori ti consente di vedere il codice assemblatore che generano. Se pensi di poter fare meglio, e il segmento di codice è fondamentale, fallo. Altrimenti, evitalo. C con cura artigianale può essere molto vicino al metallo, dato un compilatore decente.

1

Funzioni di utilità che il linguaggio di livello superiore non si aspettava di supportare. Un vecchio esempio è da quando stavo cercando di ottenere alcune delle sottigliezze fornite da C e Unix mentre lavoravo con Fortran su RSX-11M. Volevo passare la formattazione delle stringhe e utilizzare lo stile C più semplice. Il printf() aveva bisogno di fare alcune operazioni come cast. Il Fortran non aveva questo concetto, quindi icast() e rcast() sono stati scritti in assembler. Altre funzioni implementate erano move() e clone(). Questi non sono stati fatti tanto per l'efficienza in quanto estendono concetti al di fuori della mentalità di Fortran.

2

Parlando dall'esperienza, è molto utilizzato durante i test e la verifica di nuovi progetti di processore. Il set di istruzioni deve essere sottolineato utilizzando il codice che un compilatore non genererà necessariamente. Piuttosto che scrivere in un linguaggio di livello superiore che può o meno compilare le istruzioni che si desidera controllare, è più facile scrivere l'assembly a mano.

2

Proprio come un aneddoto: Tycoon Roller Coaster è stato scritto interamente (o quasi) nell'assemblaggio x86 di Chris Sawyer (wikipedia reference).

0

Uno dei codici di determinazione della velocità (dopo tutto ciò che è necessario dinamico per la gestione della memoria) in quasi tutte le lingue è la routine utilizzata dal runtime (-library) per spostare la memoria. Move(), memcpy etc, così come le primitive come la ricerca di un byte (strchr) ecc.

Questi molto spesso scritti anche in assembler, con uno speciale codice dedicato per sfruttare l'allineamento.

Problemi correlati