Bar*_*ski 14 c++ compiler-construction x86 assembly
我编写了一个挂钩库,用于检查PE可执行文件dll导入表,以创建一个可以更改参数和返回值的库.关于如何从函数传递返回值,我有几个问题.
我了解到函数的返回值保存在累加器寄存器中.总是这样吗?如果没有,编译器如何知道在哪里查找函数结果?
返回类型大小怎么样?一个整数很容易适合,但更大的结构怎么样?调用者是否保留堆栈空间,以便它调用的方法可以将结果写入堆栈?
这一切都特定于调用约定.
对于大多数调用约定,浮点数在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
价值.