Makefile:
# Makefile
METAL=-m16 -nostdlib -ffreestanding
all: prepare
i686-elf-as Bootloader.asm -o Build/Objects/Bootloader.o
i686-elf-ld Build/Objects/Bootloader.o -o Build/Binaries/Bootloader \
-Ttext 0x7C00 --oformat binary
i686-elf-gcc -c Main.c -o Build/Objects/Main.o $(METAL)
i686-elf-gcc -c Modules/*.c $(METAL) \
&& mv *.o Build/Objects/Modules
i686-elf-ld Build/Objects/Main.o Build/Objects/Modules/* -o Build/Binaries/Main \
-Ttext 0x7E00 --oformat binary
dd if=/dev/zero of=Build/Floppy.img \
bs=1K count=360
dd if=Build/Binaries/Bootloader of=Build/Floppy.img conv=notrunc
dd if=Build/Binaries/Main of=Build/Floppy.img \
seek=1 conv=notrunc
clean:
-rm -r Build/{Objects,Binaries}
scrub:
-rm -r Build
run:
qemu-system-x86_64 -fda Build/Floppy.img
prepare:
mkdir -p Build
mkdir -p Build/{Objects,Binaries}
mkdir -p Build/Objects/Modules
dump:
tree || find .
echo
cat Makefile
cat Bootloader.asm
cat Main.c
cat Modules/*
edit:
zed . || $VISUAL .
Bootloader.asm
# Bootloader.asm
.code16
.globl boot
boot:
movb $0, %ah
movb $0x13, %al
int $0x10
movb $0x2, %ah
movb $0x2, %al
movw $0x7E00, %bx
movb $0, %ch
movb $2, %cl
int $0x13
jc error
ljmp $0, $0x7E00
error:
movb $0, %ah
movb $3, %al
int $0x10
movb $0xE, %ah
movb $'E', %al
int $0x10
cli
hlt
.org 510
.word 0xAA55
Вот чем я возмущён
~/Documents/Projects/Toucan $ make
~/Documents/Projects/Toucan $ i686-elf-objdump -d Build/Objects/Bootloader.o
Build/Objects/Bootloader.o: file format elf32-i386
Disassembly of section .text:
00000000 <boot>:
0: b4 00 mov $0x0,%ah
2: b0 13 mov $0x13,%al
4: cd 10 int $0x10
6: b4 02 mov $0x2,%ah
8: b0 02 mov $0x2,%al
a: bb 00 7e b5 00 mov $0xb57e00,%ebx
f: b1 02 mov $0x2,%cl
11: cd 13 int $0x13
13: 72 05 jb 1a <error>
15: ea .byte 0xea
16: 00 7e 00 add %bh,0x0(%esi)
...
0000001a <error>:
1a: b4 00 mov $0x0,%ah
1c: b0 03 mov $0x3,%al
1e: cd 10 int $0x10
20: b4 0e mov $0xe,%ah
22: b0 45 mov $0x45,%al
24: cd 10 int $0x10
26: fa cli
27: f4 hlt
...
1fc: 00 00 add %al,(%eax)
1fe: 55 push %ebp
1ff: aa stos %al,%es:(%edi)
Не смотря на то что я чётко указал
-m16!
А опция
-march поддерживает только 386+.