2017-02-21 31 views
2

первый раз задавая вопрос на сайте, поэтому я был бы признателен за любые отзывы об ошибках или улучшениях. Это говорит о моей проблеме.Кодирование и декодирование команд ARM в/из двоичного кода

Задача 1: Создать соответствующее представление ARM ассемблера для следующих инструкций:

11101001_000111000001000000010000 
11100100_110100111000000000011001 
10010010_111110100100000011111101 
11100001_000000010010000011111010 
00010001_101011101011011111001100 

Задача 2: Написать код инструкции для следующих инструкций:

STMFA R13!, {R1, R3, R5-R11} 
LDR R11, [R3, R5, LSL #2] 
MOVMI R6, #1536 
LDR R1, [R0, #4]! 
EORS R3, R5, R10, RRX 

У меня нет опыта с этим материал и профессор оставили нам студентов, чтобы высохнуть. В основном я нашел различные методы для декодирования этих инструкций, но у меня есть еще три серьезных сомнения.

  1. Я не имею ни малейшего представления о том, как начать работу на декодирование двоичного кода в ARM Инструкции который является первой частью домашнего задания.

  2. Я не могу найти некоторые из этих суффиксов, например, на EORS, что такое S? Это бит условия установки? Установлено ли оно равным 1, если перед инструкцией имеется S?

  3. Я не могу сделать из нескольких регистров в одной строке инструкции. Пример:

    EORS R3,R5,R10,RRx 
    

    Я не понимаю, что там происходит с таким количеством регистров.

Любое толчок в правильном направлении приветствуется. Также я искал руководство ARM, они не очень помогают кому-то, не понимая, что они ищут. У них есть большинство инструкций для кодирования и декодирования, но у меня мало объяснений для вещей, которые я задал выше.

+0

1) соответствует вводу битовых шаблонов команд, которые вы знаете 2) да 3), которые зависят от инструкции, у вас есть бит, зарезервированный для каждого номера регистра. Я предполагаю, что вам был предоставлен ресурс, в котором перечислены кодировки, используйте его. – Jester

+0

1) Но как я могу различать разные форматы кодировки команд? 2) Итак, если нет S, тогда бит не установлен, и все? 3) Но есть ли там четыре регистра, как я могу отличить, например, регистр назначения? Есть ли информация о том, что эти аргументы? –

+1

руководство по архитектуре google arm. получий, более старый лучше, но все они будут делать, за исключением коры головного мозга, которые вы хотите, чтобы armv5 один или armv7a и r не были armv6m или armv7m. они включают полный набор команд плюс определения машинного кода. –

ответ

1

Если у вас есть руководство по архитектуре ARM v7 A + R (DDI0406C), в главе A5 есть хорошее описание декодирования/разборки на основе таблиц. Вы начинаете с таблицы A5.1, и, в зависимости от значения различных бит в слове команды, это относится ко все более конкретным таблицам, ведущим к инструкции.

В качестве примера, рассмотрим следующую инструкцию:

0001 0101 1001 1111 0000 0000 0000 1000 

В соответствии с первой таблицей это беззнаковое команда загрузки/магазин, так как условие не является 1111, и OP1 является 010. Кодирование этого дополнительно расширен в A5.3

Из этого раздела видно, что A = 0, op1 = 11001, Rn = 1111 (ПК) и B = 0. Это означает, что инструкция LDR (буквальная). Проверяя страницу, описывающую эту инструкцию, и помня, что cond = 0001, мы видим, что команда LDRNE R0, [PC, #4].

Чтобы выполнить обратную процедуру, вы можете найти инструкцию в алфавитном списке инструкций и следовать шаблону.

1

Глядя на другую часть (одного из) архитектурных справочных руководств ARM (а не на cortex-m (armv6m armv7m), вы хотите, чтобы ARMv5 один или ARMv7-AR), чтобы посмотреть на инструкцию большого пальца, но инструкции ARM работают одинаково и являются парами предыдущих.

Он говорит, что инструкция большого пальца руки указана как раздел/глава, а затем коротко в это таблица, которая показывает кодировку набора инструкций большого пальца или вы можете просто ее искать. один, если они называются регистром добавления/вычитания, есть много жестко закодированных и нулей спереди, а бит 9 - это opc, затем rm, rn и rd bits.

рычаги для инструментов легко доступны для окон mac и linux или могут легко строить из источников (просто нужны binutils). монтаж этого

.thumb 
add r1,r2,r3 
add r1,r2,r4 
add r1,r2,r5 
add r1,r2,r6 
add r1,r2,r7 

затем разборку дает

00000000 <.text>: 
    0: 18d1  adds r1, r2, r3 
    2: 1911  adds r1, r2, r4 
    4: 1951  adds r1, r2, r5 
    6: 1991  adds r1, r2, r6 
    8: 19d1  adds r1, r2, r7 

из этого графика в ARM ARM надстройка регистр начинается с закодированных бит 000110 выше инструкции начать с 0x18 или 0x19, которые оба начинают с 6 битами 000110 (00011000 или 00011001). В алфавитном списке инструкций большого пальца мы ищем инструкции добавления. найти три регистра один, и в этом случае он имеет 7 бит, которые совпадают с битами, которые мы декодируем 0001100, поэтому мы находимся на правильном пути.последние 9 бит три набора из трех

0x1951 0001100101010001 или 0001100 101 010 001, последние девять представляют r5, r2 и r1. Глядя на синтаксическую часть инструкции, она показывает add rd, rn, rm, но машинный код имеет rm, rn, rd, поэтому мы берем машинный код и переставляем по синтаксису и получаем add r1, r2, r5. Неплохо это совпадение, теперь, к сожалению, здесь здесь запутано, эта инструкция большого пальца не имеет бита s, там не было комнаты, поэтому она всегда обновляет флаги, поэтому характер этой команды и инструментальной цепочки и то, как я ее использовал, требует добавления без s на конце сборки и разборки с s. путают, извините. при использовании ручных инструкций буква s работает так, как ожидалось.

Просто повторите это с инструкциями ARM в любом направлении. Ближайшие ценности будут самой сложной частью этого. Или не зависит от конкретной инструкции и немедленного кодирования.

 Смежные вопросы

  • Нет связанных вопросов^_^