當前位置:編程學習大全網 - 源碼下載 - 給出壹個NASM修改中斷向量表的例子!大家都進!

給出壹個NASM修改中斷向量表的例子!大家都進!

%include "nasm386SCD.INC "

org 7c00h

EOICOM equ 20h ;外部中斷處理結束命令

ICREGP equ 20h ;中斷控制寄存器端口地址

IMREGP equ 21h ;中斷屏蔽寄存器端口地址

Start:

; mov ax,7c0h

; mov ds,ax

cld

cls

call InitGDT ;初始化全局描述符表GDT

call InitIDT ;初始化中斷描述符表IDT

mov [SSVar],ss ;保存堆棧指針

mov [SPVar],sp

sidt [NORVIDTR] ;保存IDTR

in al,IMREGP

mov BYTE [IMaskRegV],al

lgdt [VGDTR] ;裝載GDTR

cli ;關中斷

lidt [VIDTR] ;裝載IDTR

mov eax,cr0

or al,1

mov cr0,eax

;mov ax,16 ;置中斷處理程序數據段

;mov ds,ax

;mov word [ds:10],4e61h

JUMP16 TempCode_Sel,0

;----------------------------------------------------------------------------

InitGDT: ;PROC

mov ax,GDTSeg

mov WORD [VGDTR+2],ax

ret

;InitGDT ENDP

;----------------------------------------------------------------------------

InitIDT: ;PROC

mov ax,IDTSeg

mov WORD [VIDTR+2],ax

ret

;InitIDT ENDP

;----------------------------------------------------------------------------

;RCodeSeg ENDS

; END Start

RDataSeg: ;SEGMENT PARA USE16 ;實方式數據段

VGDTR: ;PDesc <GDTLen-1,> ;GDT偽描述符

dw GDTLen-1,0,0

VIDTR: ;PDesc <IDTLen-1,> ;IDT偽描述符

dw GDTLen-1,0,0

NORVIDTR: ;PDesc <3ffh,> ;用於保存原IDTR值

dw 3ffh,0

SPVar DW 0 ;用於保存實方式下的SP

SSVar DW 0 ;用於保存實方式下的SS

flag DB 0 ;提示信息

Count db 8

IMaskRegV db 0

;RDataSeg ENDS

GDTSeg: ;SEGMENT PARA USE16 ;全局描述符表數據段(16位)

;----------------------------------------------------------------------------

;全局描述符表GDT

GDT: ;LABEL BYTE

DUMMY: ;空描述符

dw 0,0,0,0 ;Desc <>

Normal: ;規範段描述符及選擇子

dw 0fffh,0 ;Desc <0ffffh,,,ATDW,,>

db 0,ATDW,0,0

Normal_Sel equ Normal-GDT

;視頻緩沖區段描述符(DPL=3)及選擇子

VideoBuf: Desc 0ffffh,8000h,0bh,ATDW,0,0

VideoBuf_Sel equ VideoBuf-GDT

;----------------------------------------------------------------------------

EFFGDT: ;LABEL BYTE

;臨時代碼段描述符及選擇子

TempCode: Desc 0ffffh,TempCodeSeg,0,ATCE,0,0

TempCode_Sel equ TempCode-GDT

;演示代碼段描述符及選擇子

TICode Desc 0ffffh,int8,0,ATCE,0,0

;8號中斷處理程序數據段描述符

TIData Desc 200h,0,0,ATDW,0,0

GDTLen equ $-GDT ;全局描述符表長度

GDNum equ ($-EFFGDT)/8 ;需特殊處理的描述符數

;EchoCode_Sel = EchoCode-GDT ;0feh號中斷程序代碼段選擇子

;EchoData_Sel = EchoData-GDT ;0feh號中斷程序數據段選擇子

TICode_Sel equ TICode-GDT ;8號中斷程序代碼段選擇子

TIData_Sel equ TIData-GDT ;8號中斷程序數據段選擇子

IDTSeg: ;SEGMENT PARA USE16 ;中斷描述符表數據段(16位)

;----------------------------------------------------------------------------

IDT: ;LABEL BYTE ;中斷描述符表

;0--7的8個陷阱門描述符

Gate 0,0,0,AT386TGate,0

Gate 0,0,0,AT386TGate,0

Gate 0,0,0,AT386TGate,0

Gate 0,0,0,AT386TGate,0

Gate 0,0,0,AT386TGate,0

Gate 0,0,0,AT386TGate,0

Gate 0,0,0,AT386TGate,0

Gate 0,0,0,AT386TGate,0

;ENDM

;對應8號(時鐘)中斷處理程序的門描述符

Gate 0,TICode_Sel,0,AT386IGate,0

;----------------------------------------------------------------------------

IDTLen equ $-IDT

;----------------------------------------------------------------------------

;IDTSeg ENDS ;中斷描述符表段定義結束

;----------------------------------------------------------------------------

;8號中斷處理程序的代碼段

;----------------------------------------------------------------------------

;TempCodeSeg: ;SEGMENT PARA USE16

;ASSUME CS:TICodeSeg,DS:TIDataSeg

;----------------------------------------------------------------------------

int8: push eax

push ds

push fs

push gs

mov ax,16 ;置中斷處理程序數據段

mov ds,ax

mov word [ds:10],4e61h

pop gs

pop fs

pop ds

mov al,EOICOM ;通知中斷控制器中斷處理結束

out ICREGP,al

pop eax

iretd ;中斷返回

;TIBegin ENDP

;----------------------------------------------------------------------------

;TICodeLen = $

;TICodeSeg ENDS

TempCodeSeg:

mov ax,16

mov ds,ax

mov al,11111110b

out 21h,al

sti

jmp $

times 510-($-$$) db 0

dw 0xaa55

  • 上一篇:開封旅遊景點
  • 下一篇:關於如雷貫耳的唯美語錄
  • copyright 2024編程學習大全網