Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何访问为函数调用在堆栈上传递的未知数量的参数?_Assembly_X86 64_Att_Calling Convention - Fatal编程技术网

Assembly 如何访问为函数调用在堆栈上传递的未知数量的参数?

Assembly 如何访问为函数调用在堆栈上传递的未知数量的参数?,assembly,x86-64,att,calling-convention,Assembly,X86 64,Att,Calling Convention,如果我将未知数量的参数传递给函数(有点像printf),我如何知道要获取所有参数需要走多远。起初,我考虑过如何保存%rbp和%rsp之间的差异以获得位移,但这没有帮助,因为根据我所看到的,它们是在运行时随机初始化的 使用调用约定,前6个参数在寄存器中传递,因此我必须在子例程中将它们推送到堆栈上一次。问题是,考虑到返回地址和基指针已被推到堆栈上的参数之间,如何从堆栈中获取剩余的(n-6)参数。函数看起来有点像这样: .data #variables here main: push arg_n

如果我将未知数量的参数传递给函数(有点像printf),我如何知道要获取所有参数需要走多远。起初,我考虑过如何保存%rbp和%rsp之间的差异以获得位移,但这没有帮助,因为根据我所看到的,它们是在运行时随机初始化的

使用调用约定,前6个参数在寄存器中传递,因此我必须在子例程中将它们推送到堆栈上一次。问题是,考虑到返回地址和基指针已被推到堆栈上的参数之间,如何从堆栈中获取剩余的(n-6)参数。函数看起来有点像这样:

.data
#variables here

main:

push arg_n
push arg_n-1
...
movq $arg_2, %rsi
movq $arg_1, %rdi
call ft_function

ft_function:

push %rbp
movq %rsp, %rbp

push %rdi
push %rsi
...
#Function code here
...
movq %rbp, %rsp
pop %rbp
ret

要访问参数,您需要知道参数的数量和类型<例如,您肯定知道,code>printf使用格式字符串引用其余变量参数。调用约定中没有任何内容可以告诉您这一点(除了
al
包含所用xmm寄存器的上限)。传递指示其余参数的数量和类型的参数(如printf)的替代方法是将标记作为最后一个参数。一个常见的例子是execl,它有一个任意长的参数列表,所有参数都是char*类型。列表以char*类型的空指针终止。是否有办法在堆栈上交换参数,以获得所有参数,然后保存%rbp和返回地址。而不是
arg8 arg7 ret%rbp arg6
来具有类似
ret%rbp arg8 arg7 arg6的内容