将参数传递给函数-推入或寄存器

问题描述

我想编写一个函数,执行以下操作:

def addme(x,y):
    return x + y

我知道已经有关于此的指令,但是我正在练习如何在函数中传递args。传递args的正确方法是什么?我看过类似的东西:

# addme(5,2)
push $2
push $5
call addme
add $16,%rsp

这是传递args的正确方法,方法是将它们以相反的顺序推入stack,然后在执行函数调用后重设堆栈指针?我也听说参数是在%rdi,%rsi,...中传递的。一种是正确的,另一种是不正确的,或者正确的方法是什么?

解决方法

这是传递args的正确方法吗...

这取决于通话惯例

对于64位x86 Windows程序,参数在寄存器rcxrdxr8r9中传递。

对于64位x86 Linux程序,使用寄存器rdirsircxrdxr8r9

但是,特别是在16位DOS和Windows中以及在32位Windows中,通常会混淆不同的调用约定。

在64位Windows或Linux上仍然可以这样做:

如果您编写自己的编译器或完全用汇编语言编写程序,则可以决定对某些函数使用不同的调用约定-例如,如果函数名开头为,则在堆栈上传递所有参数而不是寄存器onstk_

如果我正确理解了您的示例,则您不会使用C或C ++,而是会使用Python之类的语言。

我知道某些编程语言(例如Java或Matlab;我不了解Python)在调用“本机”(编译或汇编)代码时使用完全不同的调用约定。所以也许您必须以完全不同的方式传递参数。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...