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
    评论
NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多 的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16 位的'OBJ'和'Win32'。它还可以输出二进制文件。它的语法设计得相当的简 洁易懂,和Intel语法相似但更简单。它支持'Pentium','P6','MMX','3DNow!', 'SSE' and 'SSE2'指令集, 1.1.1 为什么还需要一个汇编器? NASM当初被设计出来的想法是'comp.lang.asm.x86'(或者可能是'alt.lang.asm' ,我忘了),从本质上讲,是因为没有一个好的免费的x86系例的汇编器可以使用, 所以,必须有人来写一个。 (*)'a86'不错,但不是免费的,而且你不可能得到32位代码编写的功能,除非你 付费,它只使用在dos上。 (*) 'gas'是免费的,而且在dos下和unix下都可以使用,但是它是作为'gcc'的一 个后台而设计的,并不是很好,'gcc'一直就提供给它绝对正确的代码,所以它的 错误检测功能相当弱,还有就是对于任何一个想真正利用它写点东西的人来讲, 它的语法简直太可怕了,并且你无法在里面写正确的16位代码。 (*) 'as86'是专门为Minix和Linux设计的,但看上去并没有很多文档可以参考。 (*) 'MASM'不是很好,并且相当贵,还且只能运行在DOS下。 (*) 'TASM'好一些,但却极入与MASM保持兼容,这就意味着无数的伪操作码和繁琐 的约定,并且它的语法本质上就是MASM的,伴随着的就是一些自相矛盾和奇怪的 东西。它也是相当贵的,并且只能运行在DOS下。 所以,只有NASM才能使您愉悦得编程。目前,它仍在原型设计阶段-我们不期望它 能够超越所有的这些汇编器。但请您发给我们bug报告,修正意见,和其他有用的 信息,还有其他任何你手头有的对我们有用的信息(感谢所有已经这样在做了的 人们),我们还会不断地改进它。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

替计划实验室Plan T Labs

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

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

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

打赏作者

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

抵扣说明:

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

余额充值