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

标签 c x86 dos watcom isr

我需要生成一个远跳转指令来跳转到另一个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/

相关文章:

assembly - 从Intel上的CPUID结果了解TLB

batch-file - 如何在 QBasic 中运行批处理文件?

c - 赋值中的不兼容类型 - C

c - strcat 函数不适用于指针

c - 如何使用 execlp 将命令行参数传递给 C 程序

performance - MOVSD的性能取决于参数

c - C 中的 SSL/HTTPS 客户端

gcc - %ebp 和 %esp 的 gcc 内联汇编中的字母是什么?

assembly - 将 2 个像素点在一起

compiler-optimization - 在 Turbo Pascal 中,带有空项目的已编译 COM 文件超过 10 KiB