gpt4 book ai didi

assembly - 结构体如何在汇编中作为参数传递

转载 作者:行者123 更新时间:2023-12-04 12:30:50 26 4
gpt4 key购买 nike

结构体如何在汇编中作为参数传递?

由于结构的大小比正常大,因此各个字段是否按顺序传递?

如果是这样,它们与正常参数的顺序相反吗?

cdecl 和 stdcall 之间有什么区别吗?

最佳答案

在汇编中,所有赌注都已关闭,您可以按您喜欢的任何方式传递参数,前提是调用方和被调用方就如何完成达成一致。

将参数放在堆栈上,将指向它们的指针放在堆栈上,将它们放入寄存器,将它们存放在固定的内存位置,这一切都取决于您。我见过一些参数在寄存器中传递,而其他参数在堆栈上传递或通过引用传递的情况。

您如何转移控制权也取决于您。执行“调用”指令,或软件中断。旧的 PDP-10 架构有五种不同的调用子程序的方式,您必须知道使用哪一种。 IBM-360 架构也有多种方式。

(你想看疯了吗?阅读著名的 Interrupt List ,它是所有已知的可用于 286 架构的软件中断调用的集合。实际上,你在 MS-DOS 下安装的每个软件都添加了一些新的软件中断。 ,而且他们每个人都有自己的调用约定,其中许多相互冲突。)

一般来说,最好的方法是找出其他程序员在做什么并做同样的事情。要么,要么很好地记录您的功能,以便用户知道如何调用它。

现在,如果您的程序集要调用或被另一种语言调用,例如 C、C++、Fortran 等,那么您需要研究由语言设计者建立的标准调用约定,这些约定通常也取决于建筑学。例如,对于 32 位 x86 上的 C,参数将在堆栈上传递,而对于 Sparc,最多五个参数将在寄存器中传递,超出的任何参数都将在堆栈中传递。

至于结构,C 标准要求将它们解包,并将单个元素作为单独的参数传递,然后由被调用方将其重新组装成一个结构。如果结构非常大,这可能会非常浪费,所以最好传递一个指向结构的指针。

如果函数返回一个结构,调用者会分配空间来接收它,并将指向该空间的指针作为“ secret ”参数传递给函数。

数组总是作为指针传递。

对于 Fortran,一切都是通过引用传递的,这意味着值可以返回给任何参数。甚至常量也存放在内存中的某处,指向它们的指针会传递给被调用的子程序。 (因此可能会意外更改常量的值。)

关于assembly - 结构体如何在汇编中作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30067264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com