给出一个NASM修改中断向量表的例子!大家都进!
发布网友
发布时间:2022-05-23 19:33
我来回答
共1个回答
热心网友
时间:2023-11-17 15:17
%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