X86 返回值可以';不符合EAX寄存器,然后会发生什么

X86 返回值可以';不符合EAX寄存器,然后会发生什么,x86,calling-convention,X86,Calling Convention,让我们假设返回值不能放入EAX寄存器,那么编译器将如何修复它 我想到的一件事是将该值存储到内存中,并将该内存的地址放入EAX,但这没关系,也会起作用,但这里的问题是如何向接收该值的人(存储在EAX中)指示这不是一个值,而是内存中指向实际值的指针。这完全由调用约定定义。调用约定将告诉您如何处理不适合返回寄存器大小的返回值。所以问题是我们在谈论哪一种呼叫约定?我假设32位?窗户?Linux/MacOS/BSD?编译器将根据调用约定要求生成代码来处理返回值。在许多32位约定中,当处理无法放入32位寄存

让我们假设返回值不能放入
EAX
寄存器,那么编译器将如何修复它


我想到的一件事是将该值存储到内存中,并将该内存的地址放入
EAX
,但这没关系,也会起作用,但这里的问题是如何向接收该值的人(存储在EAX中)指示这不是一个值,而是内存中指向实际值的指针。

这完全由调用约定定义。调用约定将告诉您如何处理不适合返回寄存器大小的返回值。所以问题是我们在谈论哪一种呼叫约定?我假设32位?窗户?Linux/MacOS/BSD?编译器将根据调用约定要求生成代码来处理返回值。在许多32位约定中,当处理无法放入32位寄存器的类型的大小时,调用方需要传递地址以保存返回值作为参数之一。假设我对cdecl和stdcall感兴趣,FastCall问题是cdecl在不同的平台上可能不同。Windows上的cdecl与Linux上的cdecl不同。所以我们需要知道哪种呼叫约定。因此,我的下一个问题是-您在为
cdelc
寻找什么平台。窗户?Linux?还有别的吗?这是32位还是64位代码(CDECL在32位和64位之间也不同)哦,我不知道这听起来像是以后要注意的有趣的东西,但现在,我会坚持使用windows来处理x64和x32,如果你能给我指出一些关于Linux的文章,那将是Greatgner fog的一篇文档,它试图详细介绍大多数著名的调用约定,包括它们的返回值规则。可在此处找到:。32位Microsoft约定的一些基本内容可以在这里找到:(注意,对于Win 32 CDECL调用约定,8字节值在EDX:EAX中返回。任何较大的值都会在地址中返回(到调用者分配的内存中)调用方将其作为隐藏参数推送到堆栈上。这完全由调用约定定义。调用约定将告诉您如何处理不符合返回寄存器大小的返回值。因此,问题是我们谈论的是哪种调用约定?我假设是32位?Windows?Linux/MacOS/BSD?编译器将生成代码,以根据调用约定要求处理返回值。在许多32位约定中,当处理无法放入32位寄存器的类型大小时,调用方需要传递地址以将返回值作为参数之一。假设我对cdecl和stdcall感兴趣,fastcallThe问题是cdecl在不同的平台上可能不同。Windows上的cdecl与Linux上的cdecl不一样。所以我们需要知道哪种调用约定。所以我的下一个问题是-您在寻找哪个平台的
cdelc
。Windows?Linux?其他什么?这是32位还是64位代码(cdecl在32位和64位之间也不同)哦,我不知道这听起来像是以后要注意的有趣的东西,但现在,我会坚持使用windows的x64和x32,如果你能给我指一些关于Linux的文章,那将是Greatgner fog有一个文档,试图详细介绍大多数著名的调用约定,包括它们的返回值规则。可以找到此处:。可以在此处找到32位Microsoft约定的一些基本内容:(注意,对于Win 32 CDECL调用约定,在EDX:EAX中返回8字节的值。任何较大的值都会在调用方作为隐藏参数推送到堆栈上的地址(到调用方分配的内存)中返回。