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

时间:2013-08-28 15:39:06

标签: c x86 stack

如果我有一个函数foo(arg1,arg2)。在IA32堆栈中,首先推送arg2然后推送arg1,以便被调用者函数通过%ebp + 8访问arg1并通过%ebp + 12访问arg2,但是向后推的原因是什么? (我们的处理器提到了一些关于printf和count的内容,但我真的不明白)。同样一般来说,调用函数永远不会传递参数的数量(有多少个参数),那么被调用函数怎么知道呢? 非常感谢!

1 个答案:

答案 0 :(得分:1)

在汇编级别,如果以书面或逆序传递堆栈上的参数并不重要,但所选方法必须与被调用函数使用的方法相同。 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