如果不允许反向打印,如何解决 printf 的可变参数个数问题

How to resolve variable number of arguments problem of printf if reverse printing is not allowed

我正在学习有关语言设计的课程,这个特定问题与 C 中的 printf 如何处理可变参数数量的问题有关。本质上,我了解到 printf 会将参数从最后一个一直推送到格式字符串,格式字符串存储有关偏移量的信息,以便帧指针找到格式字符串,然后使用从格式字符串派生的偏移量来查找参数'偏移量。

但是我的问题要求在不允许反转参数时使用另一种方法来处理这个问题。这让我很困惑。现在,我的方法是将帧指针移动到运行时堆栈的最低点,以便它找到格式字符串并且实际偏移量为正。

请指教

如果你要为不同的调用约定设计一个新的编译器,你可以让编译器推送完成调用的实际参数的数量,或者在特定的寄存器中设置该数量,例如 RAX/EAX,无论如何都会被覆盖。

另一种选择是重新定义 printf() API 以将格式字符串作为最后一个参数。通过这种方式,您将拥有访问堆栈以查找参数所需的一切。

  1. 格式字符串不存储有关偏移量的信息,仅包含有关打印内容和方式的信息。
  2. 如何将参数传递给函数由 ABI 定义。每个硬件架构和实现都可能使用不同的 ABI——因此以不同的方式传递参数。通常一些数字参数a在寄存器中传递,其他在堆栈中。
  3. 如果您想定义自己的 ABI,我建议您阅读之前的做法:https://wiki.osdev.org/Calling_Conventions

x86-64 上左起第一个参数将保存在 EDI 寄存器中。