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

А как Вы это так его компилируете что у Вас файл больше сектора получился?
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов
-
- Сообщения: 51
- ОС: mandriva 2007 pp+
Re: Собственный загрузчик
компилил под виндой командой
nasmw.exe -fbin boot.asm -o boot.bin
mess_pm.asm nasmw.exe -fbin mess_pm.asm -o mess_pm.bin
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
внимание к каждой составляющей определяет качество вцелом
-
- Сообщения: 14
Re: Собственный загрузчик
-
- Сообщения: 14
Re: Собственный загрузчик
Я не поняла, так вы знаете асм или нет?
frenzy писал(а): ↑01.07.2008 12:41nasmw.exe -fbin boot.asm -o boot.bin
Код: Выделить всё
incbin 'mess_pm.asm'
Это вы что хотели сделать-то?