问题描述
我想编写一个函数,执行以下操作:
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程序,参数在寄存器rcx
,rdx
,r8
和r9
中传递。
对于64位x86 Linux程序,使用寄存器rdi
,rsi
,rcx
,rdx
,r8
和r9
但是,特别是在16位DOS和Windows中以及在32位Windows中,通常会混淆不同的调用约定。
在64位Windows或Linux上仍然可以这样做:
如果您编写自己的编译器或完全用汇编语言编写程序,则可以决定对某些函数使用不同的调用约定-例如,如果函数名开头为,则在堆栈上传递所有参数而不是寄存器onstk_
。
如果我正确理解了您的示例,则您不会使用C或C ++,而是会使用Python之类的语言。
我知道某些编程语言(例如Java或Matlab;我不了解Python)在调用“本机”(编译或汇编)代码时使用完全不同的调用约定。所以也许您必须以完全不同的方式传递参数。