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 |
関連記事
コメントを残す