Perché abbiamo bisogno del linguaggio assembly?


27

Scriviamo principalmente programmi in un linguaggio di alto livello. Quindi, mentre studiavo, mi sono imbattuto in un linguaggio assembleare. Quindi un assemblatore converte il linguaggio assembly in linguaggio macchina e un compilatore fa lo stesso con un linguaggio di alto livello. Ho scoperto che il linguaggio assembly ha istruzioni come move r1 r3, move a 5 ecc. Ed è piuttosto difficile da studiare. Quindi perché è stato creato il linguaggio assembly? O è stato quello che è venuto prima anche prima del linguaggio di alto livello? Perché sto studiando degli assemblatori nella mia classe di ingegneria informatica?


13
L'assemblatore è un codice macchina leggibile dall'uomo, ecco perché.
Andrej Bauer,

4
Perché è importante sapere come funzionano le cose quando siamo vicini all'hardware. Quando scriviamo un assembly capiamo come l'hardware del computer funziona e funziona a basso livello. Il modo migliore per farlo è il linguaggio assembly poiché il linguaggio macchina è noioso e non leggibile come assembly. Preferiresti davvero usare una scatola magica e non guardare mai dentro?
Spencer Wieczorek,

Risposte:


32

"Allora perché è stato creato il linguaggio assembly?"

Il linguaggio assembly è stato creato come una scorciatoia esatta per la codifica a livello di macchina, in modo da non dover contare 0 e 1 tutto il giorno. Funziona come il codice livello macchina: con istruzioni e operandi.

"Quale è venuto prima?"

Wikipedia ha un buon articolo sulla storia dei linguaggi di programmazione

"Perché sto studiando degli assemblatori nella mia classe di ingegneria informatica?"

Sebbene sia vero, probabilmente non ti ritroverai a scrivere l'app del tuo prossimo cliente nell'assemblaggio, c'è ancora molto da guadagnare dall'apprendimento dell'assemblaggio.

Oggi, il linguaggio assembly viene utilizzato principalmente per la manipolazione diretta dell'hardware, l'accesso a istruzioni specializzate per i processori o per risolvere problemi di prestazioni critiche. Gli usi tipici sono driver di dispositivo, sistemi embedded di basso livello e sistemi in tempo reale.

Il linguaggio assembly è il più vicino possibile al processore come un programmatore, quindi un algoritmo ben progettato è ardente: l'assemblaggio è ottimo per l'ottimizzazione della velocità. Si tratta di prestazioni ed efficienza. Il linguaggio assembly consente di avere il controllo completo sulle risorse del sistema. Proprio come una catena di montaggio, si scrive codice per inserire singoli valori nei registri, gestire direttamente gli indirizzi di memoria per recuperare valori o puntatori. (fonte: codeproject.com )


29

Perché abbiamo bisogno del linguaggio assembly?

Bene, in realtà c'è solo una lingua di cui avremo mai bisogno , che si chiama "linguaggio macchina" o "codice macchina". Sembra così:

0010000100100011

Questa è l'unica lingua che il tuo computer può parlare direttamente. È il linguaggio che parla una CPU (e tecnicamente, diversi tipi di CPU parlano versioni diverse). Fa anche schifo guardare e cercare di capire.

Fortunatamente, ogni sezione di binario corrisponde a un significato particolare. È diviso in diverse sezioni:

0010|0001|0010|0011

operation type  source register  other source  destination register
0010            0001             0010          0011

Questi valori corrispondono a:

operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3

Quindi questa operazione aggiungerebbe i numeri nei registri 1 e 2 e inserirà quel valore nel registro 3. Se metti letteralmente questi valori in una CPU e dici "vai", aggiungerà due numeri per te. L'operazione "sottrai" potrebbe essere un 0011 o qualcosa del genere, anziché 0010 qui. Qualunque sia il valore farà sottrarre la CPU.

Quindi un programma potrebbe assomigliare a questo (non cercare di capirlo, dal momento che ho inventato questa particolare versione del codice macchina per spiegare le cose):

instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000

Fa schifo leggere? Decisamente. Ma ne abbiamo bisogno per la CPU . Bene, se ogni codice macchina corrisponde a una particolare azione, facciamo solo una semplice scorciatoia "inglese", e quindi una volta che capiamo cosa sta facendo il programma, convertilo in un vero codice binario e darlo alla CPU per l'esecuzione.

Quindi le nostre istruzioni originali dall'alto potrebbero apparire come:

(meaning)      operation type  source register  other source  destination register
(machine code) 0010            0001             0010          0011
("English")    add             r1               r2            r3

Si noti che questa versione inglese ha una mappatura esatta al codice macchina . Quindi, quando scriviamo una riga di questo "inglese", stiamo davvero solo scrivendo un codice macchina più amichevole e comprensibile.

Bene, questo è il linguaggio assembly. Ecco perché esiste e perché è stato originariamente creato.

Per capire perché ne abbiamo bisogno ora, leggi le risposte sopra, ma la chiave per capire è questa: i linguaggi di alto livello non hanno una singola rappresentazione è il codice macchina. Ad esempio in C, o Python o qualsiasi altra cosa:

z = x + y

Questo suona proprio come la nostra aggiunta dall'alto, supponendo che xsia nel registro 1, ysia nel registro 2 e zdovrebbe finire nel registro 3. Ma che dire di questa linea?

z = x * 2 + (y / 6) * p + q - r

Prova a rappresentare quella linea in 16 bit di binario e dire a una CPU "go". Non puoi. Il codice macchina non ha una singola istruzione operativa per eseguire addizioni, sottrazioni e quant'altro con 4 o 5 variabili contemporaneamente. Quindi deve prima essere convertito in una sequenza di codice macchina. Questo è ciò che fai quando "compili" o "interpreti" un linguaggio di alto livello.

Bene, abbiamo dei programmi per farlo, quindi perché abbiamo bisogno dell'assemblaggio ora? Bene, supponiamo che il tuo programma stia funzionando più lentamente di quanto ti aspetti, e vuoi sapere perché. Guardando il "output" del linguaggio macchina di questa linea, potrebbe apparire come:

1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010

Solo per finire quella riga di Python. Quindi vuoi davvero eseguire il debug di questo?!?!?! NO . Piuttosto, chiedi al tuo compilatore di darti l'output nella forma che puoi effettivamente capire facilmente, che è la versione del linguaggio assembly che corrisponde esattamente a quel codice macchina. Quindi puoi capire se il tuo compilatore sta facendo qualcosa di stupido e provare a risolverlo.

(Nota aggiuntiva sul consiglio di @ Raphael: potresti effettivamente costruire CPU che funzionino con cose diverse dai codici binari, come i codici ternari (base 3) o decimali, o persino ASCII. Tuttavia, per scopi pratici, siamo rimasti fedeli al binario.)


2
In linea di principio, nulla ci impedisce di creare CPU che funzionano direttamente con il linguaggio assembly. ASCII è solo una codifica inefficiente per questo scopo, tutto qui.
Raffaello

Grazie per l'aggiunta. Sono d'accordo, ma ho saltato quello ai fini della comprensione dello scopo dell'assemblea. Aggiungerò una nota.
Chris Cooper,

15

Quindi perché è stato creato il linguaggio assembly? o è stato quello che è venuto prima anche prima del linguaggio di alto livello?

Sì, assembly è stato uno dei primi linguaggi di programmazione che ha utilizzato il testo come input, al contrario dei cavi di saldatura, utilizzando schede plug-in e / o interruttori a rotazione. Ogni linguaggio assembly è stato creato per un solo processore o famiglia di processori mentre le istruzioni venivano mappate direttamente ai codici operativi eseguiti dal processore.

Perché sto studiando degli assemblatori nella mia classe di ingegneria informatica?

Se è necessario programmare i driver di dispositivo o scrivere compilatori, comprendere il funzionamento di un processore è prezioso, se non necessario. Il modo migliore per capirlo è scrivere del codice nell'assembly.

Se dai un'occhiata a come un compilatore scrive il codice, è comune vedere le opzioni per chiamare le convenzioni che probabilmente senza conoscere assembly non possono essere comprese.

Se devi risolvere un bug e l'unico input che hai è un core dump , allora devi assolutamente conoscere assembly per capire l'output che è il codice assembly e se fortunato è aumentato con dichiarazioni di livello superiore di un linguaggio di alto livello.


14

Vorrei aggiungere un aspetto meno pratico. Questa (probabilmente) non è una ragione storica ma una ragione per te oggi.

L'assemblea (rispetto alle lingue di alto livello) è nuda . Non nasconde nulla (ciò che viene fatto nel software) ed è semplice nel senso che ha un insieme di operazioni relativamente piccolo e fisso.

Questo può essere utile per l'analisi esatta dell'algoritmo. La semantica e il flusso di controllo sono così semplici che il conteggio di tutte le operazioni (o il numero previsto) può essere eseguito annotando il grafico del flusso di controllo con i conteggi di transizione (probabilità). Knuth lo fa nei suoi libri TAoCP con grande efficacia, dimostrando alcune delle analisi di algoritmo più rigorose che ci siano.

Aneddoto: il mio collega ha imparato a leggere Java Bytecode proprio per questo scopo.


4

Ci sono risposte qui:

Tutte queste risposte indicano:

  • Ottimizzazione di velocità / memoria
  • Comprensione del funzionamento della macchina
  • Quindi i programmatori Noob diventano esperti
  • Se conosci assembly, sai come scrivere compilatori per il tuo linguaggio High Lvl
  • eccetera

1
Condividi tutte queste opinioni? Qual è la tua esperienza? (In particolare, la voce "So Noob Programmers diventare Experts" mi sembra obsoleta da diversi decenni.)
Raphael

woah woah non devi essere così permaloso su questo argomento. Sto solo collegando le risposte alla sua duplice domanda. E il "So Noob Programmers diventa Esperto" è stato votato più votato qui . Vai a discutere con lui, non con me =)
compski,

1
Non sono permaloso, sto cercando di aiutarti a rendere buona la tua risposta (al momento non lo è, dato che ti colleghi solo a poche risorse, nessuna delle quali risponde pienamente alla domanda). Includere i propri pensieri in modo comparativo è un primo passo in tal senso. (Si noti che relazionando l'opinione in modo escluso, si assegna loro un valore; in altre parole, si deve essere in grado di discutere perché si valuta l'opinione abbastanza per (ri) pubblicare è come una risposta.)
Raffaello

Bene, la mia esperienza è che odio e faccio fatica ad imparare le lingue degli assembly dopo essermi semplicemente abituato ad alcuni linguaggi di programmazione di alto livello. E conosco quelli che sono buoni programmatori o che conoscono il C ++ / C in anticipo, possono programmare abbastanza bene in ASM. Non pensavo che la mia opinione fosse abbastanza apprezzata per essere pubblicata nella mia risposta, ecco perché ...
compski

Il tuo primo link è interrotto.
Hola Soy Edu Feliz Navidad,

1

Assembly = machine code
Alcune persone continuano a pensare a come il linguaggio assembly è diverso dai codici numerici che la CPU comprende.
Questo (mentre vero) manca completamente il punto.
Per quanto riguarda la traduzione, il linguaggio assembly e il numerico (binario, hex qualunque) sono la stessa cosa.

Grok it o drop it
Se grok assembly sai come funziona un vero computer.
l'assemblaggio del trekking prevede:

Se si esegue il grok assembly, si ha ben un'immagine quasi completa di come funziona la CPU collegata alla tastiera.
Devi usare questa conoscenza come un chirurgo del cervello usa il suo bisturi.

Non hai bisogno di astrazioni puzzolenti
A meno che tu non grugnisca l'assemblaggio (e quindi la CPU sul tavolo operatorio) non sarai mai libero dalle grinfie delle astrazioni della macchina RAM (o che Dio proibisca alla macchina di Turing l'orrore ).

L33t Hax0r 5k1llz
Assembly aiuta anche a capire come 133thax0r riesce a sconfiggere gli schemi di protezione. (D: perché ASLR non funziona ? Perché lo mov rax,fs:[28h]interrompe ).

Lo 0,1%
Non è la conoscenza dell'assemblaggio che conta, ma la conoscenza della macchina su cui lavori è importante.
Se vuoi conoscere la macchina, devi capirla e questo significa parlare la lingua della macchina.

Se non lo fai, allora sei bloccato con l'astrazione.
Questa è scienza e va bene, ma non è mai il quadro completo.

È come imparare a parlare Xhosa
A meno che tu non miri al livello di guru, mantieniti meglio con quello che sai, quei clic complicheranno la tua vita .

Perche è divertente.


1
L'uso più frequente della parola grok in un articolo che io abbia mai incontrato
rekciltnuc,

-1

Ad oggi, ho appreso per la prima volta RPG II utilizzando un IBM System 32, e successivamente ho imparato APL su un 370. Mi occupavo di dimensioni e velocità. Il mio mantra era più piccolo e più veloce. Assembly è il linguaggio più compatto e veloce in circolazione. Farei programmi di test sia in C che in Assembly. Laddove i programmi C richiederebbero 100 di Kb, un programma di assemblaggio equivalente sarebbe spesso inferiore a 5 Kb. Quando studiavo l'output del compilatore C, trovavo un codice che controllava e ricontrollava i parametri per fare controlli condizionali per possibili errori che erano abbastanza spesso rari ed esotici e del tutto superflui, il che richiedeva del tempo, ma il più grande gonfio di memoria stava passando assolutamente tutto da e verso lo stack.

Nell'attuale ambiente di programmazione la scrittura di codice fornisce un ulteriore livello di sicurezza e protezione. Essere in grado di leggere le informazioni direttamente da un componente hardware non accessibile a linguaggi di alto livello, consente di crittografare con Assembly in modo tale che un programma possa essere utilizzato solo su quel particolare computer. Ad esempio, crittografare una chiave utente utilizzando l'indirizzo MAC dell'interfaccia di rete, quindi parcheggiare quella chiave su uno specifico settore non registrato del disco rigido, quindi contrassegnare il settore come non valido in modo che altri file non possano sovrascriverlo. Ovviamente perdi il settore, ma che cos'è? 2048 o 4096 byte su miliardi o trilioni?


1
Che cosa significa "non accessibile alle lingue di alto livello"?
David Richerby,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.