0
0
0
TriCore EABI 调用约定
Embedded Applications Binary Interface (EABI) 嵌入式应用二进制接口
参数传递
TriCore 使用八个寄存器 D[4]-D[7], A[4]-A[7] 将最多四个非指针参数和最多四个指针参数从调用者传递给被调用的例程。
超出寄存器所能传递的参数则通过栈传递,位于调用者栈框架的底部(低地址端)
这里的扩展数据寄存器表示为:
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 位、结构体大小为 64 位的情况下,value 可通过 E4 传递,即使它的字段全部是指针。
结构体和联合体不能拆分为一部分在寄存器、一部分在栈中。
返回值
int add(int a, int b);
; 对应汇编
add:
add d2, d4, d5
ret
; 调用者
mov d4, 10
mov d5, 20
call add
; D2 中得到返回值