gpt4 book ai didi

c - 为什么在 IA32 堆栈过程中向后传递参数?

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:01 25 4
gpt4 key购买 nike

如果我有一个函数 foo(arg1, arg2)。在IA32栈中,arg2先入栈再入栈arg1,这样被调用函数通过%ebp+8访问arg1,通过%ebp+12访问arg2,但是为什么要往后推呢? (我们的处理器提到了一些关于 printf 和 count 的东西,但我不是很明白)。同样通常,调用函数从不传递参数计数(有多少个参数),那么被调用函数怎么知道呢?非常感谢!

最佳答案

在汇编级别,以书面或相反顺序在堆栈上传递参数并不重要,但选择的方法必须与被调用函数使用的方法相同。 C 通常以相反的顺序推送值,因为它需要支持 varargs - 可变数量的参数。如果按写入的顺序推送参数,则很难获得第一个。

现代语言,如 Java 或 C#(通常还有 .NET)可以正常推送值,因为它们将附加参数作为数组处理(因此只有一个参数传递给被调用的函数——指向数组的指针)。

C 示例:

.data
format: db "Your lucky number is %d", 0
....

;code is equivalent to printf("Your lucky number is %d", 10);
push dword 10
push format
call printf

Java 示例:

 0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Your lucky number is %d
5: iconst_1
6: anewarray #4 // class java/lang/Object
9: dup
10: iconst_0
11: bipush 10
13: invokestatic #5 // Method java/lang/Integer.valueOf(I)Ljavava/lang/Integer;
16: aastore
17: invokevirtual #6 // Method java/io/PrintStream.printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;
20: pop

关于c - 为什么在 IA32 堆栈过程中向后传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18492397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com