2016-05-21 5 views
0

現在、特定のコードを理解しようとしています。私はここで見つける:開始ラベルの下
http://mikeos.sourceforge.net/write-your-own-os.htmlブートローダースタックを設定

具体的に最初の2行:

BITS 16 

start: 
    mov ax, 07C0h  ; Set up 4K stack space after this bootloader 
    add ax, 288  ; (4096 + 512)/16 bytes per paragraph 
    mov ss, ax 
    mov sp, 4096 

    mov ax, 07C0h  ; Set data segment to where we're loaded 
    mov ds, ax 


    mov si, text_string ; Put string position into SI 
    call print_string ; Call our string-printing routine 

    jmp $   ; Jump here - infinite loop! 


    text_string db 'This is my cool new OS!', 0 


print_string:   ; Routine: output string in SI to screen 
    mov ah, 0Eh  ; int 10h 'print char' function 

.repeat: 
    lodsb   ; Get character from string 
    cmp al, 0 
    je .done  ; If char is zero, end of string 
    int 10h   ; Otherwise, print it 
    jmp .repeat 

.done: 
    ret 


    times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s 
    dw 0xAA55  ; The standard PC boot signature 

のチュートリアルでは、「それらのラインが私たちのために本当に興味のあるではありません」と言うが、私は本当にたい知っている。だから "07C0h"とは何ですか?最初は、BIOSがブートローダーをロードするアドレスだと思っていましたが、私が読み込んだアドレスからは "7C00h"です。そして、これは "(4096 + 512)/段落ごとの16バイト"という意味ですか?私は "$$"が何であるか知りたい(私は "$"が何であるか知っている)。

答えて

2

はい、これはセグメントとして表されたアドレスです。リアルモードではphysical address = 16 * segment + offsetなので、物理アドレス7c00h7c0h:0と書くことができます(唯一の方法ではありません)。各段落は16バイトで、セグメントを1ずつ変更すると物理アドレスがその分だけ変更されます。ロードアドレスがインクリメントされるスタックの4096のバイトを取得する

4096のバイトに加え、次いで全部がセグメント値を得るために16で割って512バイトであるブートセクタのサイズは述べています。

$$は、現在のセクションの開始を示す特殊記号です。 nasm manualを参照してください。

PS:実行時にそれを行うする必要は本当にありませんが、コードは単にmov ax, 07C0h + 288または類似を使用することができます。

関連する問題