19得票1回答
AMD64 PSABI在哪里?

AMD64 psABI曾经托管在x86-64.org上。 我有一份pdf文件,上面明确写着: 架构规范可在网上获取,网址为http://www.x86-64.org/documentation。 但是http://www.x86-64.org已经长时间无法访问了,至少已经几个月了...

19得票2回答
C语言:通过栈/寄存器返回值问题

我刚学习C语言,有一件事情我不太明白。当一个函数返回的结果尺寸不超过寄存器大小时,我的编译器会将其放在EAX中返回。但是当我返回一个大型结构体(不是指针而是结构体本身)时,它会通过堆栈返回。 我的问题是:编译器如何知道如何调用另一个对象导出的函数呢?虽然有一些调用约定(例如stdcall),...

17得票2回答
C++ lambda函数的默认调用惯例是什么?

以下代码是使用VC++ 2012编译的:void f1(void (__stdcall *)()) {} void f2(void (__cdecl *)()) {} void __cdecl h1() {} void __stdcall h2() {} int main() { ...

17得票1回答
为什么我不能为构造函数指定调用约定(C ++)?

在Visual Studio 2013中,存在一种新的调用约定_vectorcall。它旨在与可以传递到SSE寄存器中的SSE数据类型一起使用。您可以像这样指定成员函数的调用约定。struct Vector{//a 16 byte aligned type _m128i _vectorcall...

17得票2回答
为什么不将函数参数存储在XMM向量寄存器中?

我目前正在阅读一本名为“计算机系统-程序员的视角”的书。我发现,在x86-64架构上,我们只能使用6个整数参数通过寄存器传递给函数。下一个参数将通过堆栈传递。 此外,前8个FP或向量参数是通过xmm0..7传递的。 为什么不使用浮点寄存器以存储下一个参数,即使参数不是单精度/双精度变量? ...

17得票2回答
C++在x86-64平台上:什么时候会使用寄存器传递和返回结构体/类?

在Linux上假设使用x86-64 ABI,C ++中的struct何时通过寄存器传递给函数而不是放置在栈上?它们何时通过寄存器返回?这个答案对类是否有所改变呢? 如果简化回答有助于理解,可以假设只有一个参数/返回值并且没有浮点值。

16得票3回答
如何在汇编x86函数调用中传递参数?

看看这段汇编代码。它是为32位x86设计的,并将由nasm编译。 ... my_function: pop %eax ... ret main: push 0x08 call my_function...

16得票4回答
什么是safecall?

我正在使用VB6创建ActiveX EXE,但是我所得到的唯一示例都是用Delphi编写的。阅读示例代码时,我注意到有一些函数在其签名后面跟着safecall关键字。以下是一个示例:function AddSymbol(ASymbol: OleVariant): WordBool; safec...

15得票1回答
逐个传递参数,或者将它们包装在数组、结构体或元组中传递。

当向函数传递参数时,我一直认为一个一个地传递参数和将它们包装在数组、结构体或元组中传递没有区别。然而,一个简单的实验表明我错了。 以下程序 使用GCC编译 时: int test(int a, int b, int c, int d) { return a + b + c + d;...

15得票6回答
为什么在C++中会通过值传递对象?

可能是重复问题: 在C++中,按值传递还是按常量引用传递更好? 我了解在C ++中通过值、指针和引用传递的差别,并且我认为在C ++中将对象按值传递(而不是按const引用)几乎总是一种编程错误。void foo(Obj o); ... // Bad void foo(co...