如何在程序集中存储数组和指针值输入?

How to store array and pointer value inputs in assembly?

如果函数输入数组和其他类型的值,例如

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.

这是真的吗?

主要的 64 位 ABI 是

如果前四 (4) 个参数属于 class INTEGER.
,则两者都使用寄存器 指针和整数类型是这样的 class.
数组衰减为指针1,指针在 ABI 级别作为 64 位整数传递。
所以就像函数接受四个整数一样。

为Windows编程arr[], n, &a, &b传入RCX,RDX,R8 R9.
对于 Linux 编程 arr[], n, &a, &b 传入 RDIRSIRDXRCX.


要访问数组,需要做指针运算。假设RDI持有指向数组的指针(读取指向数组第一个元素的指针):

mov eax, DWORD [rdi]        ;access arr[0]
mov ebx, DWORD [rdi + 04h]  ;access arr[1]

var ab 可以作为普通指针访问(假设 Linux ABI)

mov eax, DWORD [rdx]        ;Read a into eax
mov DWORD [rcx], eax        ;b = a

参数n可以直接从RSI读取。


请注意,您对堆栈仍有一些要求,尤其是在 Windows 上。
您可以阅读相关的 ABI 了解更多信息。


1 C++ 规范中 "decay" 动词的严格使用并不正确。