gpt4 book ai didi

c - 在 32 位 Open Watcom C 中生成 FAR 跳转指令

转载 作者:行者123 更新时间:2023-11-30 14:24:37 26 4
gpt4 key购买 nike

我需要生成一个远跳转指令来跳转到另一个ISR(中断服务例程)。我正在开发一个 32 位 FreeDOS 应用程序。

阅读 OW 手册( cguide.pdfclr.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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com