プログラムでIPレジスタ  の値を取得するにはどうすればよいですか? CたとえばAX  、BXレジスタの値を取得するために、疑似変数があります_AX and _BX。IPレジスタ用の疑似変数もありますか?または他の方法はありますか?注:IP次に実行する命令のオフセット アドレスを格納するため、レジスタの値が必要ですか?
1 に答える
CにはCPUレジスタの概念がないため、プレーンCでは実行できません。使用しているコンパイラに応じて、次のいずれかを使用する必要があります。
- コンパイラ組み込み。
 - インライン アセンブリ。また
 - 外部アセンブリ ルーチン
 
コンパイラのドキュメントを調べて、利用可能な組み込みがあるかどうかを確認してください。利用可能なものがないと仮定すると、ある種の組み立てが唯一の選択肢になります。x86 には、IP レジスタを直接読み取る命令がありません。代わりに、call命令のようなもの (スタックに次の IP を格納する) を使用して取得する必要があります。
x86 で IP を取得する 1 つの方法を次に示します (AT&T 構文)。
.globl get_ip
get_ip:
    mov 0(%sp), %ax
    ret
次に、C コードでこれを行うことができます。
uint16_t get_ip();
...
uint16_t ip = get_ip();
コンパイラがインライン アセンブリをサポートしている場合は、別のアセンブリ ソース ファイルを必要とする代わりに、それを使用してget_ipC ソース コード内に関数を記述できます。利用可能な場合は、インライン アセンブリの構文に関するコンパイラのドキュメントを参照してください。
もちろん、上記は16ビットアセンブリで作業していることを前提としています。これは、質問でレジスタAX、BX、およびIPについて言及したためです。しかし、これを 32 ビット コードで機能させたい場合は、もちろん、レジスタの名前を%esp、、%eaxおよびに変更する必要があり、その後ではなく を返します。%eipget_eip()uint32_tuint16_t