[gcc]C言語のプログラムからレジスタの内容をダンプする

C言語のコードをgccで開発している場合、インラインアセンブラを使う事でレジスタの内容をダンプさせることが出来ます。

以下のdefine文を定義しておくと、1命令書くだけで、全レジスタをダンプしてくれるので便利です。

#define DUMP_REGISTER() {                                   \
                          register int   eax asm( "%eax" ); \
                          register int   ebx asm( "%ebx" ); \
                          register int   ecx asm( "%ecx" ); \
                          register int   edx asm( "%edx" ); \
                          register void *esp asm( "%esp" ); \
                          register void *ebp asm( "%ebp" ); \
                          register void *esi asm( "%esi" ); \
                          register void *edi asm( "%edi" ); \
                          printf( "eax:%-10d 0x%x\n"        \
                                  "ebx:%-10d 0x%x\n"        \
                                  "ecx:%-10d 0x%x\n"        \
                                  "edx:%-10d 0x%x\n"        \
                                  "esp:%p\n"                \
                                  "ebp:%p\n"                \
                                  "esi:%p\n"                \
                                  "edi:%p\n",               \
                                  eax, eax, ebx, ebx,       \
                                  ecx, ecx, edx, edx,       \
                                  esp, ebp, esi, edi        \
                                );                          \
                        }



呼び出し側はこんな感じ。

int main()
{
    DUMP_REGISTER();
}




手元の環境で実行したところ、以下のような感じで出力されました。
実行はレジスタ構成に依存するので、当たり前ですがintelのCPUの環境下で実行する必要があります。

$ ./a.out
eax:1          0x1
ebx:0          0x0
ecx:0          0x0
edx:0          0x0
esp:0x22ac20
ebp:0x22ac98
esi:0x6127cd70
edi:0x0


関連記事

コメントを残す

メールアドレスが公開されることはありません。