Загрузчик ОС?

Тема в разделе "WASM.ASSEMBLER", создана пользователем stel123, 3 дек 2004.

  1. stel123

    stel123 New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2004
    Сообщения:
    8
    Вообщем я начитался всяких статей по написанию ОС и решил сам поэкспериментировать...

    Начал я, естественно, с загрузчика, но по непонятным мне причинам, он работает только на моём компе... А я её ещё хотел как курсовик защитить, может быть... Ниже исходники загрузчика. Подскажите пожалуйста, в чём я неправ?



    [BITS 16]

    [ORG 0x7c00]

    _start:

    cli

    mov ax, cs

    mov ds, ax

    mov ss, ax

    mov sp, _start

    sti



    mov si,boot_msg

    call print

    call readkey



    ;копируем ядро с дискеты в 7e00

    mov ax,07E0h

    mov es,ax

    mov bx,0

    call readkernel





    lgdt [gd_reg]



    ;Отрубаем все прерывания

    cli

    in al,70h

    or al,80h

    out 70h,al



    ;A20

    in al,0x92

    or al,2

    out 0x92,al



    ;PMod

    mov eax,cr0

    or al,1

    mov cr0,eax



    jmp 0x08:_protected







    readkernel:

    mov ch, 0

    mov al,1

    mov ah,2

    mov cl,2

    mov dl,0

    mov dh,0

    int 13h

    ret



    print:

    lodsb

    test al,al

    jz .quit

    mov ah,0Eh

    int 10h

    jmp print

    .quit:

    ret



    readkey:

    xor ax,ax

    int 16h

    ret





    boot_msg db "Boot message...",13,10,0

    gdt:

    dw 0, 0, 0, 0



    db 0xFF

    db 0xFF

    db 0x00

    db 0x00

    db 0x00

    db 10011010b

    db 0xCF

    db 0x00



    db 0xFF

    db 0xFF

    db 0x00

    db 0x00

    db 0x00

    db 10010010b

    db 0xCF

    db 0x00





    gd_reg:

    dw 8192

    dd gdt



    [BITS 32]

    _protected:

    mov ax, 0x10

    mov ds, ax

    mov ss, ax



    ;копируем ядро из 7e00 в 200000

    mov esi, 0x7e00

    mov edi, 0x200000

    mov ecx, 0x4000

    rep movsd



    ;передаём управление ядру

    jmp 0x200000









    times 510-($-$$) db 0

    db 0xaa, 0x55



    incbin 'kernel.bin'





    А вот и ядро:)



    [BITS 32]

    [ORG 0x200000]



    mov ah,10

    mov al,'!'

    lp:

    test ah, ah

    jz qt



    mov ecx, [cursor]

    mov [0xB8000+ecx*2], al

    inc dword [cursor]

    dec ah

    jmp lp



    qt:

    hlt

    jmp short $



    cursor: dd 0
     
  2. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Так посмотри, где конкретно рушится.

    Вроде на первый взгляд всё нормально.
     
  3. stel123

    stel123 New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2004
    Сообщения:
    8
    Рушится, когда на ядро прыгаем...
     
  4. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    естественно

    почему jmp 0x200000?

    Там должен быть межсегментный Jmp

    опкод строится так:

    db 66h ; префикс - изменение разрядности кода db 0EAh ; опкод jmp

    dd 200000h ; адрес

    dw 00001000b ; селектор

    или так

    jmp селектор:адрес
     
  5. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    2 stel123 - А такой БУТ не встречался? что за идиотизм грузится со второго сектора...



    [​IMG] 390298238__utils.rar