2013-02-16 66 views
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 - $ +開始評估在這種情況下。 例如$ - $$ =程序的大小。 如果有人能向我解釋LODSB語法,它也會非常有趣。爲什麼在每個bpb和bs語句之後都有一個:sign?這個符號是否意味着新節的開始,就像本節目中的加載節或開始節一樣。 請詳細解釋如何評估答案。組裝中幾行的說明

謝謝。

回答

1

啊! 「THIS LINE」只爲「OEMNAME」保留空間。把你的操作系統的名字放在那裏,如果你喜歡 - 填充到11個字節。 ($$與「start」相同 - 在此例中爲0x7C00開頭)。

沒有太多的「語法」來lodsb,它只是一個指令...... http://home.myfairpoint.net/fbkotler/nasmdocc.html#section-A.4.141 (做我迷惑你使用「lodbs」作爲typoed指令的例子對不起?)

的「:」什麼都不做。如果一行上只有一個標籤,它會通知納斯姆它打算成爲一個標籤,而不是一個錯誤的指令。查看「orphan_label」手冊。如果沒有「:」,納斯姆將(可選 - 默認開)警告,但是無論如何,做正確的事情。

你真的應該有一個jmp startnop,因爲NASM將發出一個「短」 jmp(舊版本的NASM默認爲近jmp)。由於「THIS LINE」的全部目的是將剩餘的BPB變量放在正確的位置,所以不妨這麼做!

+0

非常感謝,但我希望更好地瞭解該聲明(本行)及其工作,如果可能的話一步一步來。請幫幫我。另外,OS名稱的最大大小是多少? – 2013-02-16 15:29:06

+0

而一步一步我的意思是我不明白什麼0bh - $ +開始評估。 0bh - ($ - start)可能是一種方法,但$是當前代碼行的地址,並且start被聲明爲1行,因此可能導致爲1.0bh(我不知道爲什麼這個隨機十六進制是那裏) - 1 =(以十六進制B爲11 - 1)10(十進制)。但是怎麼會產生11(我可能是錯的)。這是我想知道的。謝謝。 – 2013-02-16 15:59:04

+0

又爲什麼有11個字節?您的操作系統的名稱應該是8個字節長,對嗎? – 2013-02-16 16:15:46