Собственный загрузчик (проблеммы с записью в MBR)

Модератор: Модераторы разделов

Аватара пользователя
frenzy
Сообщения: 51
ОС: mandriva 2007 pp+

Собственный загрузчик

Сообщение frenzy »

решил написать свой загрузчик (на ассемблере), но для начала хочу по тренироваться на готовых примерах, коих в сети навалом.
Вот возникла первая, может быть совсем ламерская проблемма, не могу записать откомпилированный загрузчик в mbr дискеты.
пробовал командой dd if=boot.bin of=/dev/sdc bs=512 но при этом записываются не 512б а весь файл.
как это можно сделать?
внимание к каждой составляющей определяет качество вцелом
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Собственный загрузчик

Сообщение Voice »

Добавить параметр count=1 ;)

А как Вы это так его компилируете что у Вас файл больше сектора получился?
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
frenzy
Сообщения: 51
ОС: mandriva 2007 pp+

Re: Собственный загрузчик

Сообщение frenzy »

компилил под виндой командой

nasmw.exe -fbin boot.asm -o boot.bin

Код:

[BITS 16] [ORG 0x7c00] _start: cli mov ax, cs mov ds, ax mov ss, ax mov sp, _start lgdt [gd_reg] in al, 0x92 or al, 2 out 0x92, al sti mov si, msg call kputs .loop: mov al, [control+3] test al,al jz .cont call read_record mov si, msg_read call kputs mov [proc_addr], long move_record call prot_call jmp .loop .cont: mov si, msg_jump call kputs mov [proc_addr], long prot_jump call prot_call ;; Завесим процессор hlt jmp short $ %define SIGNATURE 0xF0B0C ;; ---------------- device control ------------------- signature: dd SIGNATURE control: dd 0x01000002 ;;CL=$ CL - младшие шесть бит - номер сектора ;;CH=$+1 старшие два бита CL и CH - номер цилиндра (дорожки) ;;DH=$+2 DH - номер головки ;;AL=$+3 AL - количество секторов (в сумме не более одного цилиндра) destination: dd 0x9000 ;; address to place section next_record: dd 0x9000 ;; --------------------------------------------------- entry_point: dd 0x9010 device: dd 0 ;;DL=$ DL - номер диска (носителя). Например 0 - дисковод A: ;;---------------------------------------------------- read_record: mov [.errors_counter], byte 0 cmp [signature], long SIGNATURE je .start mov si, msg_giving_up_sig call kputs hlt jmp short $ .start: mov ax, 0x800 mov es, ax mov bx, 0 mov cx, [control] mov dh, [control+2] mov al, [control+3] mov ah, 0x02 int 0x13 jc .read_error ret %define MAX_READ_ERRORS 5 .errors_counter: db 0 .read_error: inc byte [.errors_counter] cmp byte [.errors_counter], MAX_READ_ERRORS jl .start mov si, msg_giving_up call kputs hlt jmp short $ kputs: .loop: lodsb test al, al jz .quit mov ah, 0x0E int 0x10 jmp short .loop .quit: ret msg: db "Startup..",0x0A,0x0D,0 msg_read: db "<=read<=",0x0A,0x0D,0 msg_jump: db "Jump..",0x0A,0x0D,0 msg_giving_up: db "Fatal: Too many errors",0x0A,0x0D, 0 msg_giving_up_sig: db "Fatal: Wrong record signature",0x0A,0x0D, 0 proc_addr: dd prot_jump ;; make a call in protected mode and return to real prot_call: pushf cli mov eax, cr0 or al, 1 mov cr0, eax jmp 0x8: _protected back: mov ax, cs mov ds, ax mov ss, ax popf ret [BITS 32] _protected: mov ax, 0x10 mov ds, ax mov ss, ax call [proc_addr] ;; Сброс бита PE регистра CR0 mov eax, cr0 and al, 11111110b mov cr0, eax jmp 0: back prot_jump: jmp [entry_point] move_record: ; В DS - адрес исходного сегмента ; В ES - адрес целевого сегмента mov ax, ds mov es, ax mov esi, 0x8000 ; source mov edi, [destination] ; Копируем [control+3] секторов по 512 байт xor eax, eax mov al, [control+3] test al, al jz .get_next ; this must never be shl eax, 7 ; *128 mov ecx, eax cld ; choose direction cmp esi, edi jz .get_next jg .copy std mov eax, ecx ; backward from the top dec eax shl eax, 2 add esi, eax add edi, eax .copy: rep movsd .get_next: mov esi,[next_record] test esi, esi jnz .load_record mov [control+3], byte 0 ret .load_record: mov edi, signature cld movsd ; signature movsd ; control movsd ; destination movsd ; next address ret gdt: dw 0, 0, 0, 0 ; Нулевой дескриптор db 0xFF ; Сегмент кода с DPL=0 db 0xFF ; Базой=0 и Лимитом=4 Гб db 0x00 db 0x00 db 0x00 db 10011010b db 0xCF db 0x00 db 0xFF ; Сегмент данных с DPL=0 db 0xFF ; Базой=0 и Лимитом=4Гб db 0x00 db 0x00 db 0x00 db 10010010b db 0xCF db 0x00 ;; Значение, которое мы загрузим в GDTR: gd_reg: dw 8192 dd gdt times 510-($-$$) db 0 db 0x55,0xAA incbin 'mess_pm.bin'


mess_pm.asm nasmw.exe -fbin mess_pm.asm -o mess_pm.bin

Код:

[ORG 0x9000] [BITS 32] signature: dd 0xF0B0C control: dd 0x02000003 destination: dd 0x200000 ; address to place section next_record: dd 0 mov esi, msg_hello call kputs mov esi, 0x200000 call kputs hlt jmp short $ cursor:dd 0 %define VIDEO_RAM 0xB8000 kputs: pusha .loop: lodsb test al, al jz .quit mov ecx, [cursor] mov [VIDEO_RAM+ecx*2], al inc dword [cursor] jmp short .loop .quit: popa ret msg_hello:db "Hello from the world of 32-bit Protected Mode ",0 times 512-($-$$) db 0 incbin 'mess_pm.asm' db 0 times 1536-($-$$) db 0
внимание к каждой составляющей определяет качество вцелом
Спасибо сказали:
Аватара пользователя
Lady
Сообщения: 14

Re: Собственный загрузчик

Сообщение Lady »

frenzy писал(а):
01.07.2008 12:18
как это можно сделать?

Надо просто

Код: Выделить всё

cp boot.bin /dev/fd
Спасибо сказали:
Аватара пользователя
Lady
Сообщения: 14

Re: Собственный загрузчик

Сообщение Lady »

frenzy писал(а):
01.07.2008 12:18
решил написать свой загрузчик (на ассемблере), но для начала хочу по тренироваться на готовых примерах, коих в сети навалом.

Я не поняла, так вы знаете асм или нет?

frenzy писал(а):
01.07.2008 12:41
nasmw.exe -fbin boot.asm -o boot.bin

Код: Выделить всё

incbin 'mess_pm.asm'

Это вы что хотели сделать-то?
Спасибо сказали: