Tc2xx Tricore 的汇编语法

Assembly syntax for Tc2xx Tricore

我目前正在使用 TC275 三核芯片,并且正在研究从 Hightec 免费三核入门工具链上的示例中获取的启动代码。我想知道方括号在汇编语句中的作用。正如我之前使用 ARM 内核时,当方括号被寄存器包围时,它表示对该寄存器地址存储的值的引用。

但对于 Tricore,例如使用 LEA 指令:“lea %a14, [%a14]lo:__crt0_config”。该指令的意思类似于将__crt0_config函数地址的低16位值加上寄存器a14中可用的低16位值,然后将其分配给寄存器a14中的低16位。

我参考了 Hightec 免费三核入门工具链的用户指南中的文档,它说:

间接:如果操作数(寄存器或常量)用于间接访问内存,您可以选择将其括在方括号中(例如 [r4])。这完全符合上述规范;但是,没有任何选项可以让您指定使用此类间接说明符(阅读:方括号)是非法的、可选的还是强制性的。这意味着您无法更改默认值,即“可选”。当然,如果您在不允许的地方使用间接说明符,您会收到一条错误消息,这再次符合汇编程序助记符规范。

除了lea指令外,还有ld.wst.w指令也使用方括号(但mov指令没有)。我认为这与寻址方式有关。

请帮助我理解问题。

谢谢!!!

I'm wondering about the effect of square brackets in assembly statements. As I worked with ARM core before, when square brackets are surrounded by a register, it means a reference to the value that the address of that register is storing.

TriCore 也一样

但是,在 ARM 汇编语言中你会写 [R4, #1234],在 TriCore 汇编语言中你会写 [R4]1234

所以在 ARM CPU 上,你会写 [R4, #lo:__crt0_config] 而不是 [R4]lo:__crt0_config

使用 lo:xxx 指定常量是工具链的一个功能,而不是 CPU。

据我所知,lo:xxx是符号(__crt0_config)地址的低10(不是16)位,符号扩展(这意味着:解释为有符号 10 位数).

并且:TriCore 没有通用寄存器 (R0-R12),但它有仅用于数据的寄存器 (D0-D15)和寄存器仅用于地址 (A0-A15).

In addition to the lea instruction, there are also ld.w and st.w instruction that also use square brackets (but the mov command does not). I think this is related to addressing mode.

就像在 ARM 汇编程序中一样,括号用于内存地址:

在 ARM 汇编程序中,你写 LDR R4, [R5] 但你不写 MOV R4, [R5]

LEA 指令(在 x86 CPUs 上也存在)是一些“特例”:

它将内存地址作为第二个参数,您可以传递任何有效的内存寻址模式:

如果 ARM CPU 支持 LEALEA R0, [R1] 将等于 MOV R0, R1

但是,对于第二个操作数,您将拥有与 LDR 指令相同的选项,因此您可以使用 LEA R0, [R1, #4]!LEA R0, [R1], #4.

LEA指令经常被用来做一些“复杂”的计算。在您的情况下,它只是被误用而不是 ADD 因为没有 ADD 指令可以将 10 位添加到地址寄存器。

I refer to the documentation in the userguide of Hightec ...

您是否也看过 Infineon's official instruction set specification