L'ho fatto molte volte e continuo a farlo. In questo caso, dove il tuo obiettivo principale è leggere e non scrivere assembler, ritengo che questo sia valido.
Scrivi il tuo disassemblatore. Non allo scopo di creare il prossimo miglior disassemblatore, questo è strettamente per te. L'obiettivo è imparare il set di istruzioni. Se sto imparando l'assemblatore su una nuova piattaforma, ricordando l'assemblatore per una piattaforma che conoscevo una volta. Inizia con solo poche righe di codice, aggiungendo registri per esempio e ping pong tra smontare l'output binario e aggiungendo istruzioni sempre più complicate sul lato input:
1) apprendere il set di istruzioni per processore specifico
2) imparare le sfumature di come scrivere codice in assemblare per detto processore in modo tale che si può muovere ogni bit di codice operativo in ogni istruzione
3) si impara il set di istruzioni meglio che la maggior parte ingegneri che utilizzano tale set di istruzioni per sopravvivere
Nel tuo caso ci sono un paio di problemi, di solito raccomando il set di istruzioni ARM per iniziare, ci sono più prodotti basati su ARM spediti oggi rispetto a qualsiasi altro (computer x86 inclusi). Ma la probabilità che tu stia usando ARM ora e non conosci abbastanza assemblatore per scrivere codice di avvio o altre routine sapendo che ARM può o non può aiutare quello che stai cercando di fare. La seconda e più importante ragione per la prima ARM è perché le lunghezze delle istruzioni sono fisse e allineate. Disassemblare istruzioni di lunghezza variabile come x86 può essere un incubo come il tuo primo progetto, e l'obiettivo qui è quello di imparare il set di istruzioni per non creare un progetto di ricerca. Il terzo ARM è un set di istruzioni ben fatto, i registri sono uguali e non hanno sfumature particolari.
Quindi dovrete capire quale processore volete iniziare. Suggerisco prima msp430 o ARM, poi ARM prima o seconda poi il caos di x86. Indipendentemente dalla piattaforma, qualsiasi piattaforma che valga la pena di utilizzare ha fogli dati o manuali di riferimento dei programmatori liberi dal fornitore che includono il set di istruzioni e la codifica degli opcode (i bit e i byte del linguaggio macchina). Allo scopo di apprendere cosa fa il compilatore e come scrivere codice che il compilatore non deve fare a meno, è bene conoscere alcuni set di istruzioni e vedere come viene implementato lo stesso codice di alto livello su ogni set di istruzioni con ogni compilatore con ogni ottimizzazione ambientazione.Non vuoi entrare nell'ottimizzazione del tuo codice solo per scoprire che lo hai reso migliore per un compilatore/piattaforma ma molto peggio per tutti gli altri.
Oh per smontare insiemi di istruzioni di lunghezza variabile, invece di iniziare semplicemente dall'inizio e smontare ogni parola di quattro byte in modo lineare attraverso la memoria come faresti con l'ARM o ogni due byte come msp430 (Il msp430 ha istruzioni di lunghezza variabile ma tu può ancora andare in modo lineare attraverso la memoria se si inizia dai punti di ingresso dalla tabella vettoriale di interrupt). Per lunghezza variabile, si desidera trovare un punto di ingresso basato su una tabella vettoriale o una conoscenza su come il processore si avvia e seguire il codice nell'ordine di esecuzione. Devi decodificare completamente ogni istruzione per sapere quanti byte sono usati, quindi se l'istruzione non è un ramo incondizionato, supponiamo che il prossimo byte dopo quell'istruzione sia un'altra istruzione. È necessario memorizzare anche tutti gli indirizzi di ramo possibili e assumere quelli sono gli indirizzi di byte di partenza per ulteriori istruzioni. L'unica volta che ho avuto successo ho fatto diversi passaggi attraverso il binario. Partendo dal punto di ingresso ho contrassegnato quel byte come l'inizio di un'istruzione decodificato in modo lineare attraverso la memoria fino a colpire un ramo incondizionato. Tutti gli obiettivi delle diramazioni sono stati contrassegnati come indirizzi iniziali di un'istruzione. Ho fatto più passaggi attraverso il binario fino a quando non avessi trovato nuovi bersagli di ramo. Se in qualsiasi momento trovi dire un'istruzione a 3 byte ma per qualche motivo hai taggato il secondo byte come inizio di un'istruzione hai un problema. Se il codice è stato generato da un compilatore di alto livello questo non dovrebbe accadere a meno che il compilatore non stia facendo qualcosa di male, se il codice ha assembler scritto a mano (come ad esempio un vecchio gioco arcade) è possibile che ci siano dei rami condizionali che non possono mai accadere come r0 = 0 seguito da un salto se non zero. Potrebbe essere necessario modificare manualmente quelli fuori dal binario per continuare. Per i tuoi obiettivi immediati che presumo saranno su x86, non penso che avrai un problema.
Raccomando gli strumenti gcc, mingw32 è un modo semplice per utilizzare gli strumenti gcc su Windows se x86 è il vostro obiettivo. In caso contrario, mingw32 plus msys è un'ottima piattaforma per la generazione di un cross-compilatore da sorgenti binutils e gcc (in genere piuttosto semplice). mingw32 ha alcuni vantaggi rispetto a cygwin, come programmi significativamente più veloci e si evita l'inferno cygwin dll. gcc e binutils ti permetteranno di scrivere in C o assemblatore e disassemblare il tuo codice e ci sono più pagine web di quelle che puoi leggere mostrandoti come eseguire uno o tutti i tre. Se lo farai con un set di istruzioni a lunghezza variabile, ti consiglio vivamente di utilizzare un set di strumenti che include un disassemblatore. Ad esempio, un disassemblatore di terze parti per x86 sarà una sfida da utilizzare, in quanto non si sa mai se è stato smontato correttamente. Alcuni di questi sono dipendenti dal sistema operativo, l'obiettivo è compilare i moduli in un formato binario che contiene istruzioni di marcatura delle informazioni dai dati in modo che il disassemblatore possa svolgere un lavoro più accurato. L'altra scelta per questo obiettivo primario è quella di avere uno strumento che possa essere compilato direttamente sull'assemblatore per l'ispezione, quindi sperare che quando si compila in un formato binario crei le stesse istruzioni.
La risposta breve (okay leggermente più breve) alla tua domanda. Scrivi un disassemblatore per imparare un set di istruzioni. Vorrei iniziare con qualcosa di RISCY e facile da imparare come ARM. Una volta che si conosce un set di istruzioni, gli altri diventano più facili da raccogliere, spesso in poche ore, dal terzo set di istruzioni è possibile iniziare a scrivere il codice quasi immediatamente utilizzando il foglio dati/il manuale di riferimento per la sintassi. Tutti i processori che vale la pena utilizzare hanno una scheda tecnica o un manuale di riferimento che descrive le istruzioni fino ai bit e ai byte degli opcode. Impara un processore RISC come ARM e un CISC come x86 abbastanza per avere un'idea delle differenze, cose come dover passare attraverso i registri per tutto o essere in grado di eseguire operazioni direttamente sulla memoria con meno o nessun registro. Tre istruzioni per l'operando contro due, ecc. Quando si sintonizza il codice di alto livello, si compila per più di un processore e si confronta l'output. La cosa più importante che imparerai è che non importa quanto sia buono il codice di alto livello scritto la qualità del compilatore e le scelte di ottimizzazione fatte fanno una grande differenza nelle istruzioni reali. Raccomando llvm e gcc (con binutils), né producono codice ottimo, ma sono multi piattaforma e multiobiettivo e entrambi hanno ottimizzatori.Ed entrambi sono gratuiti e puoi facilmente creare compilatori incrociati da fonti per vari processori di destinazione.
domanda simile a http://stackoverflow.com/questions/1355524/which-syntax-and-architecture-of-assembly-is-most-useful-to-know – TrueWill
Sì, stavo leggendo anche quello. Ma la mia domanda è un po 'più "focalizzata", direi. –
Se sei su Windows, il target (cioè il processore, e quindi il set di istruzioni) è x86 o x86-64. A meno che non si ottenga un'altra macchina o una scheda MCU o si usi un emulatore. Quindi, è la domanda che * assemblatore * dovrei usare? O stai davvero chiedendo quale architettura scegliere come target? Personalmente adoro il bel set di istruzioni ortogonali sui chip della serie m68k, ahimè, alack. – dmckee