2010-05-28 15 views
6

È disponibile un'istruzione ARM per il convertitore di istruzioni i386?Conversione istruzione ARM in istruzione i386

+9

Che cosa stai cercando di ottenere? –

+0

Stai provando a eseguire solo il codice che hai (nel qual caso un buon emulatore) o stai provando a convertire un codice che hai ereditato da uno sviluppatore precedente e dove non hai la fonte? –

+2

Mentre la conversione delle istruzioni da istruzioni ARM a x86 è tecnicamente possibile con un compilatore personalizzato (da ARM a IR a x86), ci sono altri ostacoli predominanti, un sistema operativo completamente diverso e librerie run-time che l'applicazione è progettata per comunicare con il quale non ha nulla a che fare con la conversione delle istruzioni. È più facile ricompilare l'applicazione per x86 e per il SO di destinazione. – tgiphil

risposta

11

È possibile utilizzare QEMU per emulare le istruzioni ARM su x86.

0

ho davvero dei dubbi. ci sono troppe differenze per renderlo automatizzato.

+1

Sono molto più vicini di, ad esempio, ANSI C e x86, ma ci sono molti programmi che fanno automaticamente questa conversione. – Ken

+0

Niente affatto. ANSI C è progettato per compilare vari linguaggi assembler. Molti concetti (relativamente) di alto livello in C possono essere rappresentati in molti modi diversi in diversi assemblatori. Tra gli assemblatori, tuttavia, c'è una storia diversa. – Puppy

0

http://www.libcpu.org/

E 'molto in beta, ma l'idea è quello di scrivere LLVM front-end per i binari, in modo che la LLVM back-end può quindi generare il codice per qualsiasi piattaforma supportata. C'è un front end ARMv6 in fase di sviluppo attivo, e sono sicuro che vorrebbero avere aiuto con esso. L'obiettivo è supportare l'emulazione e la ricompilazione statica tra una qualsiasi delle architetture supportate.

1

È possibile eseguire il reverse-engineer del codice ARM su C, quindi compilare semplicemente il codice C. This company produce effettivamente codice codice C piuttosto buono dall'assemblatore. (Non ho mai usato il loro prodotto, ma ho familiarità con la ricerca dietro quella società).

1

L'emulazione o la traduzione binaria statica sono i percorsi da seguire, ognuno ha i suoi pro e contro.

È necessario essere più chiari su ciò che si sta chiedendo. La semplice traduzione di un set di istruzioni su un altro è una cosa, la parte più difficile di rendere il risultato utile è ciò che stai affrontando. La memoria e lo spazio di registrazione del tuo ARM non corrisponderanno all'X86, quindi un'istruzione diritta all'istruzione (emulata o sbt) non sarà sufficiente, devi aggiungere del codice per sostituire molti carichi e negozi con qualcosa che controlla l'indirizzo, determina cosa stava affrontando ed emula quella periferica (emulata o sbt).

0

Il modo più semplice per farlo consiste nell'utilizzare qualcosa chiamato "Traduzione dinamica del software". Potete trovare alcune informazioni sulla tecnica qui:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.120.5182&rep=rep1&type=pdf

Funziona traducendo dinamicamente "blocchi di base", in cui si traduce tutte le istruzioni fino ad un punto di controllo (filiale, chiamata, salto) e quindi sostituire il codice agli obiettivi delle filiali con stub che richiamano nel traduttore. È approssimativamente equivalente a qualcosa come "Compilazione JIT" nel CLR, tranne che funziona a un livello più granulare (blocchi di base invece di metodi). È vantaggioso rispetto agli approcci di traduzione statica perché non si basa su un disassemblaggio accurato. Non è possibile ottenere lo smontaggio perfetto (è equivalente al problema dell'arresto). Anche i veri disassemblatori, come IDA pro, possono avere problemi nell'identificare cose come i gestori di eccezioni e spesso confondono il codice con i dati.

La traduzione dinamica del software, tuttavia, non è soggetta a nessuna di queste limitazioni. Può anche (in teoria) gestire il codice auto modificante usando appropriate tecniche di protezione della memoria.