(nasm x86 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,

Я не понимаю, почему из загруженного сектора я могу писать символы nextStr с mov BYTE [di] 'C' а затем распечатать их, но я не могу определить, nextStr с db а затем распечатайте его символы. После нескольких часов мне не повезло, что я решил проблему.

Вопросы:

  • Является nextStr никогда не писал с db во-первых, или я просто не могу прочитать / распечатать?
  • Как мне это исправить, чтобы я мог писать / читать / печатать строки в загруженном секторе?

0 ответов

Другие вопросы по тегам