在汇编中,所有注单都关闭,并且您可以按自己喜欢的任何方式传递参数,前提是调用者和被调用者同意如何完成操作。
将参数放在堆栈上,将指向它们的指针放在堆栈上,将它们放入寄存器中,然后将其存储在固定的内存位置,这一切都取决于您。我已经看到了一些参数在寄存器中传递而其他参数在堆栈上传递或通过引用传递的情况。
您如何转移控制权也取决于您。执行“调用”指令或软件中断。旧的PDP-10体系结构有五种不同的调用子例程的方式,您必须知道要使用哪种方式。IBM-360体系结构也有多种方法。
(您想疯了吗?请阅读著名的“ 中断列表”,该列表是286体系结构可用的所有已知软件中断调用的集合。实际上,您在MS-DOS下安装的每个软件都为设备添加了一些新的软件中断,他们每个人都有自己的通话惯例,其中许多人彼此冲突。)
通常,最好的方法是找出其他程序员在做什么并且做同样的事情。要么,要么很好地记录您的函数,以便用户知道如何调用它。
现在,如果您的程序集将要调用或被另一种语言(例如C,C ++,Fortran等)调用,则您需要研究由语言设计者建立的标准调用约定,这些约定通常还取决于建筑。例如,对于32位x86上的C,参数将在堆栈上传递,而对于Sparc,最多五个参数将在寄存器中传递,并且超出此范围的所有参数都将传递到堆栈上。
对于结构,C标准要求将它们拆包,并将各个元素作为单独的参数传递,并由被调用方重新组装为结构。如果结构很大,可能会非常浪费,因此最好将指针传递给该结构。
如果函数返回结构,则调用者分配空间以接收该结构,并将指针作为“秘密”参数传递给该空间。
数组始终作为指针传递。
对于Fortran,一切都通过引用传递,这意味着可以将值返回到任何参数。甚至常量也保存在内存中的某个位置,并将指向它们的指针传递给被调用的子例程。(因此可以意外更改常数的值。)