1

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

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

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

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

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

请帮我理解问题。

谢谢!!!

4

1 回答 1

2

我想知道方括号在汇编语句中的作用。就像我之前使用 ARM 内核一样,当方括号被寄存器包围时,它表示对该寄存器地址存储的值的引用。

TriCore 也是如此

但是,您将使用 ARM 汇编语言编写[R4, #1234],使用 TriCore 汇编语言编写[R4]1234

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

指定常量 usinglo:xxx是工具链的功能,而不是 CPU 的功能。

据我所知,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].

LEA指令(也存在于 x86 CPU 上)是一些“特殊情况”:

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

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

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

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

我参考了 Hightec 用户指南中的文档...

您是否也看过英飞凌的官方指令集规范

于 2021-10-31T20:32:21.863 回答