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