2011-10-09 104 views
1

我正在開發玩具編程語言。我使用LLVM生成機器碼。現在我的問題是:如何從頭開始實現printf()函數?。在C程序中你可以調用libc就是這樣。但是printf()的東西在內部是​​如何工作的呢?執行printf()函數

乾杯

+0

http://www.opensource.apple.com/source/Libc/Libc-186/stdio.subproj/vfprintf.c –

+0

或者這個:http://www.ijs.si/software/snprintf/ – Flexo

+0

可能的[C代碼爲printf函數](http://stackoverflow.com/questions/4867229/code-for-printf-function-in-c) – roottraveller

回答

2

有兩個部分的printf()實現。

首先,你有一些特定的調用約定的機制,使可變參數成爲可能。

其次,雖然你寫了一個循環,通過給函數的格式說明符來查看。簡單地說,它採用兩種操作之一,要麼將字符串複製到標準輸出(通過適用於您的平臺的系統調用),要麼將傳遞給該函數的可變參數之一顯示出來(並再次使用系統調用輸出)爲指定的格式。

例如,如果你看到一個%s那麼你需要檢索下一個未消費的說法,其解釋爲char *指針,然後確保內存它指向被複制到標準輸出,直到你擊中'\0'

+0

所以你需要一個系統調用將東西移到標準輸出。有可能在類似UNIX的操作系統中,stdout可以通過文件描述符寫入嗎? – Fabian

+0

@Fabian是的,你可以通過文件描述符來寫,但是這是一個系統調用。通常我會爲此使用一個C支持庫,而不管它實現的語言如何。你可以把它作爲ASM吐出 - 在Linux x86的頭頂,你把EAX中的4(sys_write),EBX中的文件描述符(1作爲標準輸出),ECX中的數據指針和EDX中的長度,然後使用'int 80h'來撥打電話。儘管如此,與運行時支持庫進行鏈接的可能性更高。 – Flexo