方法调用后返回值是否总是进入eax寄存器?

Bar*_*ski 14 c++ compiler-construction x86 assembly

我编写了一个挂钩库,用于检查PE可执行文件dll导入表,以创建一个可以更改参数和返回值的库.关于如何从函数传递返回值,我有几个问题.

我了解到函数的返回值保存在累加器寄存器中.总是这样吗?如果没有,编译器如何知道在哪里查找函数结果?

返回类型大小怎么样?一个整数很容易适合,但更大的结构怎么样?调用者是否保留堆栈空间,以便它调用的方法可以将结果写入堆栈?

qwm*_*qwm 7

这一切都特定于调用约定.

对于大多数调用约定,浮点数在FPU堆栈或XMM寄存器中返回.

调用返回结构的函数

    some_struct foo(int arg1, int arg2);
    some_struct s = foo(1, 2);
Run Code Online (Sandbox Code Playgroud)

将编译成一些相当于:

    some_struct* foo(some_struct* ret_val, int arg1, int arg2);
    some_struct s; // constructor isn't called
    foo(&s, 1, 2); // constructor will be called in foo
Run Code Online (Sandbox Code Playgroud)

编辑 :(添加信息)

只是为了澄清:这适用于所有结构和类,即使在sizeof(some_struct) <= 4.所以,如果你定义像小有用的ip4_type,唯一的unsigned领域和一些构造函数/转换器到/ TROM unsigned,in_addr,char*它就会缺乏效率比使用原始的unigned价值.

  • 另外:在x86上的edx:eax中返回64位值afaik (2认同)