1

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

4

1 回答 1

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
于 2013-08-28T15:48:06.787 回答