0

以下は、私が理解したいアセンブリコードです。このコードが nasm でアセンブルされた後、どのように 512 バイトが入力されますか?

ここでやる意味がまだよくわからない510-($-$$)から?$以下の$$コードの値は何ですか?

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

;***************************

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 Signature

;*********************
4

1 に答える 1

0

NASM マニュアルのセクション「3.5 式」から:

NASM は、式で 2 つの特別なトークンをサポートしており、計算に現在のアセンブリ位置を含めることができます: $ および $$ トークンです。$ は、式を含む行の先頭のアセンブリ位置に評価されます。JMP $ を使用して無限ループをコーディングできます。$$ は、現在のセクションの先頭に評価されます。そのため、($-$$) を使用してセクションのどこまで進んでいるかを知ることができます。

したがって、上記のコードは次のことを行います。

  1. 「cli」および「hlt」命令が N = $-$$ で何バイトかかるかを計算します。x86 プロセッサの場合、両方の命令がそれぞれ 1 バイトを使用するため、0x7C02-0x7C00=2 になります。
  2. (510-N) 0 バイトを予約します。508 バイトになる x86 プロセッサの場合。
  3. 2 バイトを取るワード 0xAA55 を予約します。

意図は、512 バイトのブロックを持つことです: N + ( 510 - N ) + 2 = 512

于 2013-11-05T06:12:31.030 に答える