Задать вопрос

Как заставить GCC (i686) генерировать реальный 16-битный код без использования EAX, ECX и т. д.?

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+.
  • Вопрос задан
  • 66 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Фронтенд-разработчик
    11 месяцев
    Далее
  • Skillfactory
    DevOps-инженер
    6 месяцев
    Далее
  • SF Education
    Бизнес-аналитик
    11 месяцев
    Далее
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега GCC
Седой и строгий
Пригласить эксперта
Ответы на вопрос 1
15432
@15432
Системный программист ^_^
И чем вы возмущены? Все вхождения eax, ecx и прочего - ошибки парсинга дизассемблером, весь код 1:1 как вы написали
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы