CPUJMP.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:3k
源码类别:

操作系统开发

开发平台:

DOS

  1. /*
  2.  * CPU specific code for Intel compatible chips
  3.  */
  4. #pragma inline
  5. #include <asmrules.h>
  6. #include <cpujmp.h>
  7. int cpusetjmp(cpu_jmp_buf jmpb)
  8. {
  9.     /* save flags in bx */
  10.     asm     pushf
  11.     asm     pop     bx
  12.     /* save es,di */
  13.     asm     mov     dx, es
  14.     asm     mov     cx, di
  15.     /* reference the block */
  16.     asm     les     di, jmpb
  17.     asm     cld
  18.     /* save sp, ss */
  19.     asm     lea     ax, jmpb
  20.     asm     stosw
  21.     asm     mov     ax, SS
  22.     asm     stosw
  23.     /* remember, we saved the flags in bx, save to struct now */
  24.     asm     xchg    ax,bx
  25.     asm     stosw
  26.     /* get CS and IP from caller stack, save 'em */
  27.     asm     mov     ax, W1(jmpb-cPtrSize)   /* large code */
  28.     asm     stosw
  29.     asm     mov     ax, W0(jmpb-cPtrSize)
  30.     asm     stosw
  31.     /* save BP, DI, ES, SI */
  32.     asm     mov     ax, [bp]
  33.     asm     stosw                   /* BP */
  34.     asm     xchg    ax, cx
  35.     asm     stosw                   /* DI */
  36.     asm     mov     ax, dx
  37.     asm     stosw                   /* ES */
  38.     asm     xchg    ax, si
  39.     asm     stosw                   /* SI */
  40.     asm     mov     ax, ds
  41.     asm     stosw                   /* DS */
  42.     asm     mov     es, dx          /* restore ES */
  43.     return 0;
  44. }
  45. void cpulongjmp(cpu_jmp_buf jmpb, int retval)
  46. {
  47.     /* if (retval==0) retval=1; */
  48.     asm     mov     dx, retval
  49.     asm     cmp     dx, 1           /* generates carry if dx=0      */
  50.     asm     adc     dx, 0           /* if was 0, now it's 1  */
  51.     asm     LDS_    si, jmpb
  52.     asm     cld
  53.     /* Change context begins with changing stack */
  54.     asm     pushf                   /* save state of interrupt flag */
  55.     asm     pop     bx              /*  in bx */
  56.     asm     lodsw                   /* sp */
  57.     asm     cli
  58.     asm     mov     ss, [si]        /* SS */
  59.     asm     mov     sp, ax
  60.     asm     push    bx              /* restore state of interrupt flag */
  61.     asm     popf
  62.     asm     lodsw                   /* skip SS */
  63.     asm     lodsw                   /* flags */
  64.         /* need to build link to setjmp's caller IP:CS:FLAGS */
  65.     asm     push    ax              /* flags */
  66.     asm     lodsw                   /* cs */
  67.     asm     push    ax
  68.     asm     lodsw                   /* ip */
  69.     asm     push    ax
  70.         /* restore remaining working registers */
  71.     asm     lodsw                   /* bp */
  72.     asm     xchg    bp, ax
  73.     asm     lodsw                   /* di */
  74.     asm     xchg    di, ax
  75.     asm     lodsw                   /* es */
  76.     asm     mov     es, ax
  77.     asm     lodsw                   /* si */
  78.     asm     mov     ds, [si]
  79.     asm     xchg    si, ax
  80.     asm     xchg    ax, dx          /* restore AX  */
  81.     asm     iret                    /* return to original setjmp caller */
  82. }