assembly - eax 如何存储大于 4 个字节的返回值?

标签 assembly return-value cpu-registers

32位平台用EAX来存储函数的返回值,我只是想知道一个函数的返回值的大小是否大于4个字节,eax是如何处理的?在这种情况下,操作系统可以将返回值保存在堆栈中并将堆栈地址存储在 EAX 中,但是操作系统如何判断存储在 EAX 中的值是返回值的地址还是实际上是返回值本身?

最佳答案

调用者和被调用者必须就寄存器和堆栈包含的内容达成一致。这称为 calling convention ,这是一个名为 application binary interface (ABI) 的更大概念的一部分。 .被调用者定义了它希望如何被调用(即参数是否需要在堆栈上、寄存器中等),编译器确保它生成的代码符合调用约定。

至于你的具体问题,这取决于 ABI。有时如果返回值大于4个字节但不大于8个字节,可以拆分为EAX和EDX。但大多数情况下,调用函数只会分配一些内存(通常在堆栈上)并将指向该区域的指针传递给被调用函数。

另请注意,操作系统的作用并不像您想象的那么重要。具有不同调用约定的二进制文件可能共存于同一个系统中,并且二进制文件甚至可以在内部使用不同的调用约定。操作系统的 ABI 仅在二进制文件调用其系统库时才重要。

关于assembly - eax 如何存储大于 4 个字节的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9784820/

相关文章:

algorithm - 如何比较同一算法的两个实现? (通过检查他们的汇编代码)

assembly - assembly 新手。如何计算传递的参数中的字符数?

c++ - 从方法堆栈编译中按值返回实例

java - 当方法包含多个具有多个返回值的 if 语句时,如何从方法中获取返回值?

c - 寄存器数据类型变量是否有限?

assembly - 处理控制传输时的堆栈字节分配

macos - 为什么 Apple 使用 R8l 作为字节寄存器而不是 R8b?

assembly - 在 TASM x86 程序集中读取字符串

linux - 程序集 - 从 c 调用的 mmap2

python - 如何确定函数调用实际使用哪些返回值?