Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2017, 21:38   #11
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Весь код приведите. А так же код загрузчика, часто у новичков бывает, что ядро целиком не загружено в память.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.08.2017, 21:47   #12
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

boot.asm
Код:
use16
org 0x7c00                  
                            

 start:
    xor ax, ax
    mov ds, ax              

finish:
    times 0x1FE-finish+start db 0
    db 55h,0aah


Boot_Second:
    lgdt [gdtr]             

    lidt [idtr]

    call OpenA20Gate        
    cli

    mov al,8Fh;
    out 70h,al
    in al,71h
    call EnablePMode       




;******************
;* Opens A20 Gate *
;******************
OpenA20Gate:
    in al, 0x92         

    or al, 2            
    out 0x92, al

    ret


EnablePMode:
    mov eax, cr0
    or eax, 1
    mov cr0, eax

    jmp far (CODE_DESC - NULL_DESC) : ProtectedMode


align 8
GDTR_TABLE:
NULL_DESC:
    dd 0            ; null descriptor
    dd 0

CODE_DESC:
    dw 0xFFFF       ; limit low
    dw 0            ; base low
    db 0            ; base middle
    db 10011010b    ; access
    db 11001111b    ; granularity
    db 0            ; base high

DATA_DESC:
    dw 0xFFFF       ; limit low
    dw 0           ; base low
    db 0            ; base middle
    db 10010010b    ; access
    db 11001111b    ; granularity
    db 0            ; base high
VIDEO_SEG:
    dw 0FFFFh
    dw 8000h
    db 0Bh
    db 092h
    db 040h
    db 0

gdtr:
    Limit dw gdtr - NULL_DESC - 1 ; length of GDT
    Base dd NULL_DESC   ; base of GDT


IDT:
        dd 0,0 
        dw syscall_int ,08h, 1000111000000000b, 0 
        dd 0,0 ; 2
        dd 0,0 ; 3
        dd 0,0 ; 4
        dd 0,0 ; 5
        dd 0,0 ; 6
        dd 0,0 ; 7
        dd 0,0 ; 8
        dd 0,0 ; 9
        dd 0,0 ; 10
        dd 0,0 ; 11
        dd 0,0 ; 12
        dw global_catch_int, 08h, 1000111000000000b, 0   ; 13  #GP
        dd 0,0 ; 14
        dd 0,0 ; 15
        dd 0,0 ; 16
        dd 0,0 ; 17
        dd 0,0 ; 18
        dd 0,0 ; 19
        dd 0,0 ; 20
        dd 0,0 ; 21
        dd 0,0 ; 22
        dd 0,0 ; 23
        dd 0,0 ; 24
        dd 0,0 ; 25
        dd 0,0 ; 26
        dd 0,0 ; 27
        dd 0,0 ; 28
        dd 0,0 ; 29
        dd 0,0 ; 30
        dd 0,0 ; 31
        dw sys_timer_int, 08h, 1000111000000000b, 0  
        dw keyboard_int, 08h, 1000111000000000b, 0   


IDT_SIZE dw  $-IDT

idtr:
        dw IDT_SIZE-1
        dd IDT


use32
include 'Kernel.ASM'
ProtectedMode:
    mov     ax, DATA_DESC - NULL_DESC
    mov     ds, ax ; update data segment
    mov     ss, ax
    mov     fs, ax
    mov     gs, ax
    mov     ax, VIDEO_SEG - NULL_DESC
    mov     es, ax
    mov     cx, 0
    mov     di, cx

    in   al, 70h
    and  al, 7Fh
    out  70h, al
    sti
    jmp Main_kernel
kernel.asm

Код:
Main_kernel:
    jmp $

 
syscall_int:
        pushad
        xor eax, eax
        mov edi, eax
        mov ah, 07h
_debug:
        lodsb
        mov  [es:edi*2], al
        inc  dword [cursor]
        test al, al
        jnz  _debug
        xor eax,eax
        mov edi, eax
        popad
        iret

int_EOI:
         push ax
         mov  al, 20h
         out  020h, al
         out  0a0h, al
         pop  ax
         iret

global_catch_int:
         pop eax
         mov  esi, gp
         int  1
         iret
gp db ' GENERAL PROTECTION FAULT ',0
cursor dw 160

sys_timer_int:
       ; jmp int_EOI
        iret
keyboard_int:
        pushad
       ; mov ah, 07h
        mov  edi, dword [cursor]
        mov [es:edi*2], al
        inc  dword [cursor]
        popad
        jmp int_EOI
Nikolay2015 вне форума Ответить с цитированием
Старый 25.08.2017, 22:22   #13
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

У вас код весит 1015 байт. БИОС загружает в память только 1 сектор=512 байт.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.08.2017, 22:24   #14
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Так я же перехожу за первый бут сектор. На второй.
Код:
    times 0x1FE-finish+start db 0
    db 55h,0aah
Nikolay2015 вне форума Ответить с цитированием
Старый 25.08.2017, 22:27   #15
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Или ошибаюсь?
Но вывод на экран работал.(пока я не подключил таблицу IDT)
Nikolay2015 вне форума Ответить с цитированием
Старый 25.08.2017, 22:33   #16
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Nikolay2015
Цитата:
Сообщение от Nikolay2015 Посмотреть сообщение
Так я же перехожу за первый бут сектор. На второй.
times 0x1FE-finish+start db 0
db 55h,0aah
Это не переход, а заполнение нулями.
Вы должны с жёсткого диска используя int 13h загрузить нужный сектор. А после сделать jmp или call на нужный код.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.08.2017, 22:53   #17
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Да уж это жёстко всё. Придётся сейчас браться и читать про int 13h. А так спасибо за ответы. Как прочитаю про int 13h вернусь к вопросу прерываний.

Хоть это занятие и выглядит жутковато, но всё же это ОЧЕНЬ интересно.
Nikolay2015 вне форума Ответить с цитированием
Старый 25.08.2017, 23:01   #18
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А зачем мучиться загрузчиком?
Что мешает обкатать технологию COM файлом, в ближайшем DOSBox-е и лишь в конце уже тестировать "реально".
waleri вне форума Ответить с цитированием
Старый 25.08.2017, 23:05   #19
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Так как новичок. Не очень понимаю о чем вы. Можете объяснить?
Nikolay2015 вне форума Ответить с цитированием
Старый 26.08.2017, 09:19   #20
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Nikolay2015 Посмотреть сообщение
Да уж это жёстко всё
И не говори.
Написание загрузчика сродни вытягивания себя за волосы из болота. Если борон Мюнхгаузен проделывал это в болоте. То я бы добавил, что дело к тому же происходит на минном поле.

Многие ОСеписатели начиная писать ОС с загрузчика зависают на нём и так и не доходят до ядра.

Так вот предлагается кардинально упростить себе жизнь пропустив работу с загрузчиком. Попросту отказавшись от его написания.

1) Используем DOS для запуска нашего ядра. Просто создаём COM - файл, а дальше всё в ваших руках формально среда практически не чем не отличается от той которую вам даёт БИОС при загрузки MBR.Отличие только в входных параметрах. DOS загружает COM файлы размером до 64 КБ. И вместо org 0x7c00 пишем org 100h.
2) Используем Multiboot Specification. Её поддерживают многие загрузчики, но основным является Grub.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прерывания kolyan147 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 13.06.2012 23:55
прерывания lilek Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 14.12.2010 20:44
Прерывания alexdrew Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 16.05.2010 00:38
Прерывания Kn793 Общие вопросы Delphi 3 10.01.2009 18:43