汇编中的几行说明

时间:2013-02-16 04:24:10

标签: assembly nasm bootloader

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语句之后都有一个符号?不是:符号表示新部分的开头,就像本程序中的加载程序部分或启动部分一样。 请详细说明以下内容如何评估答案。

感谢。

1 个答案:

答案 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变量放在正确的位置,不妨这样做!