(nasm x86 real mode) Как писать / читать строки в загрузочном секторе? - PullRequest
0 голосов
/ 23 сентября 2018

Я использую 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, или я просто не могучитать / распечатывать его?
  • Как мне это исправить, чтобы я мог писать / читать / распечатывать строки в загруженном секторе?
...