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 的调用需要一个操作 inah和操作 in 的数据al

段寄存器不能直接加载,只能从寄存器加载,因此ax用作“临时变量”。

添加到基本堆栈指针的 288 个字节实际上根本不是字节。加载到段寄存器中的地址实际上是指向 16 字节块的指针,因此要将数字转换为其实际地址,请将其左移 4 位。这意味着地址 07C0h 实际上是指 7C00h,这是放置引导加载程序代码的位置。288 是十六进制的 120h,因此堆栈的实际位置实际上是 7C00h + 1200h = 8E00h。

此外,您可以使用“show”和“tell”之类的词,这很好,但最好通过设置sssp不是报告它的位置来定义堆栈......我希望这是有道理的。

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

加载0ehah设置int 10h功能Teletype output,它将字符打印al到屏幕上。

然后,您的.repeat循环将从text_stringinto加载每个字符al并调用int 10h.

于 2012-06-01T15:57:02.237 回答