bits 16
org 0x7c00
start: jmp loader
;******; ; OEM Parameter block ;********;
TIMES 0Bh-$+start DB 0; THIS LINE
bpbBytesPerSector: DW 512
bpbSectorsPerCluster: DB 1
bpbReservedSectors: DW 1
bpbNumberOfFATs: DB 2
bpbRootEntries: DW 224
bpbTotalSectors: DW 2880
bpbMedia: DB 0xF0
bpbSectorsPerFAT: DW 9
bpbSectorsPerTrack: DW 18
bpbHeadsPerCylinder: DW 2
bpbHiddenSectors: DD 0
bpbTotalSectorsBig: DD 0
bsDriveNumber: DB 0
bsUnused: DB 0
bsExtBootSignature: DB 0x29
bsSerialNumber: DD 0xa0a1a2a3
bsVolumeLabel: DB "MOS FLOPPY "
bsFileSystem: DB "FAT12 "
;******** ; Bootloader Entry Point ;**********;
loader:
cli
hlt
times 510 - ($-$$) db 0
dw 0xAA55
现在的问题是我不太清楚在这种情况下什么时候0bh - $ + start评估。 例如$ - $$ =程序的大小。 如果有人能向我解释LODSB语法,那真是太好了。另外为什么在每个bpb和bs语句之后都有一个符号?不是:符号表示新部分的开头,就像本程序中的加载程序部分或启动部分一样。 请详细说明以下内容如何评估答案。
感谢。
答案 0 :(得分:1)
啊! “此线”仅为“OEMNAME”预留空间。如果您愿意,请将操作系统的名称放在那里 - 填充到11个字节。 ($$与“start”相同 - 部分的开头 - 在这种情况下为0x7C00)。
lodsb
没有多少“语法”,它只是一条指令......
http://home.myfairpoint.net/fbkotler/nasmdocc.html#section-A.4.141
(我是否因为使用“lodbs”作为错误教学的例子而混淆了你?抱歉。)
“:”绝对没有。如果一行上只有一个标签,它会告知Nasm它应该是一个标签,而不是一个错字指令。在手册中查找“orphan_label”。如果没有“:”,Nasm会(可选 - 默认开启)警告,但无论如何都会做正确的事。
你真的应该在nop
之后有一个jmp start
,因为Nasm会发出一个“短”jmp
(旧版本的Nasm默认为近jmp
)。由于“THIS LINE”的全部目的是将剩余的BPB变量放在正确的位置,不妨这样做!