NASM内存无法正确访问?

时间:2015-06-15 20:17:20

标签: memory assembly x86 nasm bootloader

所以我试图在实模式下使用NASM打印一个简单的hello world字符串。正如您可能通过组织0000:7C00定义的那样,它是一个测试引导加载程序。出于某种原因,“Hello World”未正确打印。尝试使用VirtualBox和真实硬件。

当跑步时,它最终打印出一堆随机的形状和图形,与真实字母没有任何相似之处,更不用说“Hello World”了。我认为它与我的段寄存器没有正确设置有关,因为我注意到移动MESSAGE的定义改变了正在打印的值。我看了这个问题:

Simple NASM "boot program" not accessing memory correctly?

但我的问题没有答案,我确实将ds设置为0.任何想法是怎么回事?

另外值得注意的是,我正在将它编译成平面二进制文件。它最后打印'L'的原因是我知道在它工作之前应该打印的所有东西。或者,我想在这种情况下,没有。

BITS 16

org 0x0000:7C00

start:
        mov ax, 0
        mov ds, ax
        mov es, ax
        mov fs, ax
        mov gs, ax

        mov ss, ax ;Puts 0 into the segment pointer, we are using real memory.
        mov sp, 0000:7C00 ;Moves 7C00 into the stack pointer, so that all data <7C00 is stack.

        call print_string ;Calls print string.
        jmp Exit


;Prints the test string for now.
print_string:

        mov si, MESSAGE

    .nextChar:

        mov ah, 0x0E
        mov al, [si]
        cmp al, 0x0
        je .end

        int 10h
        add si, 1
        jmp .nextChar
    .end:
        ret


    MESSAGE db "Hello world!", 0

Exit:
    mov ah, 0x0E
    mov al, 'L'
    int 10h  


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

1 个答案:

答案 0 :(得分:1)

尝试这样做才能真正停止程序,而不是在最后一次 int 10h 之后执行垃圾

Exit:
mov ah, 0x0E
mov al, 'L'
int 10h

EndlessLoop:
jmp EndlessLoop