我需要生成一个远跳转指令来跳转到另一个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);
现在我的问题是以上两种方式中哪一种更正确或者更好?有什么想法或意见吗?
还有其他方法可以实现这一点吗?
最佳答案
中断
函数总是很远。
就指令本身而言,您手动构造的远跳转似乎是正确的,但是,我敢打赌,简单地跳转(而不是调用)不会删除以前由 new08()
保存的内容在其序言处的堆栈上(这可能是很多寄存器,最重要的是,还有隐藏的返回地址,您的 old08()
必须返回到该返回地址!)。
为什么这么有创意?
关于c - 在 32 位 Open Watcom C 中生成 FAR 跳转指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11538081/