0
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 

现在的问题是我不太明白 TIMES 0bh-$+start 在这种情况下的评估结果。例如 $-$$ = 程序的大小。如果有人可以向我解释 LODSB 语法,那将是非常有益的。另外,为什么在每个 bpb 和 bs 语句之后都有一个 : 符号?: 符号不是表示新部分的开始吗,就像这个程序中的加载程序部分或开始部分一样。请详细解释以下如何评估答案。

谢谢。

4

1 回答 1

1

啊! “THIS LINE”只是为“OEMNAME”保留空间。如果您愿意,可以将您的操作系统的名称放在那里 - 填充到 11 个字节。($$ 与“开始”相同 - 部分的开头 - 0x7C00 - 在这种情况下)。

没有太多的“语法” lodsb,它只是一个指令...... http://home.myfairpoint.net/fbkotler/nasmdocc.html#section-A.4.141 (我是否混淆了你使用“lodbs”作为错字的例子指令?对不起。)

“:”绝对没有任何作用。如果一行中只有一个标签,它会通知 Nasm 它是一个标签,而不是一个拼写错误的指令。在手册中查找“orphan_label”。如果没有“:”,Nasm 将(可选 - 默认打开)发出警告,但无论如何都会做正确的事情。

你真的应该有一个nopafter jmp start,因为 Nasm 会发出一个“short” jmp(旧版本的 Nasm 默认为 near jmp)。既然“THIS LINE”的全部目的就是把剩下的BPB变量放在正确的地方,那不妨去做吧!

于 2013-02-16T13:24:22.170 回答