(nasm x86实模式)如何在引导加载的扇区中写入/读取字符串?

时间:2018-09-22 22:14:13

标签: assembly x86 operating-system nasm real-mode

我正在使用NASM为教育目的编写用于x86实模式的最小操作系统。我想使用512字节的引导扇区加载包含操作系统其余部分的更大扇区。我已经成功创建了一个可以加载另一个扇区的引导扇区,但是似乎无法在加载的扇区内写入/读取字符串。这是我的代码:

    bits 16

    mov ax, 0x7c0
    mov ds, ax

    jmp code

    ;; Write bootStr to boot sector.
    bootStr db "AAA"

code:   

    ;; for int 0x10
    mov ah, 0x0e

    ;; Print first char of bootStr.
    mov di, bootStr
    mov BYTE al, [di]
    int 0x10    ; prints A

    ;; Load next sector.
    ;; adapted from:
    ;; https://blog.benjojo.co.uk/post/interactive-x86-bootloader-tutorial
    mov ah, 0x02
    mov al, 1   
    mov ch, 0    
    mov cl, 2    
    mov dh, 0   
    mov bx, new 
    mov es, bx  
    xor bx, bx
    int 0x13
    jmp new:0

    new equ 0x0500

    ;; Pad boot sector.
    times 510-($-$$) db 0 
    db 0x55
    db 0xaa

nextSector: 

    ;; for int 0x10
    mov ah, 0x0e

    ;; Try to print first char of nextStr (defined below).
    mov di, nextStr
    mov BYTE al, [di]
    int 0x10    ; should print B

    ;; Move 'C' into nextStr and print it.
    mov BYTE [di], 'C'
    mov BYTE al, [di]
    int 0x10    ; prints C

    ;; Print first char of bootStr again.
    mov di, bootStr
    mov BYTE al, [di]
    int 0x10    ; prints A

    hlt

    nextStr db "BBB"

当我跑步(在Debian Stretch上)时:

nasm -f bin -o boot.bin boot.asm
qemu-system-x86_64 boot.bin

我得到:

Booting from Hard Disk...
A CA

所以看起来我希望看到B的地方印有一些看不见的字符。

我不明白的原因是,为什么我可以从加载的扇区中使用nextStrmov BYTE [di] 'C'写入字符,然后打印它们,但是我似乎无法定义{{1} }和nextStr,然后打印其字符。几个小时后,我没有运气解决问题。

问题:

  • db最初是不是从未用nextStr书写的,还是我只是无法读取/打印它?
  • 如何解决此问题,以便可以在加载的扇区内写入/读取/打印字符串?

0 个答案:

没有答案