別の ISR (Interrupt Service Routine) にジャンプするには、far jump 命令を生成する必要があります。私は 32 ビットの FreeDOS アプリケーションを開発しています。
OW のマニュアル ( cguide.pdfおよびclr.pdf ) を読んだ後、警告やエラーなしで正常にコンパイルされる 2 つの方法を見つけました。
/* Code Snippet #1 */
#pragma aux old08 aborts ;
void (__interrupt __far *old08)(void); // function pointer declaration
void __interrupt __far new08(void) {
/* Do some processing here ... */
(*old08)(); /* OW will now generate a jump inst. instead of call*/
}
私が考え出した他のアプローチは次のとおりです。
/* Code Snippet #2 */
static void jumpToOld08(void);
# pragma aux jumpToOld08 = \
".686p" \
" DB 0xEA" \
"off_old08 DD 0" \
"sel_old08 DW 0" ;
void __interrupt __far new08(void){
/* Do some processing here ... */
jumpToOld08();
}
extern unsigned short sel_old08;
extern unsigned int off_old08;
sel_old08 = ( __segment )FP_SEG(old08);
off_old08 = FP_OFF(old08);
さて、私の質問は、上記の 2 つの方法のどちらがより正しいか、または優れているかということです。アイデアや意見はありますか?
これを達成する他の方法はありますか?