Assemblaggio in un documento di ricerca

0

Sto facendo un documento di ricerca sulla programmazione, e ho bisogno di spiegare in qualche modo l'assemblaggio ... Non ho mai imparato la lingua, ma capisco a cosa serve e come si presenta ...

MOV A,47
ADD A,B
HALT

E da quello che ho capito, è usato per scrivere alcuni compilatori, piccoli bit di codice che devono essere molto veloci e altri compiti ... Ma questa è una specie di domanda per le persone che hanno usato / studiato assemblaggio e capirlo abbastanza bene E no, non ti sto chiedendo di scrivere questo segmento del documento di ricerca per me. Sarebbe egoista. Ho solo bisogno di una breve spiegazione, chiarimenti sull'argomento (non sono sicuro se quello che so sia vero o meno) e un puntatore nella giusta direzione.

Per un documento di ricerca (ho bisogno di spiegarlo MOLTO semplicemente ...) quale è lo scopo di utilizzare l'Assemblea nella società di oggi? Certo, era importante nel corso della giornata, ma ora con tutti i linguaggi di alto livello, quando viene utilizzato questo linguaggio di basso livello?

    
posta Gabriel 10.02.2012 - 15:00
fonte

10 risposte

8

Generalmente l'assemblatore viene utilizzato quando è necessaria una strong ottimizzazione. Prendi ad esempio qui , dove il ragazzo ha ottimizzato l'elaborazione 6 volte.

Tuttavia prendi nota che i compilatori moderni sono molto bravi nell'ottimizzazione e, a meno che tu non sappia davvero cosa stai facendo, non riuscirai a battere il compilatore.

    
risposta data 10.02.2012 - 15:04
fonte
6

È essenziale per l'implementazione di compilatori, sistemi operativi e codice altamente ottimizzato, specialmente su sistemi embedded.

Può anche essere usato per il debug poiché la visualizzazione dell'output del compilatore è una cosa utile.

Inoltre, molte architetture forniscono istruzioni speciali che possono essere consultate in modo affidabile con l'assembly, di nuovo utilizzate per l'ottimizzazione.

    
risposta data 10.02.2012 - 15:16
fonte
4

Sono di due menti sull'uso dell'assemblaggio oggi. In primo luogo, è utile per sistemi di basso livello e altamente ottimizzati (solitamente sistemi embedded). È anche utile per ottimizzare alcune parti di un sistema (come un sistema operativo o uno stack di rete, ad esempio) che richiedono elevate prestazioni loro. Può anche essere usato per creare compilatori per altre lingue, ma penso che la maggior parte venga ora eseguita in C.

In secondo luogo, penso che abbia un uso educativo. È come imparare il latino. Sebbene non ci sia un paese in cui si parla il latino, è ancora ampiamente insegnato a causa del suo uso nella scienza, nella medicina, ed è l'antecedente di molte delle lingue più moderne.

L'assemblaggio è così. Imparare esattamente come i bit girano attorno al computer dà a un programmatore una comprensione più profonda del funzionamento della macchina, e questa comprensione potrebbe dargli un'idea della scrittura di linguaggi di livello superiore. L'assemblaggio è il più vicino possibile alla macchina (ad esempio "vicino al metallo").

    
risposta data 10.02.2012 - 16:18
fonte
3

Mentre VJovic è un buon punto, ci sono ancora alcune situazioni in cui dovrai imparare un assemblaggio linguaggio.

1.) Se stai scrivendo un compilatore e vuoi compilare il codice nativo. Sebbene, puoi tradurre in una lingua con un compilatore nativo (come C) e quindi utilizzare un compilatore C per andare da lì.

2.) Stai scrivendo un sistema operativo. Mentre la maggior parte dei sistemi operativi sono scritti in C (o in un altro linguaggio di alto livello) ci sono ancora parti scritte in assembly

3.) Programmazione del dispositivo integrata e / o limitata. A volte hai bisogno di entrare nel nitty gritty perché il tuo hardware non ha un compilatore C (anche se questo sta diventando sempre più raro)

    
risposta data 10.02.2012 - 15:15
fonte
3

L'assemblaggio in sé e per sé consiste di comandi che possono essere eseguiti direttamente su una macchina. È praticamente il livello più basso che si può ottenere dalla lingua / dallo stack di astrazione prima di entrare nella fisica.

I linguaggi di livello superiore sono costruiti sopra all'assemblaggio: C viene compilato in comandi di assemblaggio. Il compilatore è necessariamente scritto in assembly. Altri interpreti / compilatori (e i loro linguaggi / framework associati) sono costruiti in modo simile su livelli più alti di astrazione.

Il valore di queste astrazioni è che consentono a vari tipi di nitty-gritty e specifiche difficili di essere trasparenti, liberando gli sviluppatori di pensare e scrivere a livelli sempre più alti. Immagina di provare a scrivere qualsiasi app moderna se dovessi scriverla interamente in assembly, potrebbe essere possibile, ma molto probabilmente verrebbero mantenuti la manutenzione, i tempi di sviluppo e le prestazioni.

Tuttavia, Le astrazioni sono fiacche . Ad un alto livello, le uniche ragioni per scrivere assembly sono che l'astrazione richiesta non esiste, o che le astrazioni esistenti perdono nel modo in cui si ha bisogno che non lo siano. Più specificamente, un sistema embedded può avere requisiti molto severi e stringenti (per esempio ... dimensioni del programma), e un programmatore di assemblatori esperto può essere in grado di battere un compilatore C. Le prestazioni non ottimali del compilatore in questo senso (linee di assemblaggio nell'output compilato) sono una perdita nell'astrazione.

Quando hai a che fare con qualsiasi strumento usato per astrarre la complessità, dovresti tuffarti in basso quando necessario.

Le ottimizzazioni più comuni che conosco sono per dimensioni del programma e prestazioni. E, naturalmente, lo stesso compilatore deve essere a livello di assembly.

    
risposta data 10.02.2012 - 17:14
fonte
2

È una semplificazione eccessiva ma l'assemblaggio è il più vicino possibile alla macchina. Man mano che i compilatori e le prestazioni dell'hardware avanzano, ciò è meno importante ma esistono ancora situazioni. Alcuni esempi:

  • Grafica: si tratta di macchine specifiche. Ottenere il 100% di ciò che il dispositivo ti darà richiede il montaggio.

  • Ottimizzazione della velocità - se davvero deve essere veloce e più intelligente del compilatore. (storicamente un grande motivo - meno oggi)

  • Codice precedente: una volta la memoria e la velocità di elaborazione erano più costose del tempo umano. La gente ha scritto assemblatore per ottimizzare le risorse limitate. Credici o meno che parte di questo codice sia ancora disponibile.

  • Dispositivi incorporati - per definizione molto vicini alla macchina.

Buona fortuna per il progetto di carta Come sempre, per favore cita fonti che usi da qui. Perché non condividi ciò che ti viene in mente?

    
risposta data 12.02.2012 - 17:05
fonte
1

Ci sono anche alcuni prodotti là fuori che non sono mai stati rielaborati per usare un nuovo linguaggio, ero solito lavorare su software di pharamcy che era ancora scritto in un linguaggio macro assembler Series / 1.

Il codice conteneva così tanto business e conoscenze cliniche che il management non voleva mai eseguire una completa riscrittura, insieme ai regolamenti in costante cambiamento ritenevano fosse più facile emulare l'ambiente in cui il codice veniva eseguito e continuare fare aggiunte.

La base di codice era in costante evoluzione, ma un paio di volte all'anno lavoravo sul codice che è stato scritto prima che io nascessi (sono nei miei primi anni '30).

Immagino che questo senario sia raro, ma dubito che sia l'unica azienda che mantiene vivo il vecchio codice assembly.

    
risposta data 10.02.2012 - 17:16
fonte
1

Forse l'uso più grande dell'assemblaggio è la necessità di poterlo leggere:

  • per controllare per vedere cosa ha trovato il tuo compilatore di ottimizzazione
  • debug dei casi in cui non sono presenti simboli di debug incorporati

Anche se la maggior parte del tuo lavoro non ha bisogno di conoscenza dell'assemblaggio, amplia notevolmente la portata di ciò che è possibile. È anche necessario per il reverse engineering e simili. Infine, al fine di comprendere appieno i punti di forza e i punti deboli della piattaforma, per avere una conoscenza di base di ciò che è difficile e facile, una comprensione dell'architettura di elaborazione comprende la comprensione del codice macchina.

Ci sono anche altri casi (a parte il bootstrap del sistema operativo e la scrittura del compilatore) in cui assemblare la scrittura è la soluzione migliore, in genere processori specializzati / embedded come microcontrollori e DSP. Non tutto ha un solido strumento di sistema ab initio: se non puoi farlo da solo, diventi ostaggio del tuo set di strumenti.

    
risposta data 10.02.2012 - 20:42
fonte
1

Dato che hai detto "il" linguaggio e "questo" linguaggio, volevo assicurarmi che tu capissi che l'Assemblea non è una singola lingua. Ha una struttura simile, ma è diverso per ogni diverso tipo di processore. Ecco perché è più spesso utilizzato per accedere a funzionalità specifiche per un processore.

L'assembly è praticamente tradotto direttamente in codice macchina, ovvero quelli e zeri su cui il processore opera direttamente. MOV A, 47 su un ipotetico processore potrebbe tradursi in 010110 01 00101111 nel codice macchina, dove 010110 significa MOV , 01 significa A registro e 00101111 è il valore da spostare. Questa corrispondenza one-to-one rende molto facile "smontare" o tradurre il codice macchina in codice assembly.

È l'unico codice che non puoi nascondere ai suoi utenti, il che lo rende necessario per scopi nefandi come crackare software o sfruttare vulnerabilità o difendersi da tali attacchi. Poiché una dichiarazione di alto livello può generare dozzine di istruzioni di assemblaggio, è anche utile poter leggere l'assembly durante il debug, in quanto può aiutare a restringere il problema.

Tuttavia, il suo uso moderno più comune è quello di una spinta egoistica compiaciuta quando si vuole guardare dall'alto in basso i colleghi ignoranti: -)

    
risposta data 13.02.2012 - 20:23
fonte
0

L'uso più ampio è come una fase intermedia durante il processo di compilazione, spesso nascosto dalla riga di comando del compilatore esterno o dal codice GUI. Il compilatore produce il codice di assemblaggio, quindi viene chiamato un assemblatore per trasformarlo in un qualche tipo di oggetto binario (oggetto o eseguibile). Non è raro che la riga di comando del compilatore o la shell gui chiamino il linker in modo che l'utente veda solo il codice sorgente e un file eseguibile.

Non tutti i compilatori lo fanno, per esempio tcc ha il codice "macchina" codificato nel compilatore.

Avere un passo intermedio del linguaggio degli assiemi ascii separa lo sviluppo del compilatore dallo sviluppo dell'assemblatore. I produttori di compilatori possono vedere direttamente l'output del loro lavoro, non devono essere disassemblati (cosa che su alcune piattaforme è problematica) per capire cosa ha prodotto il loro compilatore. il programma / strumento assemblatore deve essere lì comunque, quindi potrebbe anche sfruttarlo invece di re-inventarlo nel compilatore.

I bootloader e il codice di avvio e arresto che conduce e segue il codice compilato spesso devono essere scritti in linguaggio assembly perché l'assembly scritto a mano non deve conformarsi agli standard di chiamata, dove l'assembly generato dal compilatore spesso si conforma a uno standard chiamante. Qualcuno deve impostare lo stack e la memoria zero .bss e quei tipi di attività prima che il codice compilato possa operare usando la sua convenzione di chiamata.

A volte l'assembly viene usato per ottimizzare a mano qualcosa che il compilatore e / o il linguaggio non erano in grado di produrre codice abbastanza veloce per risolvere il problema.

Microcontrollori, sia perché alcuni usano cpus che non hanno abbastanza mercato per produrre un grande compilatore, sia perché sono molto limitati al punto da dover raddoppiare o triplicare la velocità di clock o la quantità di ram / rom per utilizzare il codice compilato non vale la pena. Troverete una percentuale maggiore di questo mercato utilizza asm rispetto alle normali applicazioni e sistemi operativi.

Speriamo che l'apprendimento a fini educativi sia un motivo per usare asm. Una volta che ne impari anche uno, specialmente se impari qualche set di istruzioni diverso, entrambi apprezzerai ciò che il compilatore e il linguaggio stanno facendo, e spesso come risultato di questa educazione scrivi meglio (prestazioni e affidabilità) codice linguistico di alto livello .

    
risposta data 13.02.2012 - 19:40
fonte

Leggi altre domande sui tag