Синтаксис сборки для 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 ?