如果函数输入了数组和其他类型的值,例如
f(arr[],n,&a,&b)
然后,我该如何存储输入?
如果我存储它们
pushq %rbp
movq %rsp, %rbp
pushq %rbp
然后,输入的地址是什么?
我认为
16(rbp)=n
24(rbp)=&a
32(rbp)=&b
40(rbp)... 40(rbp,n,8)=arr.
是真的吗?
答案 0 :(得分:3)
主要的64位ABI是
如果它们属于 INTEGER 类,则它们都使用前四(4)个参数的寄存器。
指针和整体类型属于这类
数组衰减为指针 1 ,指针在ABI级别作为64位整数传递。
因此该函数需要四个整数。
对于Windows编程,{em> RCX , RDX , R8 和 R9 传递arr[], n, &a, &b
。
对于Linux编程arr[], n, &a, &b
在 RDI , RSI , RDX 和 RCX 中传递。
要访问数组,需要进行指针运算。假设 RDI 保存指向数组的指针(读取指向数组第一个元素的指针):
mov eax, DWORD [rdi] ;access arr[0]
mov ebx, DWORD [rdi + 04h] ;access arr[1]
var a
和b
可以作为普通指针访问(假设Linux ABI)
mov eax, DWORD [rdx] ;Read a into eax
mov DWORD [rcx], eax ;b = a
可以直接从 RSI 中读取参数n
。
请注意,您仍然需要堆栈,特别是在Windows上 您可以阅读相关的ABI以获取更多信息。
1 并非严格正确使用"衰变"在C ++规范中找到的动词。