Я пытаюсь сделать простой загрузчик, но сталкиваюсь с проблемами с ld (я думаю).
Когда я компилирую свой файл сборки (ниже) с помощью nasm -f bin
, он работает, и я получаю хороший 512-байтовый файл. Для этого я добавляю org 0x7c00 вверху, и все работает как положено.
Однако сейчас я пытаюсь сделать что-то более сложное и связать ядро C (неясно, нахожусь ли я на правильном пути, но я уверен, что скоро это узнаю). В любом случае, когда я компилирую его с nasm -f elf -o loader_elf bootloader.asm
и связываю его с i386-elf-ld loader_elf -o loader_exe -Ttext 0x7C00
, я получаю файл размером 4196 байт (с файлом эльфа 1152 байта).
Что мне нужно сделать для файла elf или ld, чтобы получить исполняемый файл с правильным размером файла?
Спасибо за вашу помощь!
Вот этот файл:
bits 16 ; 16-bit Real Mode
;org 0x7c00 ; BIOS boot origin... only used for bin, not elf
global _start
Message db "Starting YADBL", 0x0
jmp _start ;Jump to start main() entry-point
;Print characters to the screen
Println:
lodsb ;Load string
or al, al
jz complete
mov ah, 0x0e
int 0x10 ;BIOS Interrupt 0x10 - Used to print characters on the screen via Video Memory
jmp Println ;Loop
complete:
call PrintNwL
;Prints empty new lines like '\n' in C/C++
PrintNwL:
mov al, 0 ; null terminator '\0'
stosb ; Store string
;Adds a newline break '\n'
mov ah, 0x0E
mov al, 0x0D
int 0x10
mov al, 0x0A
int 0x10
ret
;Reboot the Machine
AToHalt:
call GetPressedKey
; Inputted key is in al
cmp al, 'A'
jne rbt
; We got an A!!!
; mov si, Halting
; call Println
cli
hlt
rbt:
ret ; we're returning, not rebooting
;Sends us to the end of the memory
;causing reboot
;db 0x0ea
;dw 0x0000
;dw 0xffff
jmp 0xffff:0000h ; also restarts
;Gets the pressed key
GetPressedKey:
mov ah, 0
int 0x16 ;BIOS Keyboard Service
ret
;Bootloader entry-code
_start:
cli ;Clear interrupts
;Setup stack segments
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
sti ;Enable interrupts
;Print the first characters
mov si, Message
call Println
call AToHalt
times 510 - ($-$$) db 0 ;Fill the rest of the bootloader with zeros
dw 0xAA55 ;Boot signature