Risorse su come imparare a programmare in codice macchina? [chiuso]


24

Sono uno studente, fresco di programmazione e amante, da Java a C ++ e fino a C. Mi sono spostato all'indietro fino alle barebone e ho pensato di andare più in basso fino all'Assemblea.

Ma, con mia sorpresa, molte persone hanno detto che non è veloce come C e non serve a niente. Hanno suggerito di imparare come programmare un kernel o di scrivere un compilatore C. Il mio sogno è imparare a programmare in binario (codice macchina) o magari programmare bare metal (programmare il microcontrollore fisicamente) o scrivere bios o boot loader o qualcosa del genere.

L'unica cosa possibile che ho sentito dopo così tante ricerche è che un editor esadecimale è la cosa più vicina al linguaggio macchina che ho potuto trovare in questa epoca ed era. Ci sono altre cose di cui non sono a conoscenza? Ci sono risorse per imparare a programmare nel codice macchina? Preferibilmente su un microprocessore / microprocessore a 8 bit.

Questa domanda è simile alla mia, ma prima sono interessato all'apprendimento pratico e poi alla comprensione della teoria.


2
Qual è esattamente il problema qui? Se stai chiedendo se è possibile codificare nel codice macchina, probabilmente la risposta è "sì". Se stai chiedendo tutorial, allora a) chiarisci che è la tua domanda, ma b) non è una domanda costruttiva.
ChrisF

6
C non beve abbastanza metallo?
Tom Squires,

6
Io program bare metalogni volta che prendo a calci la mia casella di server. Funziona a meraviglia!
yannis,

7
Hai mai considerato di andare ancora più in basso? Hack la tua CPU: opencores.org
SK-logic

3
@ SK-logic, sì, la programmazione del codice macchina diventerebbe insopportabile dopo circa 1 ora. Hai ragione, un'idea migliore e più produttiva è quella di arrivare all'implementazione della CPU. Esistono anche versioni virtuali del 6502 ( visual6502.org ) e persone che hanno o aspirano a costruire CPU utilizzando la moderna logica discreta ( bradrodriguez.com/papers/piscedu2.htm )
Angelo

Risposte:


27

Le persone non programmano nel codice macchina (a meno che non siano masochiste). Usano (o sviluppano) strumenti per generare codice macchina (compilatore o assemblatore, inclusi strumenti di sviluppo incrociato), o forse librerie che generano codice macchina (LLVM, libjit, GNU lightning, ....). Quindi anche le risorse sulla generazione del codice macchina, la compilazione, gli ottimizzatori e le micro-architetture sono rilevanti.

E molto spesso, un buon compilatore ottimizzante genera un codice macchina migliore di quello che potresti fare. Probabilmente non sarai in grado di scrivere un codice assembler di 200 righe meglio di un buon ottimizzatore.

Se vuoi capire il codice macchina, impara prima l'assemblaggio. È molto vicino al codice macchina. Usalo saggiamente, solo per cose che non puoi programmare in C (o in un linguaggio di livello superiore, come Ocaml, Haskell, Common Lisp, Scala). Un buon metodo consiste spesso nell'utilizzare le asmistruzioni (in particolare la funzione di assemblaggio esteso GCC ) all'interno di una funzione C. Anche la lettura del codice assembly (generato da gcc -S -O2 -fverbose-asm) può essere utile.

Il Linux Assembly HowTo è una buona cosa da leggere.

L'architettura dell'insieme di istruzioni dell'attuale processore (ovvero l'insieme di istruzioni compreso dal chip) è piuttosto complessa. Quelli comuni sono x86 (un tipico PC in modalità a 32 bit), X86-64 (un PC desktop in modalità a 64 bit), ARM (smartphone, ...), PowerPC ecc. Sono tutti piuttosto complessi (a causa di storico ed economico motivi). Forse apprendere prima un'istruzione ipotetica come l'MMIX di Knuth è più semplice.


8
"Le persone non programmano in C (...). Usano le lingue moderne, forse con il backend in C"
Abyx,

Sono assolutamente d'accordo. E il mio attuale progetto di lavoro (MELT, vedi gcc-melt.org ) è un DSL tradotto in C.
Basile Starynkevitch il

Ho aggiunto alcuni riferimenti agli ISA
Basile Starynkevitch il

6
Che dire di quelli che vogliono creare e assembler? Ci sono ragioni per imparare il codice macchina, anche se non sono così comuni.
Jetti,

Direi che sta imparando un'architettura di set di istruzioni (usando l'assemblaggio mnemonico). Raramente apprendi esplicitamente la codifica esatta dell'istruzione (ad es. Che NOP è 0x90). Molti hanno bisogno di saperlo quando si scrive un assemblatore o un generatore di codice macchina. (Allo stesso modo, raramente è necessario imparare a memoria la codifica UTF8 di Unicode).
Basile Starynkevitch,

13

Come affermato in precedenza, Impara Assemblea .

Un linguaggio assembly è un linguaggio di programmazione di basso livello per computer, microprocessori, microcontrollori e altri dispositivi programmabili. Implementa una rappresentazione simbolica dei codici macchina e di altre costanti necessarie per programmare una determinata architettura della CPU.

Quindi Assembly è un symbolic representation of machine code.

Ora potresti chiedere "Ok, quindi come posso imparare tutto ciò?" Sono così felice che tu abbia chiesto:

  1. Comprendi di cosa si tratta. È di livello molto basso e ti darà una comprensione molto approfondita di un computer. Potresti voler iniziare con Wikipedia e quindi leggere questo breve passaggio .
  2. Imparalo! Le letture migliori sono probabilmente l'Arte del linguaggio assembly e del linguaggio assembly passo dopo passo: programmazione con Linux
  3. Ottieni la codifica!

Stavo leggendo quest'altro thread e immagino di imbattermi in questo: programmers.stackexchange.com/a/82573/43388 qualcosa di quella natura su cui potrei trovare un tutorial? Ma prima devo imparare l'assemblaggio per facilitare la transizione.
AceofSpades,

1
Grazie, immagino di dover imparare l'assemblaggio su richiesta popolare. +1
AceofSpades,

8

Consiglio vivamente di riconsiderare il tuo obiettivo ed ecco perché:

Ho imparato per la prima volta il 6502 Assembly Language sul BBC Microcomputer (Modello B, 32K). Aveva un'impressionante implementazione BASIC che includeva un assemblatore di macro. Li abbiamo avuti a scuola, quindi ho scritto tutti i tipi di programmi maliziosi che farebbero cose come la manipolazione diretta del buffer dello schermo per fare una passeggiata Lemming su ogni schermo, intorno alla stanza (erano collegati in rete) se le macchine non fossero state utilizzate per 10 minuti . Ha provocato risatine tra i miei amici del 7 ° anno.

Quando ho avuto un Commodore 64 a casa, ho appreso che aveva una CPU 6510 che eseguiva anche il linguaggio assembly 6502 ma con alcuni extra interessanti. Ho dovuto comprare un assemblatore (è arrivato su una cartuccia ) e invocare i programmi tramite BASIC. Con le grandi visioni di scrivere un gioco best-seller, alla fine sono riuscito a creare diverse demo che l'hardware di visualizzazione video bit-twiddled registra su interrupt per creare interessanti effetti della barra dei colori che animano la musica funky dei chip. Impressionante, ma non così utile.

Ho quindi ottenuto un Acorn Archimedes A310 che aveva una CPU ARM2, quindi ho usato la stessa fantastica implementazione BASIC con macro assemblatore incorporato come BBC Micro (stessa eredità). Sono riuscito a mettere insieme un paio di giochi per i quali un amico artistico ha fornito la grafica, oltre ad alcune demo trippy basate su sinusoidi. Entrambi sono stati un duro lavoro da programmare e un codice errato ha potuto abbattere la macchina (inciampare accidentalmente il registro di ripristino hardware, ecc.), Perdere tutto se non avessi salvato (su floppy!).

All'università mi è stato presentato C ++ e quindi C. Sono stato in grado di usarlo per programmare Sun / Solaris e alcuni altri grandi computer mainframe. Non ho idea di quali architetture CPU funzionassero su queste macchine: non ho mai avuto bisogno di usare assemblatore o leggere il codice macchina poiché gli strumenti C ++ mi davano la potenza di cui avevo bisogno per produrre applicazioni professionali.

Dopo Uni, ho lavorato su Windows e diverse versioni di Unix. C e C ++ hanno funzionato su tutte queste macchine e alla fine anche Java.

Ho quindi lavorato su Windows e Dreamcast utilizzando C ++ con DirectX con una catena di strumenti completa per il debug.

Ho quindi svolto un lavoro lavorando con chipset basati su ARM per Smart TV (nel 2000). Sebbene la mia esperienza con ARM2 possa essere stata rilevante qui, il lavoro era basato su C. Ho scoperto che tutto ciò che riguardava l'hardware che avevo fatto su Archimede poteva essere fatto anche in C usando semplici operazioni di manipolazione dei bit. Parte del mio ruolo era migrare la base di codice su Windows, Playstation 2, Linux, altri TV e chipset mobili. Tutte queste piattaforme erano disponibili sia con un compilatore C (spesso GCC) sia con un certo livello di API per scrivere sulla macchina sottostante - il mondo incorporato è raramente un kernel O / S. Non ho mai avuto bisogno di conoscere il codice macchina completo per nessuna particolare piattaforma oltre a scrivere un boot loader e un mini BIOS, entrambi passati al codice C alla prima opportunità disponibile (dopo aver impostato i vettori trap,

Il lavoro successivo stava lavorando con C ++, C # e JavaScript su Windows. Nessun codice macchina.

Il lavoro attuale sta lavorando con C ++, JavaScript, Python, LUA, HTML e altri linguaggi su varie piattaforme. Non ho idea di quale codice macchina eseguano queste piattaforme, né ho bisogno di sapere - il compilatore traduce il nostro codice in qualunque cosa debba essere. Se si arresta in modo anomalo, rilevo l'errore in un debugger o tramite la diagnostica di runtime (eccezioni, segnali, ecc.).

Per divertimento, sviluppo applicazioni iOS nel poco tempo libero che ho a casa. Utilizza Objective-C e un'API che funziona su più chipset. Apparentemente sono basati su ARM, ma non ho mai visto alcun codice macchina nel mio sviluppo.

Sebbene sia un esercizio affascinante per imparare il linguaggio degli assemblaggi, ora ci sono strumenti e linguaggi di livello molto più elevato che ti consentono di essere un ordine di grandezza (o due) più produttivo.

Il numero di opportunità di lavoro disponibili per un fantastico programmatore di linguaggio assembly / codice macchina è minuscolo rispetto a qualcosa come JavaScript, Java, C #, C ++ o ObjC.

Ti consiglierei di renderlo un hobby / interesse collaterale piuttosto che un obiettivo principale.


6
È un hobby. Sono interessato a come funzionano le cose e imparo a manipolarle a livello molto basilare, se possibile. +1
AceofSpades

6

Il mio consiglio? Scopri MIPS e scopri come costruire un (semplice) processore MIPS. In realtà è più facile di quanto sembri.

Il vantaggio di MIPS rispetto ad alcune delle altre architetture è la semplicità. Non rimarrai coinvolto in molti piccoli dettagli, ma imparerai comunque tutte le grandi idee di cui hai bisogno per scrivere codice in altre architetture.

Per coincidenza, questo è stato il progetto finale per la mia (terza) lezione di introduzione al CS. Se lo desideri, puoi leggere il compito e sfogliare le lezioni come video o diapositive .

Tra le altre cose, abbiamo fatto di copertura come il codice MIPS viene trasformato in binario; abbiamo anche dovuto decodificare del codice macchina (molto semplice) sugli esami.

Anche se non vuoi coprire tutto, la maggior parte delle lezioni sono state tenute da uno dei docenti preferiti dagli studenti e sono divertenti da guardare da sole.


Grazie mille per i collegamenti e per aver spiegato da dove dovrei partire. +1
AceofSpades

6

Sono uno studente, fresco di programmazione e amante, da Java a C ++ e fino a C. Mi sono spostato all'indietro fino alle barebone e ho pensato di andare più in basso fino all'Assemblea.

Ottimo percorso da prendere. Il mio salto (caduta?) Da C a Assembly e inferiore era un corso universitario Computer Organization and Design , basato sull'omonimo libro .

Consiglio vivamente questo libro per i primi capitoli sull'assemblaggio MIPS di base, attraverso pipeline e architettura di memoria. Ancora meglio sarebbe seguire un corso sullo stesso tema o trovare lezioni online.

Vedi anche il simulatore MARS MIPS per sporcare le mani durante la scrittura.


4

Se vuoi capire come funziona completamente la macchina, perché non vai al livello più basso possibile e raggiungi la tua posizione (ad es., C, C ++)?

Voglio dire: perché non costruisci il tuo adder a 4 bit con transistor su un circuito (basta cercarlo su Google se stai cercando istruzioni / tutorial)?

Dopodiché costruisci un piccolo computer con un po 'di RAM, quindi inizia a imparare Assembly e scrivi un programma o due con esso.


Se il poster originale costruisce un computer da zero, dovrà definire (non solo imparare) il proprio assemblaggio.
Basile Starynkevitch,

@daniels Capisco il ragionamento imparando ad aggiungere da bit che è veramente di basso livello. +1
AceofSpades,

Un'alternativa alla costruzione di un computer da zero potrebbe essere l'apprendimento di un vecchio processore (e il suo linguaggio di assemblaggio) come lo Z80 o 6502 che è ancora abbastanza semplice da capire. Immagino ci siano anche emulatori con cui puoi giocare.
Giorgio,

@AceofSpades Un ottimo modo per costruire facilmente CPU e componenti CPU (ad es. Un sommatore) è con Redstone in Minecraft, lo consiglierei. Ho iniziato a lavorare su alcune macchine semplici in Minecraft e ha notevolmente migliorato la mia comprensione della teoria e della logica dietro i computer.
Aaron,

1

Ho creato un set di istruzioni per questo, un simulatore e alcuni tutorial sulle basi, un'istruzione o un concetto per lezione. Basta digitare il programma, eseguirlo, quindi imparare cosa fa, passare alla lezione successiva.

http://www.github.com/dwelch67/lsasim

Ho anche simulatori per alcuni set di istruzioni tradizionali. Qualcuno o tutti sono buoni per l'uso per imparare l'asm (se davvero senti di dover imparare x86, imparalo per ultimo e usa un simulatore come quello che ho biforcuto, 8088/86 prima poi vai avanti). L'apprendimento contro un simulatore ha pro e contro, uno dei maggiori pro, specialmente all'inizio, è che non si blocca nulla e si ha un'ottima visibilità. Saltando in testa prima in una piattaforma integrata, un microcontrollore, ecc. Per apprendere un nuovo set di istruzioni devi superare gli ostacoli del non poter vedere cosa sta succedendo, portando a un lungo elenco di modi per fallire ...


1

Il codice di Charles Petzold è un'ottima introduzione all'argomento e descrive il processo di costruzione di un computer, incluso il modo di costruire additivi, contatori e array di RAM e introduce il codice macchina e il linguaggio assembly e la loro relazione con linguaggi di livello superiore. È anche un'ottima lettura della storia dell'informatica.

E ho appena letto questa domanda su electronics.stackexchange che potrebbe anche essere utile


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.