如何使用ORG地址>为0xFFFF?

时间:2016-04-02 15:41:12

标签: nasm real-mode

我正在尝试在汇编程序中编写一个简单的引导程序。 引导加载程序将扇区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的地址时,不会打印该消息。

1 个答案:

答案 0 :(得分:2)

考虑bp是16位,所以如果你使用 10000h ORG ,任何偏移都不适合它。
我期待汇编程序发出警告但是快速测试显示不然。

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