⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cerrtrap.asm

📁 国外网站上的一些精典的C程序
💻 ASM
字号:
        PAGE ,132;  A sample Interrupt 24 (DOS critical error exception) handler;;  Public domain by Bob Stout;;  Requires MASM 5.1 or later or equivalent;;  Assemble with:       MASM /Mx /z ...;                       TASM /jMASM /mx /z ...%       .MODEL  memodel,C               ;Add model support via command                                        ;line macros, e.g.                                        ;MASM /Dmemodel=LARGE        EXTRN cedevdvr:dword, cetype:word, ceerror:word, cereturn:byte        EXTRN read_err:far, write_err:far, term_err:far        EXTRN no_paper:far, fixup_ret:far, FAT_err:far        ;NOTE:  All the above routines MUST set cereturn to:        ;       0 - Ignore        ;       1 - Retry        ;       2 - Abort        ;       3 - Fail (DOS 3.3 and later)        .DATA?        PUBLIC  osver, rmvbl, exerr, locus, class, suggestosver   db ?rmvbl   db ?exerr   dw ?locus   db ?class   db ?suggest db ?        .CODE;;  This is called by myint24;;  extern int (*read_err)(),;             (*write_err)(),;             (*term_err)(),;             (*no_paper)(),;             (*fixup_ret)(),;             (*FAT_err)();;;  Each returns: 0 - Ignore;                1 - Retry;                2 - Abort;                3 - Fail (DOS 3.3 and later);mynew24 PROC    USES BX        mov     ah,030h                 ;get DOS version number        int     21        or      al,al                   ;zero means DOS 1.x        jnz     NotDOS1        mov     al,1NotDOS1:        mov     osver,al                ;save DOS version        mov     ax,cetype               ;get type of exception...        mov     bx,ax                   ; & save it for later        and     ax,80h                  ;disk error?        jnz     NotDiskErr              ;no, continue        cmp     al,1                    ;yes, DOS 1.x?        jz      wrong_DOS               ;yes, can't check for removable media        mov     ah,-1                   ;no, assume removable media        test    word PTR cedevdvr,0800h ;is the media removable?        jz      removable        xor     ah,ah                   ;no, flag fixed mediaremovable:        mov     rmvbl,ah                ;save media type        cmp     al,3                    ;DOS 3.0 or greater?        jb      wrong_DOS               ;no, skip it        push    bx                      ;yes, save cetype info...        push    ds                      ; & other regs        push    es        push    dx        push    si        push    di        push    bp        mov     ah,59h                  ;get extended error info        int     21        pop     bp                      ;restore regs        pop     di        pop     si        pop     dx        pop     es        pop     ds        mov     exerr,ax                ;save extended error code...        mov     locus,ch                ; locus...        mov     class,bh                ;  class...        mov     suggest,bl              ;   & suggested action        pop     bx                      ;restore cetype infowrong_DOS:        mov     ax,bx                   ;get exception type        and     ax,06h                  ;FAT problems?        cmp     ax,02h        jnz     ok_fat                  ;no, continue        jmp     far PTR FAT_err         ;yes, handle itok_fat:        mov     ax,bx                   ;get exception type        and     ax,01h                  ;handle read and write separately        jz      rd_err        jmp     far PTR write_errrd_err:        jmp     far PTR read_errNotDiskErr:        test    ceerror,0009h           ;printer out of paper?        jnz     not_eop                 ;no, continue        jmp     far PTR no_paper        ;yes, handle itnot_eop:        test    word PTR cedevdvr,8000h ;character device?        jnz     unknown                 ;no, continue        jmp     far PTR term_err        ;yes, assume bad terminal I/O;;  If we get here, we haven't identified the error. We now call fixup_ret();  to resolve which action to take. This will usually involve the information;  in exerr qualified by the version of DOS in use and is best left to coding;  in a higher level language like C.;;  NOTE: It is IMPERATIVE that the return value of fixup_ret() default to 2;        to insure that if all else fails, the critcal error handler aborts!;unknown:        call    far PTR fixup_ret       ;unknown error - handle loose ends...        xor     ah,ah                   ; & return        mov     cereturn,al        retmynew24 ENDP        end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -