Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Загрузчик - как написать?


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

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.

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

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

Автор: Damarus 18.9.2006, 00:18
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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)