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



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

但我提出的问题是,在不允许推翻论点的情况下,寻求另一种方法来处理这个问题。这让我很困惑。目前,我的方法是将帧指针移动到运行时堆栈的最低点,这样它就可以找到格式字符串,并且实际值的偏移量是正的。

请告知

  1. 格式化字符串不存储偏移量信息,只包含打印内容和方式的信息
  2. 参数传递给函数的方式由ABI定义。每个硬件体系结构和实现都可能使用不同的ABI,从而以不同的方式传递参数。通常一些数字参数一个在寄存器中传递,另一个在堆栈中传递
  3. 如果你想定义你自己的ABI I建议,请阅读之前的做法:https://wiki.osdev.org/Calling_Conventions

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

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

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

最新更新