Вопрос

Я работаю над симулятором для набора инструкций 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:

Другие советы

В текущем руководстве пользователя в разделе 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 инструкция.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top