如何使用 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
内可达。
我正在尝试用汇编语言编写一个简单的引导加载程序。
引导加载程序将扇区 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
内可达。