【问题标题】:Assembly syntax for Tc2xx TricoreTc2xx Tricore 的汇编语法
【发布时间】:2021-12-15 12:35:33
【问题描述】:

我目前正在使用 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 命令没有)。我认为这与寻址模式有关。

请帮我理解问题。

谢谢!!!

【问题讨论】:

    标签: assembly gnu infineon tricore


    【解决方案1】:

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

    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 位),符号扩展(这意味着:解释为 signed 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]!LEA R0, [R1], #4

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

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

    你也看过Infineon's official instruction set specification吗?

    【讨论】:

    • 是的,因为 LEA 是一个特殊指令,它让我感到困惑。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2014-06-19
    • 2016-02-29
    • 1970-01-01
    • 2020-09-07
    • 2021-11-25
    相关资源
    最近更新 更多