Assembly (nasm x86实模式)如何在引导加载扇区中写入/读取字符串?
出于教育目的,我正在使用NASM为x86实模式编写一个最小的操作系统。我想使用512字节的引导扇区加载一个更大的扇区,该扇区包含操作系统的其余部分。我已经成功创建了一个加载另一个扇区的引导扇区,但我似乎无法在加载的扇区中写入/读取字符串。这是我的密码:Assembly (nasm x86实模式)如何在引导加载扇区中写入/读取字符串?,assembly,x86,operating-system,nasm,real-mode,Assembly,X86,Operating System,Nasm,Real Mode,出于教育目的,我正在使用NASM为x86实模式编写一个最小的操作系统。我想使用512字节的引导扇区加载一个更大的扇区,该扇区包含操作系统的其余部分。我已经成功创建了一个加载另一个扇区的引导扇区,但我似乎无法在加载的扇区中写入/读取字符串。这是我的密码: bits 16 mov ax, 0x7c0 mov ds, ax jmp code ;; Write bootStr to boot sector. bootStr db "AAA" cod
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上)跑步时:
我得到:
Booting from Hard Disk...
A CA
所以它看起来像是在我希望看到的B
的地方打印了一些看不见的字符
我不明白的是,为什么从加载的扇区,我可以用mov BYTE[di]'C'
将字符写入nextStr
,然后打印它们,但我似乎无法用db
定义nextStr
,然后打印它的字符。几个小时后,我没能解决这个问题
问题:
从一开始就没有使用nextStr
编写过,还是我根本无法读取/打印它db
- 我应该如何解决这个问题,以便在加载的扇区中写入/读取/打印字符串
org
指令,默认为0)。这意味着所有从nextSector
开始的标签不是从代码期望的0x000偏移开始的,而是从512偏移开始的。您可以将第一个扇区和第二个扇区的两个程序集文件拆分,以便每个文件中的org
(原点)为0。如果您想将所有内容都放在一个文件中,您可以使用vstart
地址为0的节来查看。您可以在第7.1.3节“bin格式的多节支持”中了解这一点。在第二阶段,您需要确保您首先要做的事情之一是将DS设置为值new
(或0x500)因此,您可以从内存中正确的部分读取nextSector上的代码。好的,非常感谢您的帮助!我将用你提供的信息在这方面花更多的时间。@MichaelPetch我为我的实际项目修改了你的boot.asm
文件,它工作得非常好!非常感谢你!
Booting from Hard Disk...
A CA