Assembly 如何';s在程序集级别实现的返回值?

Assembly 如何';s在程序集级别实现的返回值?,assembly,return-value,Assembly,Return Value,0如何作为程序集级别的返回值传递?此作业是否有专用的CPU寄存器 更新 以下是关于pdf中传递/返回数据的两个表,但似乎没有关于如何确定API的调用约定以及用于存储返回地址的寄存器的确切信息: 这取决于体系结构。仅举几个例子,在x86上,EAX寄存器通常用于返回值。在x86-64上,它是RAX。在SPARC上,它通常显示在%o0中 这是问题的一部分 现在,返回值和函数参数通常在寄存器中传递,因为这是最有效的选项。只有当这对于可用寄存器来说太大时,堆栈才会被使用。因此,始终有一个指定的专用寄存器

0如何作为程序集级别的返回值传递?此作业是否有专用的CPU寄存器

更新

以下是关于pdf中传递/返回数据的两个表,但似乎没有关于如何确定API的调用约定以及用于存储返回地址的寄存器的确切信息:


这取决于体系结构。仅举几个例子,在x86上,EAX寄存器通常用于返回值。在x86-64上,它是RAX。在SPARC上,它通常显示在%o0中

这是问题的一部分


现在,返回值和函数参数通常在寄存器中传递,因为这是最有效的选项。只有当这对于可用寄存器来说太大时,堆栈才会被使用。

因此,始终有一个指定的专用寄存器用于此,对吗?专用寄存器的确切含义是什么?不,EAX(例如)并不是专门为此目的而保留的。是的,当您需要返回一个值时,大多数编译器都希望它在EAX中。在手写汇编中,您更可能看到其他寄存器使用得更频繁(例如,字符串的ESI或EDI)。回到16位时代,16位返回通常在AX中,32位返回在DX:AX中。如果寄存器不固定,不同的API如何通信?@Alan:只有在同意ABI的情况下,他们才能通信。它不是通用的这一事实是(部分)为什么你不能总是从不同的编译器、供应商等处编写代码。@Alan:Agner Fog已经收集了大量关于ABI、名称篡改方案等的文档,可在以下网址获得:这取决于很多因素,包括:哪个编译器、哪个CPU、哪个操作系统、哪个调用约定,在x86上,syscall/API的返回值通常是
eax
register您能提供一个
ABI
的示例,让我了解一下它在地球上的情况吗?
int main(void){

printf("Hello World");

return 0;

}