加载文件

来源:互联网 发布:医学继续教育网络 编辑:程序博客网 时间:2024/05/16 09:10

mp short start
nop

%define PCI_BUS_SHIFT 0x08
%define PCI_DEVICE_SHIFT 0x03
%define PCI_FUNCTION_SHIFT 0x00
%define PCI_BUS_MAX 0xff
%define PCI_DEVICE_MAX 0x1f
%define PCI_FUNCTION_MAX 0x07

%define SETUP_ADDRESS 0x1000
%define LOADER_ADDRESS 0x8000
%define KERNEL_ADDRESS 0x9000

DA_P EQU 1<<7
DA_DPL1 EQU 0x01<<5
DA_DPL2 EQU 0x02<<5
DA_DPL3 EQU 0x03<<5
DA_DT EQU 1<<4
DA_E EQU 1<<3
DA_A EQU 1<<0
DA_W EQU 1<<1
DA_ED EQU 1<<2
DA_R EQU 1<<1
DA_C EQU 1<<2
DA_G EQU 1<<15
DA_D EQU 1<<14
DA_AVL EQU 1<<12
DA_286TSS EQU 0x01
DA_LDT EQU 0x02
DA_286TSS_ EQU 0x03
DA_286CALL EQU 0x04
DA_TASK EQU 0x05
DA_286INTERUPT EQU 0x06
DA_286TRAP EQU 0x07
DA_386TSS EQU 0x09
DA_386TSS_ EQU 0x0b
DA_386CALL EQU 0x0c
DA_386INTERUPT EQU 0x0e
DA_386TRAP EQU 0x0f

TIL EQU 1<<2
RPL0 EQU 0x00
RPL1 EQU 0x01
RPL2 EQU 0x02
RPL3 EQU 0x03

%macro Descriptor 3
    dw %2 & 0xffff
    dw %1 & 0xffff
    db (%1 >> 0x10) & 0xff
    dw %3 | ((%2 >> 0x10) & 0x0f)
    db (%1 >> 24) & 0xff
%endmacro

%macro Gate 3
    dw %2 & 0xffff
    dw %1
    dw %3
    dw (%2 >> 0x10) & 0xffff
%endmacro

[SECTION .stack]
times 512 db 0
TopOfStack EQU $
times 512 db 0
TopOfStack1 EQU $
times 512 db 0
TopOfStack2 EQU $

[SECTION .data]
null: Descriptor 0, 0, 0
SelectorCode EQU $ - null
code: Descriptor LOADER_ADDRESS*0x10, 0xffff, DA_P|DA_G|DA_DT|DA_E|DA_R|DA_D
SelectorText EQU $ - null + RPL3
text: Descriptor LOADER_ADDRESS*0x10, 0xffff, DA_P|DA_G|DA_DT|DA_E|DA_R|DA_D|DA_DPL3
SelectorData EQU $ - null
data: Descriptor 0, 0xffff, DA_P|DA_G|DA_DT|DA_W|DA_R
SelectorVideo EQU $ - null + RPL3
video: Descriptor 0xb8000, 0xffff, DA_P|DA_DT|DA_W|DA_R|DA_DPL3
SelectorStack EQU $ - null
stack: Descriptor LOADER_ADDRESS*0x10, 0xffff, DA_P|DA_G|DA_DT|DA_W|DA_R
SelectorStackRPL3 EQU $ - null + RPL3
.stack: Descriptor LOADER_ADDRESS*0x10, 0xffff, DA_P|DA_G|DA_DT|DA_W|DA_R|DA_DPL3
SelectorLdt EQU $ - null
ldts: Descriptor 0, 0xffff, DA_P|DA_G|DA_LDT
SelectorTss EQU $ - null + RPL3
tsss: Descriptor 0, 0xffff, DA_P|DA_G|DA_386TSS|DA_DPL3
SelectorTss1 EQU $ - null + RPL3
tsss1: Descriptor 0, 0xffff, DA_P|DA_G|DA_386TSS|DA_DPL3
len EQU $ - null
gdtr: dw len
    dd LOADER_ADDRESS*0x10 + null

ldt:
code_sel EQU $ - ldt + TIL
.code: Descriptor LOADER_ADDRESS*0x10, 0xffff, DA_P|DA_G|DA_E|DA_W|DA_DT|DA_D
data_sel EQU $ - ldt + TIL
.data: Descriptor 0, 0xffff, DA_P|DA_G|DA_R|DA_W|DA_DT
stack_sel EQU $ - ldt + TIL
.stack: Descriptor 0, 0xffff, DA_P|DA_G|DA_R|DA_W|DA_DT
ldtlen EQU $ - ldt

tss:
TRLINK dd 0
TRSTACK0 dd 0
TRSS0 dd 0
TRSTACK1 dd 0
TRSS1 dd 0
TRSTACK2 dd 0
TRSS2 dd 0
TRCR3 dd 0
TREIP dd show
TREFLAGS dd 0
TREAX dd 0
TRECX dd 0
TREDX dd 0
TREBX dd 0
TRESP dd TopOfStack
TREBP dd 0
TRESI dd 0
TREDI dd 0
TRES dd SelectorText
TRCS dd SelectorText
TRSS dd SelectorStackRPL3
TRDS dd SelectorText
TRFS dd SelectorText
TRGS dd SelectorVideo
TRLDT dd SelectorLdt
TRATTR dw 0
TRIOMAP dw 0
TRMAP db 0

tss1:
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd 0
dd show
dd 0
dd 0
dd 0
dd 0
dd 0
dd TopOfStack
dd 0
dd 0
dd 0
dd SelectorText
dd SelectorText
dd SelectorStackRPL3
dd SelectorText
dd SelectorText
dd SelectorVideo
dd SelectorLdt
dw 0
dw 0
db 0

[SECTION .text]
start:
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, TopOfStack

    xor eax, eax
    mov ax, LOADER_ADDRESS
    xor edx, edx
    mov dx, 0x10
    mul dx
    add ax, ldt
    shl edx, 0x10
    or edx, eax
    mov eax, edx
    and edx, 0xffff
    mov word [ldts+2], dx
    mov edx, eax
    shr edx, 0x10
    and edx, 0xff
    mov byte [ldts+4], dl
    mov edx, eax
    shr edx, 24
    and edx, 0xff
    mov byte [ldts+7], dl

    xor eax, eax
    mov ax, LOADER_ADDRESS
    xor edx, edx
    mov dx, 0x10
    mul dx
    add ax, tss
    shl edx, 0x10
    or edx, eax
    mov eax, edx
    and edx, 0xffff
    mov word [tsss+2], dx
    mov edx, eax
    shr edx, 0x10
    and edx, 0xff
    mov byte [tsss+4], dl
    mov edx, eax
    shr edx, 24
    and edx, 0xff
    mov byte [tsss+7], dl

    xor eax, eax
    mov ax, LOADER_ADDRESS
    xor edx, edx
    mov dx, 0x10
    mul dx
    add ax, tss1
    shl edx, 0x10
    or edx, eax
    mov eax, edx
    and edx, 0xffff
    mov word [tsss1+2], dx
    mov edx, eax
    shr edx, 0x10
    and edx, 0xff
    mov byte [tsss1+4], dl
    mov edx, eax
    shr edx, 24
    and edx, 0xff
    mov byte [tsss1+7], dl

    lgdt [gdtr]

    cli

    mov dx, 0x92
    in al, dx
    or al, 00000010b
    out dx, al

    mov eax, cr0
    or eax, 1
    mov cr0, eax

    jmp SelectorCode:startcode

ReadSector:
    push ax
    push bx
    push cx
    push dx
    push si
    push di
    mov ah, 0x00
    mov dl, 0x00
    int 0x13
    mov ax, 19
    mov dl, 0x12
    div dl
    add ah, 1
    mov cl, ah
    mov ax, 19
    mov dl, 0x12
    div dl
    movzx ax, al
    mov dl, 0x02
    div dl
    mov ch, al
    mov dh, ah
    mov dl, 0x00
    mov ax, SETUP_ADDRESS
    mov es, ax
    mov bx, 0
    mov ah, 0x02
    mov al, 0x0e
re_read:
    int 0x13
    jc re_read
    mov ax, cs
    mov ds, ax
    mov ax, SETUP_ADDRESS
    mov es, ax
    mov al, 0xe0
    mov ah, 0x20
    mul ah
    mov bx, ax
    mov dx, 0
    mov di, dx
.compare:
    mov cx, 11
    mov si, Kernel_Filename
    cld
    repe cmpsb
    add dx, 0x20
    mov di, dx
    cmp dx, bx
    jnl .filename
    test cx, cx
    jnz .compare
.filename:
    sub dx, 0x20
    add dx, 0x1a
    mov ax, SETUP_ADDRESS
    mov ds, ax
    mov si, dx
    lodsw
    mov di, ax
    mov bx, 0
    mov ax, 1
    mov dl,0x12
    div dl
    add ah, 1
    mov cl, ah
    mov ax, 1
    mov dl, 0x12
    div dl
    movzx ax, al
    mov dl, 0x02
    div dl
    mov ch, al
    mov dh, ah
    mov dl, 0x00
    mov ax, SETUP_ADDRESS
    mov es, ax
    mov bx, 0
    mov ah, 0x02
    mov al, 0x08
    int 0x13
.begin:
    cmp di, 0x0fff
    jz .read
    mov ax, di
    mov ax, SETUP_ADDRESS
    mov ds, ax
    mov si, 0
    mov ax, di
    mov dl, 0x02
    div dl
    mov al, ah
    cmp al, 0x00
    jz .a
    cmp al, 0x01
    jz .b
    jmp .read
.a:
    mov ax, di
    mov dx, 0x03
    mul dx
    mov cx, 0x02
    div cx
    mov si, ax
    lodsw
    and ah, 0x0f
    mov si, ax
    jmp .read
.b:
    mov ax, di
    mov dx, 0x03
    mul dx
    mov cx, 0x02
    div cx
    mov si, ax
    lodsw
    shr al, 0x04
    and al, 0x0f
    mov cl, al
    shr ax, 0x04
    or al, cl
    mov si, ax
.read:
    cmp di, 0x0fff
    jz .end
    mov ax, di
    sub ax, 0x02
    add ax, 33
    mov di, ax
    mov ax, di
    mov dl, 0x12
    div dl
    add ah, 1
    mov cl, ah
    mov ax, di
    mov dl, 0x12
    div dl
    movzx ax, al
    mov dl, 0x02
    div dl
    mov ch, al
    mov dh, ah
    mov dl, 0x00
    mov ax, KERNEL_ADDRESS
    mov es, ax
    mov ah, 0x02
    mov al, 0x01
    int 0x13
    add bx, 0x200
    mov di, si
    jmp .begin
.end:
    pop di
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret

LoadKernel:
    push eax
    push ebx
    push ecx
    push edx
    push esi
    push edi
    mov ax, KERNEL_ADDRESS
    mov ds, ax
    mov ax, 0
    mov es, ax
    mov eax, 0x3c
    mov ebx, dword [eax]
    xor edx, edx
    mov dx, word [ebx+0x06]
    xor eax, eax
    mov eax, dword [ebx+0x28]
    mov dword [AddressOfEntryPoint], eax
    xor eax, eax
    mov ax, word [ebx+0x14]
    add ebx, 0x04
    add ebx, 0x14
    add ebx, eax
.next:
    mov edi, [ebx+0x0c]
    mov ecx, [ebx+0x10]
    mov esi, [ebx+0x14]
    rep movsb
    add ebx, 0x28
    sub edx, 1
    test edx, edx
    jnz .next
    pop edi
    pop esi
    pop edx
    pop ecx
    pop ebx
    pop eax
    ret

DispAL:
    push ax
    push bx
    push cx
    push dx
    mov dh, 2
    mov dl, al
Disp:
    mov bh, dh
    sub bh, 1
    mov al, bh
    mov bl, 0x04
    mul bl
    mov cl, al
    mov al, dl
    shr al, cl
    and al,0xf
    cmp al, 10
    jnl lable
    add al, 0x30
    jmp l
lable:
    cmp al, 0xa
    jz .a
    cmp al, 0xb
    jz .b
    cmp al, 0xc
    jz .c
    cmp al, 0xd
    jz .d
    cmp al, 0xe
    jz .e
    cmp al, 0xf
    jz .f
.a:
    mov al, 'a'
    jmp l
.b:
    mov al, 'b'
    jmp l
.c:
    mov al, 'c'
    jmp l
.d:
    mov al, 'd'
    jmp l
.e:
    mov al, 'e'
    jmp l
.f:
    mov al, 'f'
    jmp l
l:
    call print
    sub dh, 1
    cmp dh, 0
    jnz Disp
    pop dx
    pop cx
    pop bx
    pop ax
    ret
print:
    push ax
    push bx
    push cx
    mov ah, 0x0e
    mov bx, 0006h
    mov cx, 1
    int 0x10
    pop cx
    pop bx
    pop ax
    ret

[SECTION .code]
[BITS 32]
startcode:
    mov ax, cs
    mov ax, SelectorData
    mov ds, ax
    mov es, ax
    mov ax, SelectorStack
    mov ss, ax
    mov sp, TopOfStack
    mov ax, SelectorVideo
    mov gs, ax

    mov ax, SelectorLdt
    lldt ax

    mov ax, SelectorTss
    ltr ax

    mov al, 0x00
    call clear
    mov al, 'a'
    call clear
    mov dh, 10
    mov dl, 0x00
    call ShowCursor
    jmp $

    xor eax, eax
    mov ax, SelectorStackRPL3
    push eax
    mov ax, sp
    push esp
    mov eax, SelectorText
    push eax
    mov eax, test
    push eax
    retf

    jmp $

show:
    mov al, 'a'
    mov [gs:0], al
    jmp $

test:
    mov al, 'a'
    mov [gs:0], al
    jmp $

clear:
    push eax
    push ebx
    push ecx
    push edx
    mov cl, 80
    mov ch, 25
    mov dl, 0
    mov dh, 0
.show:
    call PrintAL
    add dl, 1
    cmp dl, cl
    jnz .show
    mov dl, 0
    add dh, 1
    cmp dh, ch
    jnz .show
    pop edx
    pop ecx
    pop ebx
    pop eax
    ret

ShowAL:
    push ax
    push bx
    push cx
    push dx
    mov dh, 2
    mov dl, al
.disp:
    mov bh, dh
    sub bh, 1
    mov al, bh
    mov bl, 0x04
    mul bl
    mov cl, al
    mov al, dl
    shr al, cl
    and al,0xf
    cmp al, 10
    jnl .show
    add al, 0x30
    jmp .l
.show:
    cmp al, 0xa
    jz .a
    cmp al, 0xb
    jz .b
    cmp al, 0xc
    jz .c
    cmp al, 0xd
    jz .d
    cmp al, 0xe
    jz .e
    cmp al, 0xf
    jz .f
.a:
    mov al, 'a'
    jmp .l
.b:
    mov al, 'b'
    jmp .l
.c:
    mov al, 'c'
    jmp .l
.d:
    mov al, 'd'
    jmp .l
.e:
    mov al, 'e'
    jmp .l
.f:
    mov al, 'f'
    jmp .l
.l:
    call PrintAL
    sub dh, 1
    cmp dh, 0
    jnz .disp
    pop dx
    pop cx
    pop bx
    pop ax
    ret
PrintAL:
    push eax
    push ebx
    push ecx
    push edx
    mov bl, al
    xor eax, eax
    mov al, dh
    mov cl, 80
    mul cl
    xor dh, dh
    add ax, dx
    mov cx, 2
    mul cx
    xor ecx, ecx
    mov cx, dx
    shl ecx, 0x10
    or ecx, eax
    mov al, bl
    mov [gs:ecx], al
    pop edx
    pop ecx
    pop ebx
    pop eax
    ret
readcursor:
    push ax
    push bx
    push cx
    mov dx, 0x3d4
    mov al, 0x0e
    out dx, al
    mov dx, 0x3d5
    in al, dx
    mov ch, al
    mov dx, 0x3d4
    mov al, 0x0f
    out dx, al
    mov dx, 0x3d5
    in al, dx
    mov cl, al
    mov al, ch
    mov dl, 80
    mul dl
    xor ch, ch
    add ax, cx
    mov cx, ax
    mov dh, ch
    mov dl, cl
    pop cx
    pop bx
    pop ax
    ret
setcursor:
    push ax
    push bx
    push cx
    mov ch, dh
    mov cl, dl
    mov al, ch
    mov dl, 80
    mul dl
    xor ch, ch
    add ax, cx
    mov cx, ax
    mov dx, 0x3d4
    mov al, 0x0e
    out dx, al
    mov dx, 0x3d5
    mov al, ch
    out dx, al
    mov dx, 0x3d4
    mov al, 0x0f
    out dx, al
    mov dx, 0x3d5
    mov al, cl
    out dx, al
    pop cx
    pop bx
    pop ax
    ret

ShowCursor:
    push ax
    push bx
    push cx
    push dx
    mov ch, dh
    mov cl, dl
    mov al, ch
    mov dl, 80
    mul dl
    xor ch, ch
    add ax, cx
    mov cx, ax
    mov dx, 0x3d4
    mov al, 0x0c
    out dx, al
    mov dx, 0x3d5
    mov al, ch
    out dx, al
    mov dx, 0x3d4
    mov al, 0x0d
    out dx, al
    mov dx, 0x3d5
    mov al, cl
    out dx, al
    pop dx
    pop cx
    pop bx
    pop ax
    ret

DispPCI:
    push eax
    push ebx
    push ecx
    push edx
    mov dx, 0xcf8
    xor ecx, ecx
.bus:
    xor edx, edx
    mov edx, PCI_BUS_MAX
    shl edx, PCI_BUS_SHIFT
    shl edx, 0x08
    not edx
    and ecx, edx
    xor edx, edx
    mov edx, [bus]
    and edx, PCI_BUS_MAX
    shl edx, PCI_BUS_SHIFT
    shl edx, 0x08
    or ecx, edx
.dev:
    xor edx, edx
    mov edx, PCI_DEVICE_MAX
    shl edx, PCI_DEVICE_SHIFT
    shl edx, 0x08
    not edx
    and ecx, edx
    xor edx, edx
    mov edx, [dev]
    and edx, PCI_DEVICE_MAX
    shl edx, PCI_DEVICE_SHIFT
    shl edx, 0x08
    or ecx, edx
.func:
    xor edx, edx
    mov edx, PCI_FUNCTION_MAX
    shl edx, PCI_FUNCTION_SHIFT
    shl edx, 0x08
    not edx
    and ecx, edx
    xor edx, edx
    mov edx, [func]
    and edx, PCI_FUNCTION_MAX
    shl edx, PCI_FUNCTION_SHIFT
    shl edx, 0x08
    or ecx, edx
    or ecx, 0x80000000
    xor eax, eax
    mov eax, ecx
    mov dx, 0xcf8
    out dx, eax
    mov dx, 0xcfc
    in eax, dx
    call ShowAL
    jmp $
    add word [func], 1
    cmp word [func], PCI_FUNCTION_MAX
    jnz .func
    mov word [func], 0
    add word [dev], 1
    cmp word [dev], PCI_DEVICE_MAX
    jnz .dev
    mov word [func], 0
    mov word [dev], 0
    add word [bus], 1
    cmp word [bus], PCI_BUS_MAX
    jnz .bus
    pop edx
    pop ecx
    pop ebx
    pop eax
.disp:
    ret

ReadPort:
    push eax
    push ebx
    push ecx
    push edx
    push esi
    push edi
    mov ebx, 0
.read:
    mov ax, SelectorData
    mov es, ax
    mov edi, ebp
    in al, dx
    stosb
    add ebx, 1
    cmp ecx, ebx
    jnz .read
    pop edi
    pop esi
    pop edx
    pop ecx
    pop ebx
    pop eax
    ret

Kernel_Filename: db "KERNEL  BIN", 0
AddressOfEntryPoint: dd 0

string: db "Hello World!", 0
address: times 256 db 0

bus: dw 0
dev: dw 0
func: dw 0

0 0
原创粉丝点击