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