x86 32bit
現在ある関数を割り込みハンドラとしてコンパイルしたいと思っているのですが
その方法がわからず困っています。
void Handler_List_0x00(void) { //割り込みベクタ0x00 }
上記の関数が割り込みハンドラとして呼び出されます。
普通の関数ではiretdではなくretでリターンしてしまうため
割り込み時にスタックに積まれたEFLAGSの分もpopできず
その後暴走してしまいます。
void INT_IT(void) __attribute__ ((interrupt_handler)); void INT_IT (void) { }
調べているとこんな感じに定義すればコンパイラが割り込みハンドラとして関数をコンパイルしてくれるとの情報がありました。ただ
コンパイルしようとすると
warning: 'interrupt_handler' attribute directive ignored [-Wattributes]
と警告がでます。
(-Sオプションでアセンブリ出力してみたけどやっぱりリターン時はiretではなくretだった。)
・・・どうすればある関数をコンパイラに割り込みハンドラとしてコンパイルしてもらえるのでしょうか?
やってみたこと
コンパイラがiretdでリターンさせてくれないなら自分で書けばいいじゃないかということで
void Handler_List_0x00(void) { //割り込みベクタ0x00 __asm__ __volatile__( "pop %ebp\n\t" "iretd\n\t" ); }
オペランドサイズが16bitの場合はiret
オペランドサイズが32bitの場合はiretd(のはず)
C:\Users\matsu\AppData\Local\Temp\ccczK3Mv.s: Assembler messages:
C:\Users\matsu\AppData\Local\Temp\ccczK3Mv.s:55: Error: no such instruction: `iretd'
と出てくるのでiretd命令は使えないようです・・・