NASM 纯汇编打造简单中文操作系统(5)
2010-01-29 12:11
239 查看
五、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
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kylixfire/archive/2009/03/06/3963889.aspx
[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
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kylixfire/archive/2009/03/06/3963889.aspx
相关文章推荐
- NASM 纯汇编打造简单中文操作系统(2 init.asm初始化操作系统内存。进入32位保护模式)
- NASM 纯汇编打造简单中文操作系统(3 kernel.asm 内核(实现汉字的显示,鼠标的支持等))
- NASM 纯汇编打造简单中文操作系统(1)
- NASM 纯汇编打造简单中文操作系统(6 vesa.inc 显卡绘图)
- NASM 纯汇编打造简单中文操作系统(2)
- NASM 纯汇编打造简单中文操作系统(4 mouse.inc 鼠标驱动部分(设置鼠标中断,建立中断处理程序))
- NASM 纯汇编打造简单中文操作系统(3)
- NASM 纯汇编打造简单中文操作系统(5 interrupt.inc 初始化中断控制器)
- NASM 纯汇编打造简单中文操作系统(4)
- NASM 纯汇编打造简单中文操作系统(1.boot.asm 操作系统的开始--引导程序)
- NASM 纯汇编打造简单中文操作系统(2 init.asm初始化操作系统内存。进入32位保护模式)
- [汇编]如何写一个简单的操作系统(未完)
- 【汇编】手把手教你打造自己的第一个操作系统
- 纯汇编NASM源码/显示相关函数/10H中断/纯汇编显示汉字/显示中文
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- 简单OS开发前奏(三)操作系统装载过程及BootSector的汇编语言实现
- 打造简单的linux操作系统(内核的精简)
- 一个新手学习汇编时的简单记录
- Photoshop CC 2015 for MAC【中文安装包及超简单5秒破解】
- 实验--反汇编一个简单的C程序(李鹏举)