Написание загрузчика ОС на ассемблере (AT&T)

Пытаюсь написать загрузчик для операционки через транслятор YASM на ассемблере с синтаксисом AT&T. При использовании транслятора GNU, код спокойно читается как загрузочный, через YASM не работает подобным образом, просто не читается как загрузочный. Как это исправить?

.code16
#.global _start

_start:     # Начальная функция
    mov $0x03, %ax      # Очистка экрана
    int $0x10
    mov $str_hello, %bx # Вывод приветственной строки
    call _puts
    mov $string_1, %bx  # Вывод строки "выбора цвета"
    call _puts

    jmp loop1       # Для избежания loop2

    loop2:          # Метка для вывода строки в случае неправильного символа
    mov $wrong_string, %bx
    call _puts

    loop1:          # Метка для запроса символа и проверки
    movb $0x00, %ah     # Считываем символ
    int $0x16       # Ожидание ввода (ASCII код - в регистре al)

    cmpb $0x30, %al     # Переход если ASCII код меньше или равно чем 48 ('0')
    jbe loop2
    cmpb $0x37, %al     # Переход если ASCII код больше или равно чем 55 ('7')
    jae loop2
    
        mov $0x03, %ax  # Очистка экрана
        int $0x10

    call _inf_loop
    



_puts:      # Функция вывода строки (для передачи строки < mov $string, %bx >)
    movb 0(%bx), %al
    test %al, %al
    jz end_puts
    movb $0x0e, %ah 
        
        #mov $0x1E, %bl

    int $0x10
    addw $1, %bx
    jmp _puts

    end_puts:       # Перевод курсора на новую строку и конец работы функции
    mov $0x0a, %al      # смена строки на нижнюю    
    int $0x10
    mov $0x0d, %al      # возврат каретки
    int $0x10
    ret

# ==============================================================


_inf_loop:  # Перевод процессора в бесконечный цикл
    hlt
    jmp _inf_loop

str_hello: .asciz   "<><><>  Welcome!  <><><>"      # Проверочная строка
string_1: .asciz    "Press: 1-green, 2-blue, 3-red, 4-yellow, 5-gray, 6-white"
wrong_string: .asciz    "Wrong symbol!"             # Если неверный символ введен

.zero (512 -(. - _start) - 2)   # Заполнение нулями 
.byte 0x55, 0xAA

Команды, для запуска через GNU: as --32 -o loader.o loader.asm ld -Ttext 0x7c00 --oformat binary -m elf_i386 -o loader.bin loader.o qemu -fda loader.bin через YASM: yasm -p gas -f bin -o loader.tmp loader.asm dd bs=31744 skip=1 if=loader.tmp of=loader.bin qemu -fda loader.bin


Ответы (1 шт):

Автор решения: Scanel

Указание адреса загрузки кода (0x7c00) в случае GNU транслятора указывается в командной строке, в то время как для YASM должна быть прописана строчка в начале файла .org 0x7c00

Возможно помимо того, что _ надо убрать у _start

→ Ссылка