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」用のスペースを予約するだけです。必要に応じて、そこに OS の名前を入力します - 11 バイトにパディングします。($$ は "start" - セクションの始まり - この場合は 0x7C00 - と同じです)。

への「構文」はあまりなくlodsb、単なる指示です... http://home.myfairpoint.net/fbkotler/nasmdocc.html#section-A.4.141 (タイプミスの例として「lodbs」を使用して混乱しましたか?指示?申し訳ありません。)

「:」はまったく何もしません。行にラベルだけがある場合、それは Nasm にそれがラベルであることを意図しており、タイプミスされた命令ではないことを知らせます。「orphan_label」のマニュアルを参照してください。Nasm は (オプションで - デフォルトはオン) ":" がない場合に警告しますが、とにかく正しいことを行います。

Nasmは "short" を出力するため、 after を使用する必要がnopあります (古いバージョンの Nasm ではデフォルトで Near が設定されていました)。「THIS LINE」の全体的な目的は、残りの BPB 変数を適切な場所に配置することなので、そうする方がよいでしょう。jmp startjmpjmp

于 2013-02-16T13:24:22.170 に答える