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.w
和st.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 支持 LEA
,LEA 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 ...
我目前正在使用 TC275 三核芯片,并且正在研究从 Hightec 免费三核入门工具链上的示例中获取的启动代码。我想知道方括号在汇编语句中的作用。正如我之前使用 ARM 内核时,当方括号被寄存器包围时,它表示对该寄存器地址存储的值的引用。
但对于 Tricore,例如使用 LEA 指令:“lea %a14, [%a14]lo:__crt0_config
”。该指令的意思类似于将__crt0_config
函数地址的低16位值加上寄存器a14中可用的低16位值,然后将其分配给寄存器a14中的低16位。
我参考了 Hightec 免费三核入门工具链的用户指南中的文档,它说:
间接:如果操作数(寄存器或常量)用于间接访问内存,您可以选择将其括在方括号中(例如 [r4]
)。这完全符合上述规范;但是,没有任何选项可以让您指定使用此类间接说明符(阅读:方括号)是非法的、可选的还是强制性的。这意味着您无法更改默认值,即“可选”。当然,如果您在不允许的地方使用间接说明符,您会收到一条错误消息,这再次符合汇编程序助记符规范。
除了lea指令外,还有ld.w
和st.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 支持 LEA
,LEA 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 ...