Синтаксис сборки для Tc2xx Tricore

В настоящее время я работаю с чипом TC275 tricore и изучаю код запуска, взятый из примера на инструментальной цепочке бесплатного ввода трикора Hightec. Меня интересует эффект квадратных скобок в операторах сборки. Как я раньше работал с ядром ARM, когда квадратные скобки окружены регистром, это означает ссылку на значение, которое хранит адрес этого регистра.

Но для Tricore, например, с инструкцией LEA: «lea%a14, [%a14]lo: __ crt0_config». Эта инструкция означает что-то вроде взятия младшего 16-битного значения адреса функции __crt0_config плюс младшего 16-битного значения, доступного в регистре a14, и последующего присвоения его младшим 16 битам в регистре a14.

Я ссылаюсь на документацию в руководстве пользователя бесплатного набора инструментов для ввода трикора Hightec, и там говорится:

Косвенное обращение: если операнд (регистр или константа) используется для косвенного доступа к памяти, вы можете по своему усмотрению заключить его в квадратные скобки (например, '[r4]'). Это полностью соответствует указанной выше спецификации; однако нет параметров, позволяющих указать, является ли использование таких спецификаторов косвенного обращения (читай: квадратные скобки) незаконным, необязательным или обязательным. Это означает, что вы не можете изменить значение по умолчанию, которое является «необязательным». Конечно, если вы используете спецификаторы косвенного обращения в местах, где они не разрешены, вы получите сообщение об ошибке, которое снова соответствует спецификации Assembler Mnemonics Specification.

В дополнение к инструкции lea существуют также инструкции ld.w и st.w, которые также используют квадратные скобки (но команда mov их не использует). Думаю, это связано с режимом адресации.

Пожалуйста, помогите мне разобраться в проблеме.

Спасибо!!!

1 ответ

Меня интересует эффект квадратных скобок в операторах сборки. Как я раньше работал с ядром ARM, когда квадратные скобки окружены регистром, это означает ссылку на значение, которое хранит адрес этого регистра.

То же самое и с TriCore

Однако на языке ассемблера ARM вы должны написать [R4, #1234], на языке ассемблера TriCore вы должны написать [R4]1234.

Итак, на процессоре ARM вы должны написать [R4, #lo:__crt0_config] вместо того [R4]lo:__crt0_config.

Указание использования константы - это функция цепочки инструментов, а не ЦП.

Насколько мне известно, lo:xxx это младшие 10 (а не 16) бит адреса символа ( __crt0_config), Вход расширен (это означает: интерпретированы как подписанное 10-разрядное число).

И: TriCore не имеет регистров общего назначения ( R0- R12), но в нем есть регистры, предназначенные только для данных ( D0- D15) и регистры, предназначенные только для адресов ( A0- A15).

В дополнение к инструкции lea существуют также инструкции ld.w и st.w, которые также используют квадратные скобки (но команда mov их не использует). Думаю, это связано с режимом адресации.

Как и в ассемблере ARM, скобки используются для адресов памяти:

На ассемблере ARM вы пишете LDR R4, [R5] но ты не пишешь MOV R4, [R5].

Инструкция (которая также существует на процессорах x86) представляет собой некий "особый случай":

Он принимает адрес памяти в качестве второго аргумента, и вы можете передать любой допустимый режим адресации памяти:

Если процессор ARM поддерживается, LEA R0, [R1] будет равно MOV R0, R1.

Однако для второго операнда у вас будут те же параметры, что и для LDR инструкция, чтобы вы могли использовать LEA R0, [R1, #4]! или LEA R0, [R1], #4.

В LEAинструкция часто используется для выполнения некоторых «сложных» вычислений. В вашем случае он просто используется неправильно, а не потому, что нет ADD инструкция, которая может добавить 10 битов в адресный регистр.

Ссылаюсь на документацию в руководстве пользователя Hightec ...

Вы также видели официальную спецификацию набора инструкций Infineon ?

Другие вопросы по тегам