+ -
当前位置:首页 → 问答吧 → 这样设置IDT有问题吗?

这样设置IDT有问题吗?

时间:2011-06-11

来源:互联网

我这样设置的话,一运行就重启

Assembly code

.586P

assume cs:code,ds:data

data segment
    idt db 6 dup(0)
        IDT_0 dd 0
              dd 0
              db 254*8 dup(0) 

        gdt db 6 dup(0)
        GDT_0 dd 0
              dd 0
        GDT_1 dd 00000000000000001111111111111111b
              dd 00000000110011111001001000000000b;0cf9300h ;00000000110011111000010000000000b
              db 50h dup(0)

data ends

code segment use16

start:
        mov ax,data
        mov ds,ax

        xor eax,eax
        mov eax,cs
        shl eax,4
        mov edi,begin_int
        add eax,edi                ;physical address

        xor esi,esi
        mov ecx,0ffh
set_idt:
        mov word ptr IDT_0[esi],ax
        mov word ptr IDT_0[esi+2],8
 
        mov word ptr IDT_0[esi+4],1000111000000000b;p=1 dpl=000 interrupt gate =1110 ???=00000000b
        push eax
        shr eax,16
        mov word ptr IDT_0[esi+6],ax
        pop eax
        add esi,8
        loop set_idt

        mov eax,data
        shl eax,4  
        mov ebx,offset IDT_0
        add eax,ebx
        mov dword ptr ds:idt[2],eax
        mov word ptr ds:idt[0],255*8


        cli
    
        in al,0EEh
        mov eax,data
        shl eax,4  
        mov ebx,offset GDT_0
        add eax,ebx
        mov dword ptr gdt[2],eax
        mov word ptr gdt[0],20h


        lgdt fword ptr gdt


        mov eax,cr0                    ; 进入保护模式
        or ax,1
        mov cr0,eax
        
        mov ax,8                       ;sel = 8
        mov gs,ax


                mov al,00010001b     ; ICW1
                out 20h,al
                out 0a0h,al

                mov al,40h                 ;中断开始
                out 21h,al
         
                mov al,48h
                out 0a1h,al                    

                mov al,100b
                out 21h,al                      

                mov al,10b
                out 0a1h,al

                mov al,1
                out 21h,al

                out 0a1h,al

                mov al,0h                    ;not mask 
                out 21h,al

                out 0a1h,al

        
        mov ebx,data
        shl ebx,4
        mov esi,offset idt
        add ebx,esi

        lidt fword ptr gs:[ebx]        ;set idt 


        sti


        jmp $

;=========================code=======================
begin_int:
        mov byte ptr gs:[DISPLAY_BASE_PHYS+(160*12+40*2)],'t'
        inc byte ptr gs:[DISPLAY_BASE_PHYS+(160*12+40*2)]
        inc byte ptr gs:[DISPLAY_BASE_PHYS+(160*12+40*2+1)]
        mov al,20h
        out 20h,al
        iretd

code ends
end start

作者: Q471260310   发布时间: 2011-06-11

不能乱改idt的

作者: MSOKD   发布时间: 2011-06-11

我是在dos里面进入保护模式,现在想设置IDT

作者: Q471260310   发布时间: 2011-06-11