2012-12-01 20 views
13

Ho fatto un po 'di ricerche ma non sono riuscito a trovare una risposta definitiva su questo, quindi spero di poter ottenere la tua opinione.Imparare la lingua dell'Assembly usando Raspberry Pi?

Mi piacerebbe imparare Assembly Language (ARM) - il Raspberry Pi sarebbe una buona scelta per questo?

Da quello che posso vedere sembra che ci siano alcuni tutorial per fare cose come fare il flash LED, ecc. Quindi, da una prospettiva newbie non è troppo spaventoso, e in realtà sembra molto divertente .

Se ho iniziato con il Raspberry Pi e poi sono passato all'utilizzo di disassemblatori per sviluppare le mie conoscenze, sono sulla buona strada o sto iniziando con il piede sbagliato?

Grazie per i vostri commenti.

+0

Vivek-Ramachandran - [SecurityTube] (http://www.securitytube.net/video/208) Questo solo primo video ... è possibile trovare sequenziale su security-freak.in –

+0

Questo sito è per programmazione specifica problemi che hai incontrato, non per avere consigli generali per la tua educazione. –

risposta

18

Sì e no. Se questo è il tuo primo linguaggio assembly, ARM è buono (x86 è uno cattivo) per cominciare (ce ne sono altri buoni). Raccomando di imparare prima usando un simulatore di istruzioni. Questo può darti una migliore visibilità su ciò che sta succedendo e ti darà una migliore possibilità di successo (meno di una possibilità di rinunciare a causa della frustrazione). Una volta che hai i piedi bagnati con gli strumenti, costruisci programmi bare metal, ecc. Allora il Raspberry Pi non è una cattiva piattaforma. le periferiche anche se scarsamente documentate sono molto semplici da usare (rispetto ad altre piattaforme simili), c'è abbastanza di una comunità ed esempi là fuori per compensare la documentazione. il raspberry pi può essere considerato non brickable dal punto di vista di ARM. Costruire una tavola cercando di realizzare il tuo primo programma a intermittenza può essere piuttosto frustrante.

Ho alcuni esempi su github.com/dwelch67 thumbulator è un simulatore di istruzioni per il pollice che per qualsiasi programmatore C dovrebbe essere facile da capire e consente di esaminare cosa sta succedendo. amber_samples è un approccio diverso, è un clone arm2 (a parte poche eccezioni puoi vedere una relazione diretta tra arm2 e il moderno arm4 e oltre che sono autorizzati da arm. dovrebbe essere una transizione graduale tra i due. ho bisogno di un simulatore, il mio esempio usa verilator ma icarus verilog dovrebbe funzionare altrettanto facilmente, dove si ottiene la visibilità osservando il programma eseguito nel processore, guardando bus e simili, recuperi di istruzioni, cicli di memoria, ecc.

I am un grande credente nella scrittura di un disassemblatore come un modo per imparare un nuovo set di istruzioni (per me) il set di istruzioni ARM ha una lunghezza di parola fissa (32 bit) e molto facile da smontare. più facile da smontare, il pollice ha le estensioni thumb2 e questo lo rende più difficile, quindi vorrei evitare quelli all'inizio. set di ioni si può tranquillamente camminare attraverso l'immagine binaria e smontare mentre si va dall'inizio alla fine. i dati sembreranno strani, ma le istruzioni saranno nel posto giusto. Con una lunghezza di parola variabile non puoi semplicemente iniziare dall'inizio e smontare linearmente (usando estensioni thumb2 significa lunghezza di istruzione variabile) potresti avere un'istruzione a tre byte, quindi un byte di dati, quindi un altro byte di istruzione, linearmente quel byte di dati sarebbe disassemblato come un'istruzione e se capita di decodificarlo come istruzione multi-byte, allora ora sei fuori sincrono. L'unico modo corretto per smontare un binario di lunghezza di istruzione variabile è seguire tutti i percorsi del codice in ordine di esecuzione e da quello smontare quello che è possibile (senza emulare ogni possibile percorso di codice potresti non essere in grado di distinguere tutte le istruzioni dai dati) . il disassemblaggio della lunghezza variabile delle istruzioni è sicuramente un argomento avanzato, in primo luogo acquisisce una certa forza nel linguaggio assembly. Forse persino creare un simulatore di set di istruzioni per un'istruzione a lunghezza di parola variabile impostata prima di affrontare un disassemblatore (devi sostanzialmente decodificare il tuo percorso attraverso il binario, non decodificandolo completamente ma decodificando parzialmente per creare un disassemblatore per un set di istruzioni a lunghezza di parola variabile. scusa per la lunga descrizione lì.

entrambi gli approcci di thumbover e amber_samples hanno una lunghezza di istruzione fissa che facilita la visualizzazione del comando asm to machine code asm. così come vedere il tuo codice in esecuzione e capire perché è andato fuori per le erbacce e morto (che non vorresti vedere sul pi greco o altro hardware).

Esiste un esempio di cambride university che tiene la mano attraverso semplici esempi di led lampeggianti e poi in pixel video. così come altre persone che hanno pubblicato link ai loro esempi nella sezione bare metal dei forum di discussione. per avere un'idea di "come faccio questo in linguaggio assembly", scrivi piccole funzioni C, compila (con ottimizzazione), quindi disassembla. Sto specificatamente parlando di codice come a + b, non di codice come printf(). Si sta imparando il linguaggio assembly, il set instruciton, che è specifico (comune) alla famiglia di processori. quindi vorrei discutere DOPO CHE impara le chiamate di sistema o le chiamate in biblioteca. "come faccio a stampare una stringa" il genere di cose riguarda sia l'apprendimento dell'hardware, il sistema (un rom monitor/debugger) o la libreria (la libreria C o altri linguaggi di alto livello chiamano e convengono per trarre vantaggio dalle loro librerie, che possono chiamare molti altre librerie che causano un sacco di junk collegato in). quindi usare C per imparare "linguaggio assembly" significa nessuna chiamata alla libreria, nessuna memcpy no printf ecc. Dipende solo da te, se usi le chiamate di sistema e di libreria allora devi scrivere il tuo codice asm per eseguire su quel sistema o collegamento con quelle chiamate che potrebbero avere esse stesse una dipendenza dal sistema. Pensa all'apprendimento di un linguaggio di alto livello C o Python, ecc. Si impara la lingua, dichiarando le variabili imparando gli operatori per aggiungere, sottrarre, xor, ecc. Come usare puntatori e matrici, ecc. Ad un certo punto si impara la libreria C chiama, printf(), strcpy(), malloc, ecc. YMMV, impara poi la lingua, quindi il sistema chiama separatamente o impara la lingua imparando a interfacciarsi con le chiamate di sistema (impararle insieme).

Se si sceglie di imparare come parte del sistema, si consiglia di rimanere in linux, creare un numero semplice di funzioni C, compilare e disassemblare, imparare le convenzioni di chiamata per il compilatore e utilizzare i materiali di riferimento del braccio per cercare il istruzioni come le vedi create dal compilatore. impara a creare quella funzione da zero usando asm e collegalo con il programma C, quindi modifica quella funzione. Questo è un approccio completamente diverso da quello che ho descritto sopra. battuto con la possibilità di fallimento, ma è sicuramente un apprendere con l'approccio di esempio.

+0

Grazie mille per la tua risposta dettagliata! –