NASM 纯汇编打造简单中文操作系统(5 interrupt.inc 初始化中断控制器)

五、interrupt.inc 初始化中断控制器

[BITS 32]
[ORG 0x0]
;JMP DWORD main
%macro WritePort 2
 MOV DX,%1
 MOV AL,%2
 OUT DX,AL
%endmacro
%macro ReadPort 1
 MOV DX,%1
 IN AL,DX
%endmacro
IDT_TABLE:
 ;IDT_STRUCT_ADDR: equ $-IDT_TABLE
 IDT_STRUCT:
  DW 0x0  ;中断处理过程低16位 0-15位
  DW 0x0  ;段选择字 16-31位
  DB 00000000b  ;32-39位
  DB 10001110b ;40-47位
  DW 0  ;中断处理过程地址高16位48-63
 IDT_END:
 
;初始化8259A
SetChip8259A:
 PUSH EBP
 MOV EBP,ESP
 CLI
 ;按顺序发每次打开和关闭状态8259a端口才会变化

 ; 发送 ICW1 : 使用 ICW4,级联工作
 WritePort 0x20,0x11
 WritePort 0xa0,0x11
 
 ; 发送 ICW2,中断起始号从 0x30 开始(第一片)及 0x38开始(第二片)
 WritePort 0x21,0x30  ;0-7个中断表示0-7个IDT表数组下标,键盘中断是2那么对应的就是1号下标(数组下标从0开始数)
 WritePort 0xa1,0x38
 
 ; 发送 ICW3
 WritePort 0x21,0x4  ;主片IRQ2和从片IRQ0相连
 WritePort 0xa1,0x2
 
 ; 发送 ICW4
 WritePort 0x21,0x1  ;发送1表示工作在8086模式下
 WritePort 0xa1,0x1
 
 ; 设置中断屏蔽位 OCW1 ,屏蔽所有中断请求
 ; 由于主片的 IRQ2 与从边相连,故不屏蔽它
 WritePort 0x21,0xfb  ;屏蔽中断11111011b屏蔽中断.0 1 (2不关)3 4 5 6 7
 WritePort 0xa1,0xff  ;关闭从片所有中断
 STI
 MOV ESP,EBP
 POP EBP
RET
;设置中断向量表
CreateIdtTable:
  MOV  ECX,256
  PUSH  CS
  POP ES
  MOV ESI,IDT_STRUCT
  MOV EDI,SYSTB ;IDT表存放地址
 s:
  MOV EAX,[ES:ESI]
  MOV [DS:EDI],EAX
  ADD ESI,4
  ADD EDI,4
  MOV EAX,[ES:ESI]
  MOV [DS:EDI],EAX
  SUB ESI,4
  ADD EDI,4
 LOOP s
  MOV EAX,256*8 ;所有IDT表的总个数
  MOV [DS:EDI],AX
  MOV EAX,SYSTB
  MOV [DS:EDI+2],EAX ;IDT表所在的位置
  LIDT [DS:EDI]
RET
kb_read:
  
        push    ecx
        push edx
       
        mov     ecx,0xffff
      kr_loop:
        in      al,0x64
        test    al,1
        jnz     kr_ready
        loop    kr_loop
        mov     ah,1
        jmp     kr_exit
      kr_ready:
        push    ecx
        mov     ecx,32
      kr_delay:
        loop    kr_delay
        pop     ecx
        in      al,0x60
        xor     ah,ah
      kr_exit:

        pop     edx
        pop ecx
       
        ret
  
  
kb_write:
  
        push    ecx
        push edx
       
        mov     dl,al
        mov     ecx,0xffff
      kw_loop1:
        in      al,0x64
        test    al,0x20
        jz      kw_ok1
        loop    kw_loop1
        mov     ah,1
        jmp     kw_exit
      kw_ok1:
        in      al,0x60
        mov     ecx,0xffff
      kw_loop:
        in      al,0x64
        test    al,2
        jz      kw_ok
        loop    kw_loop
        mov     ah,1
        jmp     kw_exit
      kw_ok:
        mov     al,dl
        out     0x60,al
        mov     ecx,0xffff
      kw_loop3:
        in      al,0x64
        test    al,2
        jz      kw_ok3
        loop    kw_loop3
        mov     ah,1
        jmp     kw_exit
      kw_ok3:
        mov     ah,8
      kw_loop4:
        mov     ecx,0xffff
      kw_loop5:
        in      al,0x64
        test    al,1
        jnz     kw_ok4
        loop    kw_loop5
        dec     ah
        jnz     kw_loop4
      kw_ok4:
        xor     ah,ah
      kw_exit:

        pop     edx
        pop ecx
       
        ret
  
  
kb_cmd:
  
        mov     ecx,0xffff
      c_wait:
        in      al,0x64
        test    al,2
        jz      c_send
        loop    c_wait
        jmp     c_error
      c_send:
        mov     al,bl
        out     0x64,al
        mov     ecx,0xffff
      c_accept:
        in      al,0x64
        test    al,2
        jz      c_ok
        loop    c_accept
      c_error:
        mov     ah,1
        jmp     c_exit
      c_ok:
        xor     ah,ah
      c_exit:
        ret

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

替计划实验室Plan T Labs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值