Assembly (nasm x86实模式)如何在引导加载扇区中写入/读取字符串?

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

出于教育目的,我正在使用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上)跑步时:

我得到:

Booting from Hard Disk...
A CA
所以它看起来像是在我希望看到的
B
的地方打印了一些看不见的字符

我不明白的是,为什么从加载的扇区,我可以用
mov BYTE[di]'C'
将字符写入
nextStr
,然后打印它们,但我似乎无法用
db
定义
nextStr
,然后打印它的字符。几个小时后,我没能解决这个问题

问题:

  • nextStr
    从一开始就没有使用
    db
    编写过,还是我根本无法读取/打印它
  • 我应该如何解决这个问题,以便在加载的扇区中写入/读取/打印字符串

问题在于,您已将第一个和第二个扇区的所有代码放在一个程序集文件中。您从第一个扇区的原点0开始(因为您没有指定
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