我需要生成一个远跳转指令来跳转到另一个 ISR(中断服务程序)。我正在开发一个 32 位 FreeDOS 应用程序。
阅读 OW 手册(cguide.pdf和clr.pdf)后,我想出了两种成功编译的方法,没有任何警告或错误。
/* 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);
现在我的问题是以上两种方法中哪一种更正确或更好?有什么想法或意见吗?
有没有其他方法可以做到这一点?