Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузчик - как написать? Проблема с излишним весом 
:(
    Опции темы
BNPmaster
Дата 17.9.2006, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 4.7.2006

Репутация: нет
Всего: нет



Народ помогите кто-нибудь!
Вот такое дело. В институте по лабораторной
нужно написать собственный загрузчик.
Целый день промаился и вот что в итоге получилось

MODEL tiny
.CODE
ORG 100h
Start: 
    jmp Start1
    ORG 7c00h ;------------------------------------ броблема
    Start1:
        jmp Begin
        db 'bootsect'
        SectSize    dw    00200h
        ClustSize    db    001h
        ResSecs    dw    00001h 
        FatCnt        db    002h
        RootSiz    dw    000E0h
        TotSecs    dw    00B40h
        Media        db    0F0h
        FatSize    dw    00009h
        TrkSecs    dw    00012h
        HeadCnt    dw    00002h
        HidnSec    dw    00000h

    Begin:
    MOV DX, OFFSET message 
    MOV AH, 9
    INT 21h
    INT 20h
    message: db 'Hello,world!$',0
end Start

Компилируется и запускается это всё отлично, однако после компоповки COM файл
весит около 30Kb (загрузочный сектор вмещает 512 байт). Это происходит из-за использования дерективы ORG, которая увеличивает счётчик,
до 07с00h. Насколько я понимаю, ассемблер помещает все данные между точкой входа 100h и 07с00h 
в конечный модуль. Вот собственно и вопрос - как объяснить Ассемблеру, что этого делать не надо.
Сама деректива ORG 07c00h важна, поскольку именно по этому адресу BIOS помещает
информацию из загрузочного сектора 

Заранее Thanks.
PM MAIL   Вверх
Akina
Дата 17.9.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Сначала напиши загрузчик, располагающийся с 0:7C00h, скомпили его, отруби лишнее и преврати в блок инструкций DB.
Потом напиши загрузчик загрузчика, который выполняет копирование блока данных в адрес 0:7C00h и передачу туда управления, а в блок данных помести код загрузчика в bin-виде.

Если не понял - декомпилируй бут-сектор загрузочной ДОС-дискеты. Там делается именно так.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Damarus
Дата 18.9.2006, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: нет
Всего: 29



BNPmaster, твой код работать не будет. Вот пример на FASM'е:
Код

use16

    jmp   start
    nop
        
    db 'bootsect'              ;;  OEM name and version
    dw 512                     ;;  Bytes per sector
    db 1                       ;;  Sectors per allocation unit
    dw 1                       ;;  Reserved sectors, starting at 0
    db 2                       ;;  Number of FATs
    dw 224                     ;;  Number of root-directory entries
    dw 2880                    ;;  Total sectors in logical volume
    db 240                     ;;  Media descriptor byte
    dw 9                       ;;  Number of sectors per FAT
    dw 18                      ;;  Sectors per track
    dw 2                       ;;  Number of heads
    dd 0                       ;;  Number of hidden sectors
    dd 0                       ;;  Total sectors in logical volume
    db 0                       ;;  Physical drive number
    db 0                       ;;  Reserved
    db 41                      ;;  Extended boot signature record
    dd 0                       ;;  32-bit binary volume ID
    db '           '           ;;  Volume label
    db 'FAT12   '              ;;  Reserved

start:
    mov ax, cs
    mov ds, ax
    
    mov si, 7C00h + HelloWorld
    
    xor bx, bx
    mov ah, 0Eh
@@:
    lodsb
    cmp al, '$'
    jz @f
    int 10h
    jmp @b
@@:
    jmp $
    
HelloWorld db 'Hello World!','$'
    
    repeat (510 - $) 
        db 0 
    end repeat
    
    db 0x55, 0xAA
    
;;    repeat (1474560 - $) 
;;        db 0 
;;    end repeat

PM MAIL ICQ Jabber   Вверх
Akina
Дата 18.9.2006, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Примечание: код может работать не как в 0:7C00h, а также и как 07C0h:0 - при этом код можно писАть непосредственно в теле программы с org 0. Или можно его исполнятиь как в 07B0h:100h, тогда код пишешь в org 100h и компиляешь в СОМ-файл, получая СРАЗУ образ бут-сектора.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0730 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.