Как уменьшить размер итогового бинарного файла
есть загрузчик под 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 шт):
У меня есть подозрения что дело в самом компиляторе, нежели в програме, так как явные приемы оптимизации никак не влияют на размер файла.
Нужно просто хотя бы бегло код просмотреть целиком. Вот две строки в конце файла. 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: