2016-11-15 13 views
-3

私はいくつかの高水準インタプリタと簡単なバイトコードコンパイラとインタプリタを書いています。私は小さなオペレーティングシステムのために強力な中間言語を作り始めたいと思います。アセンブリレベルでWindows API呼び出しはどのように行われますか?

これはWindowsのように独自のAPIを持っています。このプロジェクトを開始できないのは、これらのAPI呼び出し(たとえばwin32フォームapi)がアセンブリレベルでどのように行われているかを知ることだけです。

たとえば、最適化されていないCコードのアセンブリ出力を見て、呼び出しがどのようにしっかりと行われているかを確認する方法はありますか?またはWWW上の任意の情報源?事前に

おかげ

+0

デバッガを持って行ってください:) – RbMm

+2

Win32 APIは、DLL関数とCOMインターフェイスのセットに過ぎません。 .NETフォームのようなAPIは、その基盤の上に構築されています。アセンブリで正規の関数呼び出しを行う方法を知っていますか?コールスタックの仕組みを理解していますか? DLLの関数呼び出しとインターフェイスメソッド呼び出しは、通常の関数呼び出しと同様で、呼び出しスタックを同じ方法で設定します。関数/メソッドのメモリアドレスを取得するために実行時ポインタを使用して '呼び出し 'する必要があります。アプリケーションの起動時に、またはオブジェクトのvtableなどからOSローダーが読み込むアプリケーションのDLLルックアップテーブルから取得します。 –

+2

システムコールとWindows API呼び出しを区別する必要があります。独自のオペレーティングシステムを作成している場合は、Windows API呼び出しではなくシステムコールを作成しますので、システムコールを知っておく必要があります。 – EJP

答えて

5

APIのためのCのドキュメントを持つ、と呼び出し規約/ ABIを知るには、それを使用して、ASMを作成するのに十分でなければなりません。 「魔法」は必要ありません(インラインsyscall命令などはありません)。


多くのWin32 APIはユーザー空間DLLに実装されているため、API呼び出しはほかのライブラリ関数呼び出しと同じです。 (つまり、正しく呼び出すと関数ポインタを使った間接的なCALL)。

多くの場合、ライブラリ関数の実装は、カーネルと対話するsyscallを伴うだろう(多分または32ビットコードのため、intまたはsysenter、私はよく分からない)が、このインタフェースは、文書化されていないと全体で安定していないです異なるWindowsバージョン。

+3

ほとんどのインターフェイスは非公式に文書化されていますが、Windows DDKのようなソースからのものがあります。XPシステムコールの前には通常、intを使用していました.Xpで始めるのは 'sysenter'経由で、x64バージョンのWindowsでは'システムコール。 –

+1

私はWindows XPが 'sysenter'をサポートしているはずだったはずですが、私が思い出したように、' sysenter'サポートのないシステムでは 'int' –

関連する問題