2017-09-25 13 views
0

ページディレクトリを指すCR3レジスタと似ています。 Linuxもページングを使用し、Cで書かれていますが、これらのレジスタはどのようにCで使用されますか(Cを使用して特定のレジスタを選択する方法)?Cではどのようにレジスタを使用していますか?

+3

レジスタを直接使用する場合は、アセンブリ言語でコーディングする必要があります。 –

+0

どのようにマクロが初期化されるのですか?(私はいくつかのマクロを読み込んでレジスタを選択しています)、linuxのページングのソースコードでアセンブリ言語を見たことがありません。そのコードはどのように機能しますか? –

+3

あなたは何を達成しようとしていますか?通常、C言語ではCPUレジスタを使用する必要はありませんが、C言語ではレジスタのアクセス方法を指定していません。しかし、多くのコンパイラには、CPUレジスタを直接扱うことができる拡張機能があります。 –

答えて

5

C言語は、特定のプロセッサレジスタにアクセスする手段を提供しません。これはすべてコンパイラによるものです。

特定のレジスタにアクセスするには、少なくともコードのこの部分をアセンブラで記述する必要があります。

+0

私はあなたの答えが質問に答えていない、あなたはコメントとして投稿する必要がありますことを意味します。 –

+3

@MichaelWalz - それは質問に答えます。 OPは純粋なCの範囲で尋ねた。純粋なCはそれを許さない。したがってこれが答えです。短くてもそれを損なうものではありません。 – StoryTeller

+0

@StoryTeller大丈夫、たぶん、私のコメントを削除します。 –

4

あなたが話しているレジスタは、言語のプロパティではなく、プログラムを実行するハードウェアのプロパティです。私はあなたがx86タイプのハードウェアについて話していると信じています。 cr0-4およびorther特定のregsは、オペレーティングシステムのプロパティであり、ページングテーブルを含む、それによって管理されます。

したがって、これらのhw固有のレジスタにアクセスする方法はありません。唯一の方法は、それらを操作するためのアセンブリコード(ハー​​ドウェア固有)を記述することです。言語が提供する唯一のものは、アセンブリコードをプログラムに挿入できるようにするasm()演算子です。

+1

'__asm__ 'は特定の実装によって提供される*拡張子です。それは標準のC言語定義の一部ではありません。 –

+0

@ JohnBode right、標準のものは 'asm()'です。それを私が直した。 – Serge

+2

'asm'は共通の拡張子としてJ.5.10にリストされていますが、コア言語やライブラリの一部ではありません。 J.5/1で述べているように、「次の拡張は多くのシステムで広く使用されていますが、すべての の実装には移植できません。 –

3

標準Cは、プロセッサレジスタに直接アクセスする機能を提供しません。いくつかの実装は、アセンブリコードをCコードに埋め込むことができる拡張子を提供します(例えば、gccによって提供されるasm拡張子)。

一般に、プロセッサレジスタ(または他のハードウェア固有の場所)に直接アクセスする必要がある場合は、そのルーチンをアセンブラに書き込んで大きなプログラムにリンクします。

関連する問題