0
0
0

TriCore EABI 调用约定

2026-10-10
2026-10-12

Embedded Applications Binary Interface (EABI) 嵌入式应用二进制接口

参数传递

TriCore 使用八个寄存器 D[4]-D[7], A[4]-A[7] 将最多四个非指针参数和最多四个指针参数从调用者传递给被调用的例程。

超出寄存器所能传递的参数则通过栈传递,位于调用者栈框架的底部(低地址端)

参数类型

使用位置

主要规则

32 位非指针参数

D4~D7

每个寄存器最多放一个参数

小于 32 位的整数

D4~D7

传入寄存器前扩展为 32 位

64 位非指针参数

E4、E6

必须占用完整的偶数—奇数寄存器对

32 位指针参数

A4~A7

按指针参数出现顺序分配

64 位指针参数

A4/A5、A6/A7

必须占用完整寄存器对

无法放入参数寄存器的参数

栈上的参数溢出区

按参数顺序排列

可变参数部分

栈

固定参数仍按普通规则传递

这里的扩展数据寄存器表示为:

E4 = D4(低 32 位)+ D5(高 32 位)

E6 = D6(低 32 位)+ D7(高 32 位)

示例:

void func(int x, char *p, int y, int *q);
x → D4
p → A4
y → D5
q → A5

非指针参数——32 位、更小的参数、64位

void func(int a, int b, int c, int d, int e);
a → D4
b → D5
c → D6
d → D7
e → 栈
void func(signed char a, unsigned short b);
a → D4,符号扩展至 32 位
b → D5,零扩展至 32 位
void func(int word1, long long double1, int word2);
word1   → D4
double1 → E6,即 D6/D7
word2   → D5

指针参数

void func(int *p, int count, char *buffer);
p      → A4
count  → D4
buffer → A5

栈上的参数溢出区

void func(int a, int b, int c, int d, int e, int f);
D4       → a
D5       → b
D6       → c
D7       → d
[SP + 0] → e
[SP + 4] → f

结构体与联合体参数

大小

传递方式

不超过 32 位

一个数据寄存器;无法分配时整体放到栈上

大于 32 位且不超过 64 位

数据寄存器对;无法分配时整体放到栈上

大于 64 位

通过指针传递

在两个指针均为 32 位、结构体大小为 64 位的情况下,value 可通过 E4 传递,即使它的字段全部是指针。

结构体和联合体不能拆分为一部分在寄存器、一部分在栈中。

返回值

返回值类型

返回位置

32 位非指针标量

D2

小于 32 位的整数标量

扩展至 32 位后放入 D2

64 位非指针标量

E2,即 D2/D3

32 位指针

A2

64 位指针

A2/A3

int add(int a, int b);

; 对应汇编
add:
    add d2, d4, d5
    ret

; 调用者
mov  d4, 10
mov  d5, 20
call add
; D2 中得到返回值

Support

If this article helped you, feel free to share it or give support!