Преобразовать инструкцию ARM в инструкцию i386 - PullRequest
8 голосов
/ 28 мая 2010

Имеется ли какая-либо инструкция ARM для конвертера инструкций i386?

Ответы [ 7 ]

11 голосов
/ 03 июня 2010

Вы можете использовать QEMU для эмуляции инструкций ARM на x86.

2 голосов
/ 04 июня 2010

Вы можете перепроектировать код ARM в C, а затем просто скомпилировать код C. Эта компания на самом деле производит довольно хороший код C на ассемблере. (Я никогда не использовал их продукт, но я знаком с исследованиями этой компании).

1 голос
/ 09 июня 2010

Эмуляция или статическая двоичная трансляция - это пути, которые я бы выбрал, у каждого есть свои плюсы и минусы.

Вы должны быть более ясными в отношении того, что вы спрашиваете. Простой перевод одного набора команд в другой - это одно, а труднее сделать результат полезным - то, к чему вы обращаетесь. Память и регистр вашего ARM не будут соответствовать X86, поэтому прямой инструкции к инструкции (эмулируемой или sbt) будет недостаточно, вам нужно добавить код для замены многих загрузок и хранилищ чем-то, что проверяет адрес, определяет, что это было адресовано и эмулировать это периферийное устройство (эмулированное или sbt).

0 голосов
/ 12 февраля 2012

Microsoft предоставляет эмулятор устройства, который делает именно это. первая версия даже поставляется с исходным кодом: http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=10865

0 голосов
/ 06 декабря 2010

Самый простой способ сделать это - использовать то, что называется «Software Dynamic Translation». Вы можете найти некоторую информацию о технике здесь:

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

Он работает путем динамического перевода «базовых блоков», когда вы переводите все инструкции вплоть до контрольной точки (ветвление, вызов, переход), а затем заменяете код в целях ветвления заглушками, которые вызывают обратный вызов в переводчике. Он примерно эквивалентен чему-то вроде «JIT-компиляции» в CLR, за исключением того, что он работает на более детальном уровне (базовые блоки вместо методов). Это выгодно по сравнению с подходами статического перевода, потому что оно не зависит от точной разборки. Получение идеальной разборки невозможно (это эквивалентно проблеме остановки). Даже у действительно хороших дизассемблеров, таких как IDA pro, могут возникнуть проблемы с идентификацией таких вещей, как обработчики исключений, и они часто путают код с данными.

Программный динамический перевод, однако, не подпадает ни под одно из этих ограничений. Он может даже (теоретически) обрабатывать самоизменяющийся код, используя соответствующие методы защиты памяти.

0 голосов
/ 04 июня 2010

http://www.libcpu.org/

Это очень много в бета-версии, но идея состоит в том, чтобы написать клиентские интерфейсы llvm для двоичных файлов, чтобы затем серверный интерфейс llvm мог генерировать код для любой поддерживаемой платформы. Сейчас активно разрабатывается интерфейс ARMv6, и я уверен, что они хотели бы помочь с этим. Цель состоит в том, чтобы поддерживать эмуляцию и статическую перекомпиляцию между любыми поддерживаемыми архитектурами.

0 голосов
/ 28 мая 2010

я действительно сомневаюсь. слишком много различий, чтобы сделать его автоматизированным.

...