0

私は壊れたthorn.comのO / S開発チュートリアルを読んでいますチュートリアルの1つで、次のコードがあります。

http://www.brokenthorn.com/Resources/OSDev3.html

このコードが 510 バイトをクリアする理由がわかりません。org、bits、cli、hlt もコード内にあります。510バイト未満に変更すべきではないでしょうか? タイプミスか何かでしょうか?

ありがとう。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;*********************************************
;   Boot1.asm
;       - A Simple Bootloader
;
;   Operating Systems Development Tutorial
;*********************************************
org 0x7c00  ; We are loaded by BIOS at 0x7C00

bits    16      ; We are still in 16 bit Real Mode

Start:

    cli ; Clear all Interrupts

    hlt ; halt the system

times 510 - ($-$$) db 0 ; We have to be 512 bytes. Clear the rest of the bytes with 0

dw 0xAA55   ; Boot Signiture
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4

2 に答える 2

1

510バイトをクリアするのではなく、バイトをクリアしてい510 - ($-$$)ます。$は現在の位置であり、セクションの開始であるため、バイト$$をクリアしています。510 - (length of the section up to that point)

これにより、ブロックは 512 バイトの制限から 2 バイトまで正しく埋められ、最後の 2 バイトに署名が付けられます。

于 2011-04-16T13:03:31.577 に答える
0

ブート セクタの長さは 512 バイトで、最後の 2 バイトが 0xAA55 に設定されていることで識別されます。これにより、ローダーの実際のコード用に 510 バイトが残ります。これは、提供された例がアセンブル時に埋められるものとまったく同じです。結果のバイナリが正確に 512 バイトの長さでない場合は、プレーン バイナリ出力形式を指定する必要があるかもしれませんが、nasm の場合はこれがデフォルト設定です。

実際には、パーティションテーブルなどのために存在する必要がある他のマジックバイトがあり、通常、最初のステージのローダーは、コードを読み込んで実行するだけの目的で使用されます。

于 2011-04-16T13:04:39.850 に答える