Вопрос
Я работаю над симулятором для набора инструкций msp430.gnu assembler позволит вам кодировать подобные инструкции:
fc0a: 12 10 00 02 rrc &0x0200
fc0e: 22 11 rra #4
fc10: 23 52 add #4,#2
Я предполагаю, что rrc & 0x0200 извлекут данные с адреса 0x0200, выполнят поворот, а затем запишут ответ обратно по адресу 0x0200, правильно?Но что бы сделал rra # 4?Я предполагаю, что источником будет немедленное 4, но есть ли пункт назначения после операции?Add # 4, # 2 собраны в то, что вы ожидали (как 2b10, source = r2, ad = 1b0, dest = r3), дизассемблер binutils, хотя и не знал, что делать с этой инструкцией.
Являются ли эти инструкции действительными?
Решение
Хотя, по-видимому, нет какой-либо окончательной онлайн-ссылки на этот эффект, я склонен согласиться с OP в том, что две показанные инструкции (и несколько других) скорее всего, они недействительны, даже если они соответствуют формату, определенному в технических паспортах.
Другими словами, не все возможные комбинации различных частей, составляющих слово инструкции, являются допустимыми.В частности, многие команды с одним операндом, которые используют режим немедленной адресации, и многие команды с двойным операндом, которые имеют режим немедленной адресации для адресата, вероятно, не являются семантически жизнеспособными.
В документации есть лишь несколько намеков на этот счет, например, в Руководстве пользователя, раздел 3.3.7 (о режиме немедленной адресации), в комментарии указано "Допустимо только для исходного операнда." (И, кстати, это относится ко всем случаям режима немедленной адресации, а не только к случаям кратковременной передачи, разрешенным трюком с постоянной генерацией R2 или R3.)
Тот факт, что дизассемблер не знает, что делать с такими кодами, также является еще одним намеком (хотя...некоторые дизассемблеры легко отключаются ...).
В качестве документации я собрал ниже несколько полезных ссылок на MSP430:
- Руководство пользователя TI MSP430 (pdf) Глава 3 особенно актуальна
- Микроконтроллер TI MSP430 (pdf) Краткий обзор (11 страниц)
- Руководство пользователя MSPGCC GNU-порт инструментов TI для микроконтроллеров MSP430.
Другие советы
В текущем руководстве пользователя в разделе 3.4.4.2 рекомендуется не использовать непосредственный режим (#N) в поле назначения для команды RRA, так как это приводит к "непредсказуемой работе программы". Р>
Возможно, они есть. Глядя на набор команд в Википедии, коды операций кодируют регистр и различные опции. Так что это не простое отображение. Похоже, что у вас есть выход с прямым порядком байтов, так что это:
fc0a: 12 10 00 02 rrc &0x0200
соответствует инструкции 1012, которая в двоичном виде является 0001 0000 0001 0010.
Это разбивается следующим образом:
6 bits: 0001 00 - fixed; defines the instruction family
3 bits: 00 0 - instruction (RRC)
1 bit : 0 - byte or word parameter (0 = 16 bit parameter; 1 = 8 bit)
2 bits: 01 - addressing mode (01 = indexed;)
4 bits: 0010 - register
Таким образом, в этом случае происходит поворот вправо на значение со смещением в регистре 2 от адреса & 0200.
Вам нужно будет разбить другие инструкции аналогичным образом, чтобы полностью понять. Для инструкции ADD регистры / адреса источника и назначения кодируются в 5223 инструкция.