Форум   Статьи   Новости   Файлы   Bugtraq   Сниффер   Друзья   О Клубе
  , 21:01   #1
559
Форумчанин
 
Аватар для 559
 
Регистрация: 27.05.2010
Сообщений: 83

Репутация: 2 / 0
По умолчанию программирование mbr

Уважаемые, подкиньте плз сорсы/статьи/книги про создание mbr и вообще загрузочных программ. Чем проще и дубовей тем лучше
__________________
хакер - не преступник
взлом - ради искуcства
смысл - в свободе
Пользователь вне форума    
Наши Спонсоры
  , 21:04   #2
Местный
 
Локация: 127.0.0.1
Регистрация: 07.01.2011
Сообщений: 458

Репутация: 23 / 1
По умолчанию

Тут ты наверно уже был http://www.insidepro.com/kk/065/065r.shtml
Тут не знаю http://habrahabr.ru/blogs/asm/122699/
__________________
क्लेपटोमानीया से बिमार

Последний раз редактировалось ChernoHod; 01.10.2011 в 21:17.
Пользователь вне форума    
  , 21:18   #3
559
Форумчанин
 
Аватар для 559
 
Регистрация: 27.05.2010
Сообщений: 83

Репутация: 2 / 0
По умолчанию

спс, почитаем)
__________________
хакер - не преступник
взлом - ради искуcства
смысл - в свободе
Пользователь вне форума    
  , 12:37   #4
Местный
 
Локация: 127.0.0.1
Регистрация: 07.01.2011
Сообщений: 458

Репутация: 23 / 1
По умолчанию

Вот нашел у себя в коллекции еще кодес.Точно не помню где я его взял,вроде на ачате.


code:
USE16
;------------ загрузочный сектор ---------------------
        org     7C00h
EntryPoint:
        mov     ax, cs          ; ax = сегмент кода
        cli                     ; запрещаем прерывания, т.к. у нас еще ничего не настроено
        mov     ss, ax          ; зададим сегмент стека какойже как и сегмент кода
        mov     ds, ax          ; задаем сигмент данных такойже как и сегмент кода. т.е. всё в одном месте
        mov     es, ax          ;
        mov     sp, EntryPoint  ; зададим адрес старта программы как вершина стека
        sti                     ; разрешаем прерывания т.к. уже можно нормально с ними работать
        cld                     ; ставим флаг направления, что бы не было неопределенности

        push    dx              ; сохраним т.к. DL нужен будет


        mov     ax, 3           ; установим режим 80x25
        int     10h

        xor     dx, dx          ; X = 0, Y = 0
        mov     bx, 15          ; белый символ на черном фоне
        mov     ax, 1301h       ; AL = 1 (Передвигать курсор), AH = 13h (Вывод строки)
        mov     bp, BootMsg     ; задаем адрес нашего сообщения
        mov     cx, BootMsgEnd - BootMsg ; вычисляем длинну строки
        int     10h             ; выводим текст
        pop     dx              ; восстановим

        mov     ax, 9000h       ; задаем сегмент куда будем считывать данные
        mov     es, ax          ; 9000h:0000

        mov     ah, 2           ; читать сектор
        mov     al, (KernelEnd - KernelStartCode) / 512 ; вычисляем кол-во секторов отведенных под ядро
        xor     dh, dh          ; 0 головка
        mov     cx, 2h          ; CH = 0 (номер дорожки), CL = 2 (номер сектора)
        xor     bx, bx          ; BX = 0 - смещение куда кидать сектор.
        int     13h             ; считаем сектор

        jc      Error           ; если ошибка
        jmp     9000h:0000h     ; передаём управление на основной кода


Error:
        mov     ax, cs
        mov     es, ax          ; восстановим значение текущего сегмента
        mov     dx, 0100h       ; X = 0, Y = 1
        mov     bx, 15          ; белый символ на черном фоне
        mov     ax, 1301h       ; AL = 1 (Передвигать курсор), AH = 13h (Вывод строки)
        mov     bp, ErrorMsg    ; задаем адрес нашего сообщения
        mov     cx, ErrorMsgEnd - ErrorMsg ; вычисляем длинну строки
        int     10h             ; выводим текст

        xor     ax, ax          ; AH = 0 (ожидать нажатие)
        int     16h             ; ждем нажатие клавиши
        jmp     0FFFFh:0000h    ; reboot

;------------ данные загрузочного сектора--------------
BootMsg db "Boot Sector Loaded"
BootMsgEnd:

ErrorMsg db "Load Kernel Error", 13, 10, "Press any key to reboot"
ErrorMsgEnd:


TIMES   510-($-$$) DB 0         ; Заполняем оставшиеся пространство от 500 байт нулями
DW      0AA55h                  ; Сигнатура конца загрузочного сектора. Без неё BIOS пошлет нах.
;------------ ядро ---------------------
KernelStart:
        org     0h
KernelStartCode:
        jmp     KernelCode
;------ тут можно хранить данные -------
BootDisk DB ?
KernelMsg db "Kernel Started",13, 10, "Press any key to continue"
KernelMsgEnd:

;------ непосредственно ядро -------
; Вспомогательная функция которая грузит сектор по его номеру
; ax = номер сектора
; es:bx = куда поместить
ReadSectors:
        push    ax
        push    cx
        ; вычисляем головку, цилинд и сектор
        cwd
        mov     cx, 18
        div     cx
        mov     cx, dx
        inc     cx

        xor     dh, dh
        shr     ax, 1
        rcl     dh, 1

        mov     ch, al
        shl     ah, 4
        or      cl, ah

        mov     dl, [BootDisk]

        mov     ax, 0201h           ; читать сектор
        int     13h

        pop     cx
        pop     ax
        ret

KernelCode:
        ; es у нас и так правильный
        mov     [BootDisk], dl          ; запомин номер диска откуда грузились
        mov     dx, 0100h               ; X = 0, Y = 1
        mov     bx, 15                  ; белый символ на черном фоне
        mov     ax, 1301h               ; AL = 1 (Передвигать курсор), AH = 13h (Вывод строки)
        mov     bp, KernelMsg           ; задаем адрес нашего сообщения
        mov     cx, KernelMsgEnd - KernelMsg ; вычисляем длинну строки
        int     10h                     ; выводим текст

        xor     ax, ax                  ; AH = 0 (ожидать нажатие)
        int     16h                     ; ждем нажатие клавиши

        mov     ax, 13h                 ; AH = 0 (выбор режима) AL = 13h (320*200*8)
        int     10h                     ; включаем режим 320x200 256 цветов

        mov     ax, 0A000h              ;
        mov     es, ax                  ; ES = адресу видеобуфера

        xor     bx, bx                  ; BX = 0 - смещение куда кидать сектор.
        mov     ax, 2                   ; сектор где лежит картинка
m1:
        call    ReadSectors
        add     bx, 512
        inc     ax
        cmp     ax, 125
        jne     m1

;        add bx, 512
;        inc ax
;        cmp ax, 55
;        jne m1

;------------ закончили рисовать хрень -----------
        xor     ax, ax                  ; AH = 0 (ожидать нажатие)
        int     16h                     ; ждем нажатие клавиши

        jmp     0FFFFh:0000h            ; делаем программый ребут

;----------- вот тут вот у нас картинка )
  TIMES  0 - ($-KernelStart) mod 512 DB 0 ; выравниваем размер
KernelEnd:
   file 'pic.dat'
ЗЫ
Если с Ингнлишом ладиш то можно полазить тут http://board.flatassembler.net/forum.php?f=11
видел много чего по этой теме.
__________________
क्लेपटोमानीया से बिमार

Последний раз редактировалось ChernoHod; 06.10.2011 в 14:19.
Пользователь вне форума    
 

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Статья] Подробности процесса загрузки Linux ozs Linux 0 29.12.2010 15:29



Часовой пояс GMT +2
Powered by vBulletin® 3.x.x Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

Copyright © 2008 - 2013 «HPC» Реклама на сайте Правила Форума Пользовательское соглашение Работа на сайте
При копировании материалов ставьте ссылку на источник
Все материалы представлены только в ознакомительных целях, администрация за их использование ответственности не несет.