2

私は最近、オペレーティングシステム、ブートプロセス、およびNASMを調査しています。旅の途中で、仮想フロッピーディスクを介して部分的に理解し、テストした便利なブートストラップコードに遭遇しました。私の基本的な質問は、私が理解していないこれらの行のいくつかが何をするかということです。私はその行が何をしていると思うかについてコメントしました、そしてどんな訂正または確認も大いにありがたいです。

; This is NASM

        BITS 16                 ; 16 bits!

start:                          ; Entry point
        mov ax, 07C0h           ; Move the starting address (after this bootloader) into 'ax'
        add ax, 288             ; Leave 288 bytes before the stack beginning for some reason
        mov ss, ax              ; Show 'stack segment' where our stack starts
        mov sp, 4096            ; Tell 'stack pointer'  that our stack is 4K in size

        mov ax, 07C0h           ; Use 'ax' as temporary variable for setting 'ds'
        mov ds, ax              ; Set data segment to where we're loaded


        mov si, text_string     ; Put string position into SI (the reg used for this!)
        call print_string       ; Call our string-printing routine

        jmp $                   ; Jump here - infinite loop!

        text_string db 'This is my cool new OS!', 0 ; Our null terminated string
                                                    ; For some reason declared after use


print_string:                   ; Routine: output string in SI to screen
        mov ah, 0Eh             ; I don't know what this does..
                                ; Continue on to 'repeat'
.repeat:
        lodsb                   ; Get character from DS:SI into AL
        cmp al, 0               ; If end of text_string
        je .done                ; We're done here
        int 10h                 ; Otherwise, print the character (What 10h means)
        jmp .repeat             ; And repeat

.done:
        ret

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

ありがとう、

ジョー

4

2 に答える 2

1

あなたのコメントはおおむね正しいです。

mov ah,0Eh

これにより、BIOS割り込み呼び出しにパラメータが設定されます。

int 10h

詳細については、ここを参照してください。ただし、基本的に10hの呼び出しでは、の操作ahとの操作のデータが必要ですal

セグメントレジスタは直接ロードできず、レジスタからのみロードできるためax、「一時変数」として使用できます。

ベーススタックポインタに追加された288バイトは、実際にはまったくバイトではありません。セグメントレジスタにロードされるアドレスは、実際には16バイトブロックへのポインタであるため、数値を実際のアドレスに変換するには、4ビット左にシフトします。これは、アドレス07C0hが実際には7C00hを参照していることを意味します。これは、ブートローダーコードが配置されている場所です。288は16進数で120hであるため、スタックの実際の位置は実際には7C00h + 1200h=8E00hです。

また、「show」や「tell」などの言葉を使用することもできますが、スタックをどこにあるかを報告するのではなく、設定ssして定義することを検討する方がよいでしょうsp...それが理にかなっていると思います。

于 2012-06-01T16:44:08.710 に答える
0
 mov ah, 0Eh             ; I don't know what this does..

にロード0ehすると、文字を画面に出力するテレタイプ出力機能がah設定されます。int 10hal

次に.repeat、ループは各文字をからにロードtext_stringal、を呼び出しますint 10h

于 2012-06-01T15:57:02.237 に答える