【问题标题】:Assembly Parameter Passing in Reverse Order?汇编参数以相反的顺序传递?
【发布时间】:2021-08-15 07:32:36
【问题描述】:

我从一本在线书籍中找到以下内容:

如果过程的参数超过 6 个,则将它们推送到 以相反的顺序堆叠(最后一个参数在前)。推入参数 反向顺序(如 32 位)允许具有可变数量的函数 参数(可变参数)

我没听懂最后一句话,以相反的顺序推送参数可以让我们先读取参数1,然后读取参数2,等等……但这真的有什么帮助?

如果 parameter1 包含我能理解的参数总数,但事实并非如此,因为像 printf 这样的函数可以在不提供我们传递的参数数量的情况下接受许多参数。

【问题讨论】:

    标签: function assembly parameter-passing x86-64 calling-convention


    【解决方案1】:

    先推最右边的意思是最左边的(非寄存器 args)在返回地址的正上方,即在一个已知位置,后面的 args 在上面。在堆栈中,您最后推送的内容是最接近 / 在顶部的。

    printf 这样的函数需要按顺序传递参数,而调用者可能传递了太多个参数;格式字符串未引用的那些需要静默忽略。如果最低地址 arg(返回地址正上方)是最右边的,这将是不可能的,除非调用约定还在某处传递了一个计数或指向最左边的堆栈 arg 的指针。

    此外,当您以从左到右的顺序解析格式字符串时,您一次只能找到一个宽度。像long double__m128__int128 或大型结构这样的宽参数可以占用多个堆栈槽。

    【讨论】:

    • 对不起,我不明白。 printf 如何知道我们传递给它的参数多少?它如何知道何时停止?
    • @john:它知道有多少参数被传递给它,只知道格式字符串引用了多少个参数。这是能够使用参数不能按从左到右顺序遍历的调用约定来调用它的关键问题。
    猜你喜欢
    • 2013-09-12
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2012-02-05
    • 2016-10-01
    相关资源
    最近更新 更多