Cで32ビットレジスタにアクセスすることは可能ですか?
-
26-09-2019 - |
質問
Cで32ビットレジスタにアクセスすることは可能ですか?もしそうなら、どのようにして?そうでない場合、C にアセンブリ コードを埋め込む方法はありますか?ちなみに、私は MinGW コンパイラを使用しています。前もって感謝します!
解決
あなただけのレジスタを読みたい場合は、することができます単純ます:
register int ecx asm("ecx");
もちろんそれは、インスタンスに関連付けられています。
もう一つの方法は、インラインアセンブリを使用しています。たとえばます:
asm("movl %%ecx, %0;" : "=r" (value) : );
可変ecx
にこの記憶value
値。私はすでに 。
他のヒント
登録したいアクセス?
汎用レジスタ 正常に閲覧できませんでかなり満足できるパイでした。きを宣言するの登録変数の機能がないかを指定する特定レジスタを使用します。さらに、ほとんどのコンパイラを無視するには登録キーワードの最適化の登録利用動します。
組込みシステムがあるのに必要なアクセス 周辺レジスタ (アルバイト、DMAコントローラI/Oピン).などのレジスタは、通常、メモリマップすることが可能ですので、からアクセスできる。
を定義することによってポインター:
volatile unsigned int *control_register_ptr = (unsigned int*) 0x00000178;
またはプリプロセッサ:
#define control_register (*(unsigned int*) 0x00000178)
または、利用できる組み立てます。
の利用 アセンブリ言語, が少なくとも三つの可能性:
- で分離を行います。asmソースファイルがり込むことができます。の組み立てルーチンと呼ばれるからCのように正常に機能する。これは、おそらく最も普通の方法で利点がhw依存性の機能を明らかにしたアプリケーションコード.
- インライン組立
- 固有の機能を実施する個別言語の組み立てください。この利点を組み立て語で直接アクセスCの変数.
あなたがCにアセンブリ埋め込むことができます。
http://en.wikipedia.org/wiki/Inline_assemblerする
ウィキペディアから例
はextern int型のerrno;
int funcname(int arg1, int *arg2, int arg3)
{
int res;
__asm__ volatile(
"int $0x80" /* make the request to the OS */
: "=a" (res) /* return result in eax ("a") */
"+b" (arg1), /* pass arg1 in ebx ("b") */
"+c" (arg2), /* pass arg2 in ecx ("c") */
"+d" (arg3) /* pass arg3 in edx ("d") */
: "a" (128) /* pass system call number in eax ("a") */
: "memory", "cc"); /* announce to the compiler that the memory and condition codes have been modified */
/* The operating system will return a negative value on error;
* wrappers return -1 on error and set the errno global variable */
if (-125 <= res && res < 0) {
errno = -res;
res = -1;
}
return res;
}
私はあなたがそれらを直接行うことができるとは思いません。あなたののできるようなコードでインラインアセンブリ行います:
asm (
"movl $0, %%ebx;"
"movl $1, %%eax;"
);
あなたは32ビットプロセッサ上で、十分なコンパイラを使用している場合は、[はい。正確な手段はあなたがプログラミングしている特定のシステムとコンパイラに依存し、もちろん、これは可能移植不可能などとしてについてのあなたのコードを行います。
のMinGWを使用して、あなたのケースでは、の GCCをご覧くださいインラインアセンブリ構文のます。
もちろんできます。他の回答がすでに示しているように、「MinGW」(gcc)は(他のコンパイラと同様に)インラインアセンブリを許可します。どのアセンブリかは、システムの CPU によって異なります (確率)。99.99% は x86)。ただし、これにより、プログラムは他のプロセッサに移植できなくなります (何をしているのか、なぜ行うのかがわかっていれば、それほど問題はありません)。
gcc のアセンブリについて説明している関連ページは次のとおりです。 ここ そして ここ, 、そして必要に応じて、また ここ. 。アーキテクチャに依存するため、特定できないことを忘れないでください (gcc は複数の CPU でコンパイルできます)。
にアクセスする必要が高級言語で書かれたプログラムからCPUレジスタは、一般的に存在しませんより多くのマシンに依存しません。
私はあなたが何かを行うが、どのようにそれを行うための従来の方法を使用する見当もつかないしようとしている疑います。
は、レジスタへの多くのアクセスは、より高いレベルの構造にしたり、「汚れた部分を」コーディング避けることができますシステムやライブラリの呼び出し中に隠されています。あなたが何をしたいかについての詳細を教えて、私たちはあなたに選択肢を提案することがあります。