Assembly 什么是参数推送顺序

Assembly 什么是参数推送顺序,assembly,push,arguments,Assembly,Push,Arguments,我在学习汇编语言。什么是参数推送顺序?我理解它是如何将参数推到堆栈中的,但左、右部分是什么意思?什么的左边还是右边? 或者这仅仅与命令的语义编写方式有关,即: mov-ebp,esp;esp从右向左移动到ebp 这是正确的还是有人能给我一些启发 非常感谢 处理器不知道“函数参数”。因此,当您想要编写f(a,b,c)时,您确实需要将参数推到“某处” 这是惯例。我知道,在大多数x86机器上,函数参数是从右向左推送到堆栈上的,即先是c,然后是b,然后是a push c push b push a ca

我在学习汇编语言。什么是参数推送顺序?我理解它是如何将参数推到堆栈中的,但左、右部分是什么意思?什么的左边还是右边? 或者这仅仅与命令的语义编写方式有关,即:

mov-ebp,esp;esp从右向左移动到ebp

这是正确的还是有人能给我一些启发


非常感谢

处理器不知道“函数参数”。因此,当您想要编写
f(a,b,c)
时,您确实需要将参数推到“某处”

这是惯例。我知道,在大多数x86机器上,函数参数是从右向左推送到堆栈上的,即先是c,然后是b,然后是a

push c
push b
push a
call f
现在被调用的函数可以对a使用
ebx-1
,对b使用
ebx-2
,对c使用
ebx-3

您还可以建立一个约定,即:前两个参数位于寄存器
ebx
ecx
中,其余参数位于堆栈上。只要打电话的人和被叫人同意,你就没事。

除了对方的解释,你可能还想看看这张表格。您会注意到,关于参数顺序,除了Pascal之外,几乎所有的参数都是从右向左推的(最右边的参数是先推的)

xtofl没有涵盖的另一个场景是寄存器参数——一些ABI要求某些参数位于寄存器中,而不是堆栈上。例如,在
x86_64
系统上,函数:

int add3(int a, int b, int c)
将提出以下论点:

a -> rdi
b -> rsi
c -> rdx
具体来说,这看起来像(英特尔语法):

因此寄存器从寄存器列表的左至右填充,然后堆栈从右至左使用

正如xtofl所说,只要调用者和被调用者同意,你做什么并不重要——但是,很明显,如果调用者和被调用者不同意,这将导致不兼容问题,这实际上不仅是汇编语言的问题,更是高级语言的问题——幸运的是,编译器基本上是从右向左运行的。为了进一步阅读,您可能会发现堆栈的被调用者/调用者清理很有趣,请注意它是如何标准化为
x86\u 64
的一种方法的


您不会说您正在使用
x86
——您的体系结构肯定会有一个标准的调用约定,因为没有它很难工作。

非常感谢你们两位。这是非常有帮助的,我现在更明白了!非常感谢!!
mov     rdi, [source-of-a]
mov     rsi, [source-of-b]
mov     rdx, [source-of-c]
call    add3