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