Каков наилучший способ анализа файла, содержащего язык ассемблера, с использованием Java? - PullRequest
0 голосов
/ 05 марта 2011

Я прочитал о StringTokenizer, StreamTokenizer, Scanner, Pattern и Matcher из пакета java.util.regex.Я также читал о мнениях о них, и я действительно запутался: какой из них лучше использовать?

Что мне нужно сделать, это создать Assambler, то есть проанализировать файл, содержащий язык ассемблера, изэтот файл, и мне нужно преобразовать его в машинный код.

Например, если у меня есть код сборки:

MOV R15,R12

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

Скажем так, что перевод выглядит следующим образом:

  • MOV становится 10 F3
  • R15 становится 11 F2
  • R12 становится 20 1E

Таким образом, мой выходной файл должен быть:

10 F3 11 F2 20 1E

Теперь мне нужно проанализироватьфайл ассемблера для идентификации каждой инструкции и того, что следует за ней.

Для тех, кто знает микроконтроллер, существует много способов появления инструкции.Мой вопрос:

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

ldi R13,0x31

Мне нужно иметь ldi в одном токене, r13 в другом и 31 в другом

Ответы [ 2 ]

2 голосов
/ 05 марта 2011

Ну, все, что вы упомянули, достаточно просто для токенизации строки или файла. В последней версии JDK StringTokenizer устарел, и существуют более эффективные токенизаторы, такие как Scanner и даже String.split (). Тем не менее, я не думаю, что это то, что вы хотите. Кажется, вам нужен лексер или хотя бы лексер-парсер. Поскольку вы хотите разобраться с токенами, а не просто разделить их на основе какого-либо разделителя. Так что либо вы исправляете свои собственные - если вы принимаете наркотики - либо просто используете один из очень хороших и существующих инструментов. Нравится ANTLR http://www.antlr.org/ Это тоже бесплатно, но может быть немного сложным в использовании. Также есть JavaCC. Удачи!

0 голосов
/ 05 марта 2011

Если ваша цель состоит в том, чтобы выполнить хороший анализ работы, вам нужно разработать правильный BNF и использовать реальную пару парсер / лексер. Просто взламывать StringTokenizer, String.split или regex не получится.

Как говорит @trigooner, вам нужен правильный лексер / анализ, чтобы быть чувствительным к контексту, хотя большинство ассемблерного кода не имеет большого контекста. Но если вы говорите «код ассемблера» как короткую руку, и вы действительно можете прочитать правильный макрос на ассемблере, то у них действительно есть контекст. Когда у вас есть контекст, вам нужна правильная реализация.

Большинство языков ассемблера x86 довольно просты. Если вы читаете код для более старых систем, скажем, PDP-10, вам придется справиться со сложностью.

...