Как уменьшить размер итогового бинарного файла

есть загрузчик под BIOS, размер бинарного файла должен не привышать 512 байт, но как бы я не старался компилятор fasm постоянно выдает бинарник в 514 байт.

У меня есть подозрения что дело в самом компиляторе, нежели в програме, так как явные приемы оптимизации никак не влияют на размер файла.

код ниже.

;boot
org 7C00h

start:
    cli             ; interrupt     0
    xor ax, ax      ; ax            null 
    mov ds, ax      ; data seg      null
    mov es, ax      ; es            null
    mov ss, ax      ; stack seg     null
    mov sp, 07C00h  ; top stack     07C00h
    sti             ; interrupt     1
    
    mov ax, 0002h
    int 10h
    
    mov dx, 0h
    call setcur
    
    mov bp, loadmsg
    mov cx, 10
    call print          ;print load message
    
    add dh, 1           ; NEL
    call setcur
    mov bp, contmsg
    mov cx, 23
    call print          ;print continue message
    
    mov ah, 10h
    int 16h
continue:
    cmp al, 0Dh
    jz kernel
    jmp continue
kernel:
    mov ax, 0000h
    mov es, ax 
    mov bx, 500h
    mov ch, ah
    mov cl, 02h
    mov dh, ah
    mov dl, 80h
    mov al, 01h
    mov ah, 02h
    int 13h
    jmp 0000:0500h
;===========methods=========    
setcur:
    mov ah, 02h     ; 02h inter INT10
    xor bh, bh
    int 10h
    ret
print:
    mov bl, 04h
    mov ah, 13h   ; 13h inter INT10
    int 10
    ret
;============data===========
    loadmsg db 'os load', 0 
    contmsg db 'press enter to continue', 0
    
times(7C00h+512)-$ db 0
db 055h, 0AAh

комманда компилятору

fasm 00.asm boot.bin

его вывод

flat assembler  version 1.73.27  (16384 kilobytes memory)
2 passes, 514 bytes.

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

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

У меня есть подозрения что дело в самом компиляторе, нежели в програме, так как явные приемы оптимизации никак не влияют на размер файла.

Нужно просто хотя бы бегло код просмотреть целиком. Вот две строки в конце файла. 512 ни на какие подозрения вас не наводит?

times(7C00h+512)-$ db 0
db 055h, 0AAh

Тут строка с times добивает файл нулями до 512 байт, и следующая строка добавляет еще два байта — получается 514. Чтобы получилось ровно 512, нужно в предпоследней строке 512 поменять на 510. Либо убрать последнюю строку.

→ Ссылка
Автор решения: Алексей Дорбах

А ещё у вас ошибка вот тут - в ожидании нажатия Enter:

    mov ah, 10h
    int 16h
continue:
    cmp al, 0Dh
    jz kernel
    jmp continue
kernel:

Зацикливание происходит, но, поскольку значение в AL не меняется - получается вечный цикл, если нажать не Enter

Должно быть:

continue:
    mov ah, 10h
    int 16h
    cmp al, 0Dh
    jz kernel
    jmp continue
kernel:
→ Ссылка