(реальный режим nasm x86) Как записывать/читать строки в загрузочный сектор?

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

person jth    schedule 22.09.2018    source источник
comment
Проблема в том, что вы поместили весь код для первого и второго сектора в один файл сборки. Вы начинаете с исходной точки 0 в первом секторе (поскольку вы не указали директиву org и 0 используется по умолчанию). Это означает, что все метки, начинающиеся с nextSector, начинаются не со смещения 0x000, как ожидает ваш код, а со смещения 512.   -  person Michael Petch    schedule 23.09.2018
comment
Вы можете разделить два файла сборки на первый и второй сектор, чтобы org (точка начала) была равна 0 в каждом файле. Если вам нужно все в одном файле, вы можете просмотреть разделы с vstart адресом 0. Вы можете прочитать об этом в документы NASM в разделе 7.1.3 Поддержка многосекционного формата для формата bin   -  person Michael Petch    schedule 23.09.2018
comment
Также на втором этапе вам нужно будет в первую очередь убедиться, что вы устанавливаете DS в значение new (или 0x500), чтобы вы читали из нужного сегмента памяти, где код в nextSector был физически загружен.   -  person Michael Petch    schedule 23.09.2018
comment
Спасибо за быстрые ответы! Не могли бы вы указать мне правильное направление для разделения на один сектор на файл? Как скомпилировать два файла в один загрузочный бинарник?   -  person jth    schedule 23.09.2018
comment
Хорошо, если вы хотите сделать это одним файлом, как вы, это может помочь: capp-sysware.com/misc/stackoverflow/52461308/boot.asm . В Stackoverflow есть примеры для загрузчиков, выполненных в двух файлах, которые используют программу dd для сборки двух частей в один двоичный файл. Вы должны быть в состоянии найти некоторые с помощью поиска. Однако единственная проблема заключается в том, что если вы разделите их, вы не сможете легко сослаться на переменную bootStr в первом файле со вторым.   -  person Michael Petch    schedule 23.09.2018
comment
Хорошо, большое спасибо за помощь! Я потрачу еще немного времени на это с информацией, которую вы предоставили.   -  person jth    schedule 23.09.2018
comment
@MichaelPetch Я адаптировал ваш файл boot.asm для своего реального проекта, и он отлично работает! Большое спасибо!   -  person jth    schedule 23.09.2018
comment
@MichaelPetch Я разместил дополнительный вопрос: stackoverflow.com/q/52463695/10402025 Если у вас есть время/желание Я был бы очень признателен, если бы вы взглянули на него. Спасибо еще раз!   -  person jth    schedule 23.09.2018