В настоящее время я использую gnu as
(часть binutils и ассемблер, используемый для gcc), и я успешно собираю 16-битный код сборки со следующим:
as <file>
ld --oformat binary -Ttext 0x0 -e start <file>
с моими сборочными файлами, начинающимися с:
.code16
.globl start
.text
start:
, поскольку его обычный двоичный файл пропускает строки,
.globl start
start:
просто выдаст предупреждение, хотя плоские двоичные файлы не нуждаются в точке входа.
что-то я выучил трудным путем;
-Ttext 0x0
критично, в противном случае сегмент .text
выходит за пределы 16-битного диапазона адресации (не спрашивайте меня, почему)
Лично я все еще изучаю ассемблер, так что это только мой путь, не обязательно лучший.
РЕДАКТИРОВАТЬ: Если вы пишете загрузочный код, вы должны изменить
-Ttext 0x0
до
-Ttext 0x7c00
это сместит ваши адреса памяти на 0x7c00
, поскольку загрузочный код обычно загружается в 0x7c00
BIOS.