我正在使用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'
写入字符,然后打印它们,但是我似乎无法定义{{1} }和nextStr
,然后打印其字符。几个小时后,我没有运气解决问题。
问题:
db
最初是不是从未用nextStr
书写的,还是我只是无法读取/打印它?