读取一个扇区以寻址零
Read a sector to address zero
%include "init.inc"
[org 0x0]
[bits 16]
jmp 0x07C0:start_boot
start_boot:
mov ax, cs
mov ds, ax
mov es, ax
load_setup:
mov ax, SETUP_SEG
mov es, ax
xor bx, bx
mov ah, 2 ; copy data to es:bx from disk.
mov al, 1 ; read a sector.
mov ch, 0 ; cylinder 0
mov cl, 2 ; read data since sector 2.
mov dh, 0 ; Head = 0
mov dl, 0 ; Drive = 0
int 0x13 ; BIOS call.
jc load_setup
lea si, [msg_load_setup]
call print
jmp $
print:
print_beg:
mov ax, 0xB800
mov es, ax
xor di, di
print_msg:
mov al, byte [si]
mov byte [es:di], al
or al, al
jz print_end
inc di
mov byte [es:di], BG_TEXT_COLOR
inc di
inc si
jmp print_msg
print_end:
ret
msg_load_setup db "Loading setup.bin was completed." , 0
times 510-($-$$) db 0
dw 0xAA55
我想将 setup.bin 加载到内存地址零。因此,我将 0 值输入到 es 寄存器 (SETUP_SEG = 0)。 bx,也是。但它没有用。那么,我有一个关于这个问题的问题。我的测试如下。
SETUP_SEG的值
0x0000:失败
0x0010:成功
0x0020:失败
0x0030:失败
0x0040:失败
0x0050:成功
我不明白为什么会出现这种情况。所有测试均在 VMware 上进行。有人有想法吗?
我不确定这是否是你的问题,但你试图在 Real Mode IVT(中断向量 Table)中加载 setup.bin
。 IVT 包含每个中断的位置,因此我假设您的 boatloader 在将 setup.bin
加载到内存中时正在覆盖它们!中断可能是偷偷摸摸的和棘手的,因为它们 可以 被调用,即使你 没有 调用它们。您覆盖的任何中断向量在调用时可能会导致未定义的行为,将导致一些问题。
我建议将 SETUP_SEG
设置为更高的数字,例如 0x2000 或 0x3000,但您可以 安全地 设置的最低值是 0x07E0。 Osdev Wiki and Wikipedia 有一些关于常规内存和内存映射的有用信息。
希望对您有所帮助!
%include "init.inc"
[org 0x0]
[bits 16]
jmp 0x07C0:start_boot
start_boot:
mov ax, cs
mov ds, ax
mov es, ax
load_setup:
mov ax, SETUP_SEG
mov es, ax
xor bx, bx
mov ah, 2 ; copy data to es:bx from disk.
mov al, 1 ; read a sector.
mov ch, 0 ; cylinder 0
mov cl, 2 ; read data since sector 2.
mov dh, 0 ; Head = 0
mov dl, 0 ; Drive = 0
int 0x13 ; BIOS call.
jc load_setup
lea si, [msg_load_setup]
call print
jmp $
print:
print_beg:
mov ax, 0xB800
mov es, ax
xor di, di
print_msg:
mov al, byte [si]
mov byte [es:di], al
or al, al
jz print_end
inc di
mov byte [es:di], BG_TEXT_COLOR
inc di
inc si
jmp print_msg
print_end:
ret
msg_load_setup db "Loading setup.bin was completed." , 0
times 510-($-$$) db 0
dw 0xAA55
我想将 setup.bin 加载到内存地址零。因此,我将 0 值输入到 es 寄存器 (SETUP_SEG = 0)。 bx,也是。但它没有用。那么,我有一个关于这个问题的问题。我的测试如下。
SETUP_SEG的值
0x0000:失败
0x0010:成功
0x0020:失败
0x0030:失败
0x0040:失败
0x0050:成功
我不明白为什么会出现这种情况。所有测试均在 VMware 上进行。有人有想法吗?
我不确定这是否是你的问题,但你试图在 Real Mode IVT(中断向量 Table)中加载 setup.bin
。 IVT 包含每个中断的位置,因此我假设您的 boatloader 在将 setup.bin
加载到内存中时正在覆盖它们!中断可能是偷偷摸摸的和棘手的,因为它们 可以 被调用,即使你 没有 调用它们。您覆盖的任何中断向量在调用时可能会导致未定义的行为,将导致一些问题。
我建议将 SETUP_SEG
设置为更高的数字,例如 0x2000 或 0x3000,但您可以 安全地 设置的最低值是 0x07E0。 Osdev Wiki and Wikipedia 有一些关于常规内存和内存映射的有用信息。
希望对您有所帮助!