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.
您只需要至少简单地看一下整个代码。文件末尾有两行。512不会让你产生任何怀疑吗?
这里,带有时间的行用零到 512 字节完成了文件,下一行又添加了两个字节 - 结果是 514。要精确地得到 512,您需要将倒数第二行中的 512 更改为 510。或者删除最后一行。