L'assembly scritto a mano scomparirà? [chiuso]

7

La scorsa settimana mi chiedevo, con i compilatori che stanno migliorando sempre di più l'ottimizzazione, ci sarà un punto in cui non c'è bisogno di assemblaggi scritti a mano? Ci sono ancora campi specializzati in cui i compilatori non sono abbastanza intelligenti da produrre codice che rivaleggia con l'assemblaggio scritto a mano?

    
posta Oliver Weiler 23.04.2011 - 12:41
fonte

7 risposte

25

will there be a point when there is no need for hand written assembly?

Mai. C'è sempre bisogno di istruzioni specifiche per l'hardware specifico.

Are there still specialized fields where the compilers aren't smart enough to produce code that rivals hand-written assembly?

La gestione degli interrupt del kernel, le caratteristiche dei driver I / O, il locking e la sincronizzazione dei thread spesso devono essere inclusi alcuni assembler perché fanno uso di istruzioni esterne standard set di istruzioni utilizzato da un compilatore.

Infatti, mentre Intel avanza cercando di risolvere i problemi di ordinazione della memoria che hanno creato (http://www.mpdiag.com/intel_arch.html) potrebbero esserci istruzioni aggiuntive o diverse che potrebbero dover essere aggiunte o modificate all'interno i kernel OS comuni; cose che i compilatori normalmente non generano per le applicazioni degli utenti finali.

    
risposta data 23.04.2011 - 14:17
fonte
12

Per alcuni microcontrollori molto speciali non vale la pena portare un compilatore.

Ad esempio, una volta ho scritto circa mille linee di assemblaggio per un controller a 24 bit in un FPGA, per un'applicazione per scopi speciali.

    
risposta data 23.04.2011 - 20:27
fonte
10

Prima di tutto, penso che alcune persone scrivano assemblea "perché è lì", più o meno nello stesso modo in cui Sir Edmund Hillary parlava della gente che scalava l'Everest perché è lì. La sua stessa esistenza è una sfida per loro, e accetteranno questa sfida se hanno un bisogno pratico (o addirittura l'uso) del risultato o meno.

Detto questo, la mia personale interpretazione è che mentre il linguaggio assembly è usato per ridurre percentuali di tutto il codice, c'è ancora abbastanza crescita nella programmazione complessiva che in un senso assoluto, la codifica degli assembly è ancora in crescita.

Ad esempio, un bel po 'di MS-DOS è stato scritto in linguaggio assembly. Giusto per argomento, supponiamo che sia stato tutto linguaggio assembly scritto a mano. Per motivi di numero tondo, immaginiamo che si tratti di un linguaggio di assemblaggio scritto a mano che ha prodotto circa 100 kilobyte di codice di output, probabilmente qualcosa come 50 mila righe di codice sorgente.

L'ultima volta che ho sentito, Microsoft ha affermato che solo circa un decimo dell'uno per cento di Windows è stato scritto in linguaggio assembly. Windows è attualmente da qualche parte circa 150 milioni di righe di codice, quindi lo 0,1% di esse è un totale di 150.000 righe.

Vorrei anche notare che Windows rappresenta un'area probabilmente la più suscettibile di usare un compilatore - è pensata principalmente per macchine veloci con molta memoria e molte risorse in generale. Le funzionalità sono molto più importanti della riduzione al minimo dell'utilizzo delle risorse.

I piccoli sistemi integrati (per un ovvio esempio) favoriscono senza dubbio il codice di assemblaggio scritto a mano ad un livello molto maggiore. Il codice per un tipico forno a microonde ha bisogno di grossi pezzi di codice per cose come i file system, il rendering dei caratteri antialiasing o la gestione di moltitudini di macchine su una rete.

    
risposta data 23.04.2011 - 19:02
fonte
7

Ci sono alcune cose, che puoi fare solo con l'assemblaggio, ma scoprirai che queste sono già comodamente racchiuse in funzioni. Quindi non hai davvero bisogno di farli a mano.

Suppongo che se si programma un chip molto specifico, di cui si sa tutto, l'assemblaggio potrebbe semplicemente spremere l'ultimo bit (anche se dovrebbe essere possibile inserire tale conoscenza in un compilatore).

Tuttavia su normali CPU con tutte le diverse architetture e persino insiemi di istruzioni e cose come la previsione dei rami e l'esecuzione fuori dall'ordinazione, si potrebbe effettivamente rallentare l'assemblaggio scritto a mano, tranne se lo si costruisce per un chip specifico . Questo sforzo è ingiustificabile, dal momento che un compilatore C appropriato può abbattere il linguaggio per tutte quelle architetture sfruttando la maggior parte delle loro peculiari possibilità di ottimizzazione, mentre provare a fare tutto questo a mano farà esplodere la testa e prendere un budget che nessuno sulla terra è disposto pagare, perché non è nemmeno chiaro che il risultato sarà misurabilmente più veloce.

    
risposta data 23.04.2011 - 13:22
fonte
7

Penso che questa domanda possa essere divisa in 2 parti:

Will there come a time when writing in assembly to increase the speed of execution will die out?

Credo che sia già arrivato.

Will there come a time when writing in assembly will die out?

No, avrai sempre bisogno di un accesso più ravvicinato all'hardware quando scrivi cose come hypervisor, kernel, driver di dispositivo, ecc.

    
risposta data 23.04.2011 - 14:38
fonte
7

Ci sarà sempre bisogno di programmare in assembly a mano in quanto non tutto l'assemblaggio generato è il più ottimale o anche il più veloce. Un grande esempio di questo è su: link

    
risposta data 23.04.2011 - 17:18
fonte
-4

Assemblaggio o shellcode in generale, è una cosa molto importante quando si scrive un malware che sfrutta alcune vulnerabilità di sicurezza (si chiama worm). È necessario scrivere la sequenza delle istruzioni di assemblaggio per bypassare l'anti-virus. La maggior parte degli anti-virus utilizzano la tecnica della firma per rilevare il codice dannoso. Per questo motivo, non è possibile riutilizzare il vecchio shellcode. È divertente scrivere una riga di codici assembly e farlo funzionare per alcuni motivi:)

    
risposta data 09.06.2012 - 12:03
fonte

Leggi altre domande sui tag