2016-11-15 48 views
-3

我已經寫了一些高級的解釋器和一個簡單的字節碼編譯器和解釋器,我想開始爲我的小操作系統製作一個強大的中間語言。如何在組裝級別調用Windows API?

它有自己的API,就像windows一樣,唯一阻止我啓動這個項目的東西是知道這些特定的API調用(例如win32表單API)是如何在程序集級別上進行的。

有沒有辦法看到未優化的c代碼的程序集輸出,例如看看調用的方式有多棒?或WWW上的任何來源?

在此先感謝

+0

帶調試器並去:) – RbMm

+2

Win32 API只不過是一組DLL函數和COM接口。諸如.NET Forms之類的API是建立在該基礎之上的。你知道如何在程序集中定期調用函數嗎?你知道調用堆棧是如何工作的嗎? DLL函數調用和接口方法調用就像常規函數調用一樣,並且它們以相同的方式設置調用堆棧,您只需使用運行時指針來獲取調用函數/方法的內存地址,無論是從您的應用程序的DLL查找表中,OS加載程序在應用程序啓動時或從對象的vtable中填充。 –

+2

您需要在系統調用和Windows API調用之間分開。如果您正在編寫自己的操作系統,則將編寫系統調用,而不是Windows API調用,因此您需要知道系統調用。 – EJP

回答

5

擁有的API C文檔,並知道調用約定/ ABI,應該足以創建一個使用它的ASM。沒有必要的「魔術」(沒有內聯syscall說明或類似的東西)。


大部分的Win32 API的是在用戶空間的DLL實現的,所以API調用沒有其他的庫函數調用不同。 (即,如果我正確記得,它是一個帶有函數指針的間接CALL)。

通常情況下,庫函數的實現將涉及syscall與內核進行交互(或32位代碼,也許一個intsysenter,我不知道),但該接口未以文件記載並不太穩定不同的Windows版本。

+3

大多數接口都是非官方文檔記錄的,但有些來自Windows DDK等來源。在XP系統調用之前通常通過'int',從XP開始它是通過'sysenter',並且通過x64版本的Windows通過' syscall'。 –

+1

我應該說Windows XP支持'sysenter',但據我所知,在沒有'sysenter'支持的系統上它會使用'int' –

相關問題