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