⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loader.asm

📁 从dos下装载内核
💻 ASM
字号:
.386p
_DATA segment word public use16 'DATA'

	stack_bottom db 1024 dup(0)
	stack_top dw 0
_DATA ends

_BSS	segment word public use16 'BSS'
_BSS	ends

DGROUP	group	_DATA,_BSS

JUMP16 macro selector,offsetv
        db 0eah
        dw offsetv
        dw selector
endm

PROGSIZE=progend-start
MOVESEG=9020h
extrn _main:near
public _MoveSelfToKernel
public _SetKernelPara
public _ToKernel
_TEXT	segment byte public use16 'CODE'   
	assume	cs:_TEXT,ds:DGROUP
start:
	mov ax,DGROUP
	mov ds,ax
	mov es,ax	
	mov ss,ax
	mov sp,offset stack_top
	call near ptr _main
	jmp progend
	
_MoveSelfToKernel:	
	mov bp,sp
	mov dx,[bp+2]
	mov ax,MOVESEG
	mov ds,ax
	lea di,progend
	add di,1024
	mov bx,ss:[bp]
	mov word ptr ds:[di],bx
	mov ss,ax
	mov sp,di
	mov ax,cs
	mov ds,ax
	mov si,offset start
	mov di,offset start
	mov ax,MOVESEG
	mov es,ax
	mov cx,PROGSIZE
	cld
	rep movsb
	JUMP16 MOVESEG,<offset continue>
continue:
	push dx
	call _SetKernelPara
	add sp,2
	call _ToKernel
	ret
_SetKernelPara:
	push	bp
	mov	bp,sp	
	push	si
	push	di   
	mov	 ax,9000h   
	mov	 ds,ax   
	mov	 ah,3   
	xor	 bh,bh   
	int	 10h   
	mov	 ds:[0],dx   
	mov	 ah,88h   
	int	 15h
	mov	 DS:[2],ax
	mov	 ah,0fh
	int	 10h   
	mov	 word ptr DS:[4],bx   
	mov	 DS:[6],ax   
	mov	 ah,12h   
	mov	 bl,10h   
	int	 10h
	mov	 ds:[8],ax   
	mov	 word ptr DS:[10],bx   
	mov	 word ptr DS:[12],cx   
	mov	 ax,0   
	mov	 ds,ax   
	lds	 si,ds:[4*41h]   
	mov	 ax,9000h   
	mov	 es,ax
   	mov	 di,80h   
	mov	 cx,10h   
	cld	   
	rep movsb   
	mov	 ax,0   
	mov	 ds,ax   
	lds	 si,ds:[4*46h]   
	mov	 ax,9000h   
	mov	 es,ax   
	mov	 di,90h   
	mov	 cx,10h   
	rep movsb   
	MOV	 ax,9000h
    MOV	 DS,AX
   
	mov	 ax,[bp+4]
   
	mov	 ds:[1fch],ax
   
	mov	 ax,1500h
   
	mov	 dl,81h
   
	int	 13h
   
	jc	short @3@1318
   
	cmp	 ah,3
   
	je	short @3@1486
@3@1318:
   
	mov	 ax,9000h
   
	mov	 es,ax
   
	mov	 di,90h
   
	mov	 cx,10h
   
	mov	 ax,0
   
	rep stosb	
@3@1486:		   
	pop	di
	pop	si
	pop	bp
	ret	
_ToKernel:
	mov ax,cs
	mov ds,ax
	mov es,ax
	cli
	lidt qword ptr cs:[idt_48]
	lgdt qword ptr cs:[gdt_48]
	mov eax,cr0
	or eax,1
	mov cr0,eax
	JUMP16 3*8,<offset OK_PROTECT>
OK_PROTECT:
	mov ax,2*8
	mov ds,ax
	mov es,ax
	mov esi,100000h
	mov edi,0
	mov ecx,90000h
cycle_copy:	
	mov al,[esi]
	mov [edi],al
	inc esi
	inc edi
	dec ecx
	jnz cycle_copy
	mov al,11h
	out 20h,al
	out 0a0h,al
	
	mov al,20h
	out 21h,al
	
	mov al,28h
	out 0a1h,al
	
	mov al,4
	out 21h,al
	
	mov al,2
	out 0a1h,al
	
	mov al,1
	out 21h,al
	out 0a1h,al
	mov al,0ffh
	out 21h,al
	out 0a1h,al
	
	mov ax,2*8
	mov ds,ax
	JUMP16 1*8,0
gdt:
	dw	0,0,0,0

	dw	07FFh
	dw	0000
	dw	9A00h
	dw	00C0h

	dw	07FFh
	dw	0000
	dw	9200h
	dw	00C0h
	
	dw 0fffh
	dw 0200h
	dw 9a09h
	dw 000fh
idt_48:
	dw	0
	dw	0,0

gdt_48:
	dw	800h
	dw	gdt+512,9h	
progend:

_TEXT ends
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -