このアドレスはお使いのOSに固有のものではありません。あなたのハードウェア/システムに固有のものです。それらにアクセスすることは、アセンブラと他のプログラミング言語(Cなど)とは関係がありません。実際にはほとんどのデバイスドライバコード(ネットワークハードウェアと実際にやりとりするコード)は通常C言語で記述されます。
ランダムサンプルネットワーク(イーサネット)コントローラの:
Intel® 82580EB/82580DB GbE Controller: Datasheet
は、お使いのソフトウェアは、いずれかのアセンブラで、または別の言語で、実際にはイーサネット経由で通信するには、この事を取得するためにプログラムすることがあるレジスタの束があります。直列ポートのような簡単な例から始める方が簡単でしょう。今お使いのソフトウェア
Address Meaning
0 RX status (reads 0 when no data to read, 1 a byte is available)
1 RX buffer
2 TX status (reads 0 when ready to send, 1 when busy)
3 TX buffer
、いずれかのアセンブラや他の言語では、(ポーリング)を監視することで、別のコンピュータにデータを送信できるアドレス2:のは、メモリにマップされた仮想的な、固定ボーレート、シリアル・ポート・コントローラを構築してみましょう次のバイトをアドレス3に書き込みます。アドレス0を監視(ポーリング)してデータの準備ができたことを確認し、データがあるときにアドレス1からバイトを読み取ることによって、別のコンピュータからデータを受け取ることもできます。
現代のオペレーティングシステム/ OSでは、これらはすべて何らかの形で仮想アドレスにマップされる必要があるすべての物理アドレスです。
私がリンクしているような実際のハードウェアは、通常、割り込みを使用するため、ポーリングする必要はありません。通常はDMAを使用するため、ハードウェアはバイト単位でデータを受け取るのではなく、直接データにアクセスできます。さまざまなプロトコルを処理し、このプロトコルのさまざまな側面をチェックして設定するためのレジスタを持ちます。
最新のOSでは、ハードウェアとの実際のやりとりはdevice driverで実装されています。ユーザーソフトウェアは、APIを使用してデバイスドライバとデータを交換できます。ここでも、このユーザーコードはアセンブラまたは他の言語で記述することができます。 APIはOSによって異なります。通信/ネットワーキングは、一般に、より低いレベルのものより高いレベルのプロトコルが実装された「stack」として構築されます。このスタックのどの部分がユーザライブラリにあるか、またはOSの一部であるかは、オペレーティングシステムによって異なります。
私が上で説明した仮想デバイスの場合、APIは2つのシングルバイトブロッキングコール、read()
およびwrite()
で構成されます。アセンブラまたは上位レベルの言語のいずれかのメカニズムを使用して、これらを呼び出してパラメータを渡したり、出力を取得したりすることができます。一部のオペレーティングシステムでは、デバイスI/OはファイルI/Oのように見えるので、デバイス上で操作を実行するために汎用ファイルの読み取り/書き込みを使用するため、OSはそれらを適切なデバイスドライバにディスパッチします。さらに、典型的なOSでは、実際のシステムコールは、さまざまなプログラミング言語から呼び出すことのできるライブラリの種類によって利用できるようになります。
これは非常に一般的な質問ですので、私はあなたに非常に長時間巻き込まれた一般的な答えを与えました。より具体的であれば、より具体的な回答が得られます。アセンブラは自動的にクリーンで効率的であるとは言えませんが、それより複雑です。 –