如何使用 ORG 地址 > 0xFFFF?

How to use ORG addresses > 0xFFFF?

我正在尝试用汇编语言编写一个简单的引导加载程序。 引导加载程序将扇区 2 从软盘复制到地址 0x5000 (segment 0x500, offset 0x0),跳转到该段并打印一条消息。

然而,当我将段地址更改为 0x1000 时,消息不再打印。我怀疑 org 0x10000 指令有问题,可能与分段有关。我也试了org 0x1000:0,但是打印不出来


这是我的引导加载程序代码,它被写入软盘的第一个扇区:

[BITS 16]
org 0x7C00

start:
    mov ah, 0x02 ; Read sectors from drive
    mov al, 1    ; Read 1 sector
    mov ch, 0    ; Cylinder 0
    mov cl, 2    ; Sector 2
    mov dh, 0    ; Head 0

    mov bx, sect2dest;
    mov es, bx
    mov bx, 0x0

    int 0x13
    jmp sect2dest:0;

data:
    sect2dest equ 0x500

最后的魔术标识符是由自定义链接脚本编写的,所以不用担心。


这是我的第二扇区,它应该打印一条消息:

[BITS 16]
org 0x5000

sect2:
        mov ah, 0x13
        mov al, 1
        mov bl, 0x17
        mov cx, msg_len
        mov dh, 0
        mov dl, 0
        mov bh, 0

        mov bp, 0
        mov es, bp
        mov bp, msg


        int 0x10

        jmp $

msg db 13,10,"Hello, World!"
msg_len equ $ - msg

如上所述,当我尝试将扇区 2 写入任何大于 0xFFFF 的地址时,没有打印消息。

考虑到 bp 是 16 位,所以如果您使用 ORG of 10000h 任何偏移量都不适合在里面。
我原以为汇编器会发出警告,但快速测试显示并非如此。

还请记住,通常最好避免挑战 BIOS,虽然我不知道它实际是如何处理的,但我会避免打印跨越两段的字符串。
由于您在 es 中输入零,请确保 ORG 最多为 10000h-[msg_len],以便整个字符串在 es 内可达。