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

时间:2016-11-09 13:00:18

标签: assembly x86-64

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

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.

是真的吗?

1 个答案:

答案 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 ab可以作为普通指针访问(假设Linux ABI)

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

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

请注意,您仍然需要堆栈,特别是在Windows上 您可以阅读相关的ABI以获取更多信息。

1 并非严格正确使用"衰变"在C ++规范中找到的动词。