我正在尝试在汇编程序中编写一个简单的引导程序。
引导加载程序将扇区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的地址时,不会打印该消息。
答案 0 :(得分:2)
考虑bp
是16位,所以如果你使用 10000h 的 ORG ,任何偏移都不适合它。
我期待汇编程序发出警告但是快速测试显示不然。
还要记住,通常最好避免挑战BIOS,以为我不知道它是如何实际处理的,我会避免打印一个跨越两段的字符串。
由于您将es
置为零,因此请确保 ORG 最多为10000h-[msg_len]
,以便整个字符串可在es
内到达。