📄 loader.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 + -