Risorse sull'apprendimento per programmare in codice macchina? [chiuso]

24

Sono uno studente, appena entrato in programmazione e amandolo, da Java a C ++ e giù a C. Mi sono spostato all'indietro verso le barebone e ho pensato di andare più in basso all'Assemblea.

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

L'unica cosa possibile che ho sentito dopo tanta ricerca è che un editor esadecimale è la cosa più vicina al linguaggio macchina che potrei trovare in questa era e epoca. Ci sono altre cose di cui non sono a conoscenza? Ci sono risorse per imparare a programmare in codice macchina? Preferibilmente su un microcontrollore a 8 bit / microprocessore.

Questo domanda è simile al mio, ma mi interessa innanzitutto l'apprendimento pratico e poi la comprensione della teoria.

    
posta AceofSpades 20.12.2011 - 10:09
fonte

9 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, compresi strumenti di sviluppo incrociato), o forse librerie che generano codice macchina (LLVM, libjit, GNU lightning, ....). Anche le risorse relative alla generazione del codice macchina, alla compilazione, agli ottimizzatori e alle micro-architetture sono rilevanti.

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

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

L' Linux Assembly HowTo è una buona cosa da leggere.

L'architettura del set di istruzioni del processore corrente (ovvero l'insieme di istruzioni comprese 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 abbastanza complessi (a causa di ragioni storiche ed economiche) . Forse imparando prima un'ipotetica istruzione impostata come per es. Il MMIX di Knuth è più semplice.

    
risposta data 20.12.2011 - 11:19
fonte
13

Come indicato in precedenza Scopri assembly .

An assembly language is a low-level programming language for computers, microprocessors, microcontrollers, and other programmable devices. It implements a symbolic representation of the machine codes and other constants needed to program a given CPU architecture.

Quindi Assembly è un symbolic representation of machine code .

Ora potresti chiedere "Ok, quindi, come faccio a imparare tutto questo?" Sono così felice che tu abbia chiesto:

  1. Comprendi cos'è. È molto di basso livello e ti darà una comprensione molto approfondita di un computer. Potresti voler iniziare con Wikipedia e poi leggere questo breve passaggio .
  2. Scoprilo! Le migliori letture sono probabilmente The Art of Assembly Language e Procedura dettagliata per l'assemblaggio: programmazione con Linux
  3. Ottieni codice!
risposta data 20.12.2011 - 12:32
fonte
8

Ti suggerisco caldamente di riconsiderare il tuo obiettivo ed ecco perché:

Ho appreso per la prima volta 6502 Assembly Language sul Microcomputer BBC (Modello B, 32K). Aveva un'impressionante implementazione BASIC che includeva un macro assemblatore. 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 di Lemming su ogni schermo, intorno alla stanza (erano collegati in rete) se le macchine non fossero state usate 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 grandiose visioni di scrivere un gioco best-seller, alla fine sono riuscito a creare diverse dimostrazioni che i registri hardware di visualizzazione video bit-twiddled in interruzione facevano interessanti effetti della barra dei colori che animavano la musica dei chip funky. Impressionante, ma non così utile.

Poi ho ottenuto un Acorn Archimedes A310 con una CPU ARM2, quindi ho usato la stessa impressionante implementazione BASIC con macro assembler integrato come BBC Micro (stesso patrimonio). Riuscii a mettere insieme un paio di giochi a cui un amico artistico aveva fornito grafica, oltre ad alcuni demo trippy basati su sinusoidi. Entrambi questi erano un duro lavoro da programmare e un codice errato poteva far cadere la macchina (accidentalmente far scattare il registro di reset dell'hardware, ecc.), Perdendo tutto se non avessi salvato (su floppy!).

All'università I è stato introdotto in C ++ e quindi C. Sono stato in grado di usarlo per programmare Sun / Solaris e alcuni altri computer mainframe di grandi dimensioni. Non ho idea di quali architetture CPU funzionassero su queste macchine - Non ho mai avuto bisogno di usare assembler o leggere codice macchina dato che gli strumenti C ++ mi hanno dato 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 su Java.

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

Poi ho iniziato a lavorare con chipset basati su ARM per Smart TV (nel 2000). Anche se la mia esperienza con ARM2 poteva essere rilevante qui, il lavoro era basato su C. Ho scoperto che tutta la ricerca sull'hardware che avevo fatto su Archimede poteva essere fatta anche in C usando semplici operazioni di bit-twiddling. Parte del mio ruolo consisteva nel migrare il codice base su Windows, Playstation 2, Linux, altri chipset TV e mobili. Tutte queste piattaforme erano disponibili con un compilatore C (spesso GCC) e 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 una particolare piattaforma oltre a scrivere un boot loader e un mini-BIOS, entrambi entrati nel codice C alla prima opportunità disponibile (dopo aver impostato i vettori trap, assicurando l'endianità e modalità istruzioni e stabilendo una pila).

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

Il lavoro corrente sta lavorando con C ++, JavaScript, Python, LUA, HTML e altre lingue su varie piattaforme. Non ho idea di quale codice macchina funzioni queste piattaforme, né ho bisogno di sapere - il compilatore traduce il nostro codice in qualunque cosa debba essere. Se si blocca, rilevo l'errore in un debugger o attraverso 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 assembly, ora ci sono strumenti e linguaggi di livello più alto che ti permettono di essere un ordine di grandezza (o due) più produttivo.

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

Ti consiglierei di rendere questo hobby / side-interest piuttosto che un obiettivo principale.

    
risposta data 11.01.2012 - 17:36
fonte
6

Il mio suggerimento? Impara MIPS e impara come costruire un (semplice) processore MIPS. In realtà è più facile di quanto sembri.

Il vantaggio di MIPS su alcune delle altre architetture è la semplicità. Non sarai coinvolto in un sacco di piccoli dettagli, ma imparerai comunque tutte le grandi idee necessarie per scrivere codice in altre architetture.

Per coincidenza, questo era il progetto finale per la mia (terza) intro classe CS. Se lo desideri, puoi leggere l' assegnazione e sfogliare le lezioni come video o diapositive .

Tra le altre cose, abbiamo fatto che illustra come il codice MIPS diventa trasformato in binario; abbiamo anche dovuto decodificare un 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 soli.

    
risposta data 11.01.2012 - 04:04
fonte
6

I'm a student, fresh into programming and loving it, from Java to C++ and down to C. I moved backwards to the barebones and thought to go further down to Assembly.

Eccellente percorso da seguire. Il mio salto (caduta?) Da C a Assemblea e inferiore era un corso universitario Organizzazione e progettazione di computer , basato su il libro con lo stesso nome.

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

Vedi anche il MARS MIPS Simulator per sporcarti le mani assemblando la scrittura.

    
risposta data 11.01.2012 - 06:00
fonte
4

Se vuoi capire come funziona la macchina completamente, perché non vai al livello più basso possibile e costruisci la strada fino a dove ti trovi (ad es., C, C ++)?

Con questo intendo: perché non costruisci il tuo sommatore a 4 bit con transistor su un circuito (solo Google se cerchi istruzioni / tutorial)?

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

    
risposta data 20.12.2011 - 14:35
fonte
1

Ho un set di istruzioni che è stato creato 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.

link

Ho anche dei simulatori per alcuni set di istruzioni mainstream. Alcuni o tutti sono utili per imparare ad asm (se senti veramente di dover imparare x86, apprenderlo per ultimo, e usare un simulatore come quello che ho biforcuto, 8088/86 prima di andare avanti). Imparare contro un simulatore ha pro e contro, uno dei maggiori professionisti, specialmente quando parti, non ti capita nulla e hai una grande visibilità. Saltare in testa prima su una piattaforma embedded, un microcontrollore, ecc. Per apprendere un nuovo set di istruzioni per superare gli ostacoli a non essere in grado di vedere cosa sta succedendo, portando a una lunga lista di modi per fallire ...

    
risposta data 11.01.2012 - 06:39
fonte
1

Il codice di Charles Petzold è un'ottima introduzione all'argomento e descrive il processo di costruzione di un computer come costruire adder, contatori e array 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.

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

    
risposta data 06.09.2012 - 14:59
fonte
-2

Per lo studio e la programmazione del linguaggio macchina
È possibile utilizzare il software MASM.

Per MASM, è possibile utilizzare il seguente link.

link
link

    
risposta data 06.09.2012 - 04:37
fonte

Leggi altre domande sui tag