簡體   English   中英

如果不允許反向打印,如何解決 printf 的 arguments 的可變編號問題

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

我正在學習關於語言設計的課程,這個特殊問題與 C 中的 printf 如何處理 arguments 的可變數量問題有關。 從本質上講,我了解到 printf 會將 arguments 從最后一個一直推到存儲有關偏移量信息的格式字符串,以便幀指針找到格式字符串,然后使用從格式字符串派生的偏移量來查找參數偏移量。

但是當 arguments 的反轉是不允許的時,我提出的問題要求另一種方法來處理這個問題。 這讓我很困惑。 目前,我的方法是將幀指針移動到運行時堆棧的最低點,以便它找到格式字符串並且與實際值的偏移量為正。

請指教

  1. 格式字符串不存儲有關偏移量的信息,僅包含有關打印內容和方式的信息。
  2. 參數如何傳遞到 function 由 ABI 定義。 每個硬件架構和實現都可能使用不同的 ABI - 因此以不同的方式傳遞參數。 通常一些數字參數在寄存器中傳遞,其他在堆棧中。
  3. 如果您想定義自己的 ABI,我建議您閱讀之前的做法: https://wiki.osdev.org/Calling_Conventions

x86-64 上的左起第一個參數將保存在 EDI 寄存器中。

如果您要為不同的調用約定設計一個新的編譯器,您可以讓編譯器推送完成調用的實際 arguments 的編號,或者將該編號設置在特定寄存器(如 RAX/EAX)中,該寄存器將被覆蓋反正。

另一種選擇是重新定義printf() API 以將格式字符串作為最后一個參數。 通過這種方式,您將擁有訪問堆棧以查找參數所需的一切。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM