如何在程序集中存储数组和指针值输入?
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
传入 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
参数n
可以直接从RSI读取。
请注意,您对堆栈仍有一些要求,尤其是在 Windows 上。
您可以阅读相关的 ABI 了解更多信息。
1 C++ 规范中 "decay" 动词的严格使用并不正确。
如果函数输入数组和其他类型的值,例如
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
传入 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
参数n
可以直接从RSI读取。
请注意,您对堆栈仍有一些要求,尤其是在 Windows 上。
您可以阅读相关的 ABI 了解更多信息。
1 C++ 规范中 "decay" 动词的严格使用并不正确。