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

📄 irqstack.asm

📁 GNU FreeDOS兼容MS DOS很好的东东.
💻 ASM
字号:
; File:;                         irqstack.asm; Description:;     Assembly support routines for hardware stack support;;                    Copyright (c) 1997, 1998;                          Svante Frey;                       All Rights Reserved;; This file is part of DOS-C.;; DOS-C is free software; you can redistribute it and/or; modify it under the terms of the GNU General Public License; as published by the Free Software Foundation; either version; 2, or (at your option) any later version.;; DOS-C is distributed in the hope that it will be useful, but; WITHOUT ANY WARRANTY; without even the implied warranty of; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See; the GNU General Public License for more details.;; You should have received a copy of the GNU General Public; License along with DOS-C; see the file COPYING.  If not,; write to the Free Software Foundation, 675 Mass Ave,; Cambridge, MA 02139, USA.;; $Id: irqstack.asm,v 1.6 2003/06/15 12:56:57 bartoldeman Exp $;;       Code for stack switching during hardware interrupts.%include "segs.inc"segment	_LOWTEXTold_vectors     times 16 dd 0stack_size      dw      0stack_top       dw      0stack_offs      dw      0stack_seg       dw      0irq_0:          push    bx                mov     bx, 0 * 4                jmp     short general_irq_serviceirq_1:          push    bx                mov     bx, 1 * 4                jmp     short general_irq_serviceirq_2:          push    bx                mov     bx, 2 * 4                jmp     short general_irq_serviceirq_3:          push    bx                mov     bx, 3 * 4                jmp     short general_irq_serviceirq_4:          push    bx                mov     bx, 4 * 4                jmp     short general_irq_serviceirq_5:          push    bx                mov     bx, 5 * 4                jmp     short general_irq_serviceirq_6:          push    bx                mov     bx, 6 * 4                jmp     short general_irq_serviceirq_7:          push    bx                mov     bx, 7 * 4                jmp     short general_irq_serviceirq_08:         push    bx                mov     bx, 8 * 4                jmp     short general_irq_serviceirq_09:         push    bx                mov     bx, 9 * 4                jmp     short general_irq_serviceirq_0a:         push    bx                mov     bx, 0ah * 4                jmp     short general_irq_serviceirq_0b:         push    bx                mov     bx, 0bh * 4                jmp     short general_irq_serviceirq_0c:         push    bx                mov     bx, 0ch * 4                jmp     short general_irq_serviceirq_0d:         push    bx                mov     bx, 0dh * 4                jmp     short general_irq_serviceirq_0e:         push    bx                mov     bx, 0eh * 4                jmp     short general_irq_serviceirq_0f:         push    bx                mov     bx, 0fh * 4;                jmp     short general_irq_servicegeneral_irq_service:                push    dx                push    ax                push    ds                mov     ax, cs                mov     ds, ax                mov     ax, [stack_top]                cmp     ax, [stack_offs]                jbe     dont_switch                mov     dx, ss                mov     ax, sp                mov     ss, [stack_seg]                mov     sp, [stack_top]                push    dx              ; save old SS:SP on new stack                push    ax                mov     ax, [stack_size]                sub     [stack_top], ax                pushf                call    far word [old_vectors+bx]                cli                add     [stack_top], ax                pop     ax              ; get stored SS:SP                pop     dx                mov     ss, dx          ; switch back to old stack                mov     sp, ax                pop     ds              ; restore registers and return                pop     ax                pop     dx                pop     bx                iretdont_switch:    pushf                call    far word [old_vectors+bx]                pop     ds                pop     ax                pop     dx                pop     bx                iretsegment	INIT_TEXTglobal  _init_stacks; VOID    init_stacks(VOID FAR *stack_base, COUNT nStacks, WORD stackSize);_init_stacks:                push    bp                mov     bp, sp                push    ds                push    di                push    si		mov	ax,_LOWTEXT		mov	ds,ax                mov     bx, [bp+4]                mov     dx, [bp+6]                mov     ax, [bp+8]                mov     cx, [bp+0ah]                mov     [stack_size], cx                mov     [stack_offs], bx                mov     [stack_seg], dx                mul     cx                add     ax, bx                mov     [stack_top], ax                xor     ax, ax                mov     ds, ax		mov	ax, _LOWTEXT		mov	es, ax                mov     di, old_vectors                mov     si, 8 * 4                mov     cx, 10h                rep     movsw                mov     si, 70h * 4                mov     cx, 10h                rep     movsw                push    ds                pop     es                mov     di, 8 * 4                mov     dx, irq_0                call    set_vect                mov     di, 70h * 4                call    set_vect                pop     si                pop     di                pop     ds                pop     bp                retset_vect:                mov     cx, 8set_next:       mov     ax, dx                cli                stosw                mov     ax, _LOWTEXT                stosw                sti                add     dx, irq_1 - irq_0                loop    set_next                ret

⌨️ 快捷键说明

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