📄 kernel.asm
字号:
[section .data]
%include "const.inc"
;TopOfStack equ 0fffeh
KernelMess db "kernel running! :)",0a0h,0
_Disposition dd (10*80+0)*2 ;保护模式下显示字符串位置
PM_Disposition equ _Disposition
DispNewLine: db 0a0h,0
SelectorCr equ 8
SelectorDRW equ 16
SelectorVideo equ 24
TopOfStack equ 0fffeh
extern cstart
extern GDTPtr ;0x31fc0
extern IDTPtr ;0x31c40
[section .text]
[bits 32]
align 32
global _start
global init_port
_start:
; mov ax,SelectorDRW
; mov ds,ax
; mov es,ax
; mov ss,ax
; mov sp,TopOfStack
; mov bp,sp
; mov ax,SelectorVideo
; mov gs,ax
sgdt [GDTPtr] ;0x30400
call cstart ;将gdt表从loader中搬到kernel中
lgdt [GDTPtr]
lidt [IDTPtr]
jmp SelectorCr:init
init:
push DispNewLine
call PM_DispStr
add esp,4
push KernelMess
call PM_DispStr
add esp,4
sti
jmp $
jmp $
PM_DispStr:
push ebp
mov ebp,esp
push esi
push edi
push eax
push ebx
push edx
mov esi,[ebp+8]
mov edi,[PM_Disposition]
.1:
lodsb
test al,al
jz .2
cmp al,0a0h
jz .3
mov ah,0fh
mov [gs:edi],ax
add edi,2
jmp .1
.3
xor edx,edx
mov eax,edi
mov ebx,160
div ebx
inc eax
mul ebx
cmp edx,0
jnz .4
mov edi,eax
jmp .1
.4:
jmp $
.2
mov [PM_Disposition], edi
pop edx
pop ebx
pop eax
pop edi
pop esi
mov esp,ebp
pop ebp
ret
;init_port(port,value)
init_port:
push ebp
mov ebp,esp
push eax
push edx
mov al,[ebp+12]
mov dx,[ebp+8]
out dx,al
nop ; 一点延迟
nop
pop edx
pop eax
mov esp,ebp
pop ebp
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -