assembly - 如何启动附加在内核末尾的内核?
assembly - How to boot kernel that is appended end of kernel?
我正在尝试在程序集 bootloader/MBR 上启动我的程序集内核。
我正在将内核从偏移量 0x7e00 读取到内存中的偏移量 0x8000(扇区 1);和跳跃偏移量 0x7e00。为什么它不跳入我的内核?
; Boot.asm
[org 0x7c00]
[bits 16]
ReadDisk:
push ax
push bx
push cx
push dx
mov bx, 0x0000
mov es, bx
mov bx, 0x0000
mov ah, 0x02
mov al, 0x01
mov ch, 0x00
mov cl, 0x02
mov dh, 0x00
mov dl, 0x80
int 0x13
jc ReadDisk
jmp 0x7e00
times 510 - ($ - $$) db 0
dw 0xaa55
~~~~
; Kernel.asm
; Print dot on screen and hang
[org 0x7e00]
[bits 16]
mov ah, 0x0e ; BIOS teletype subfunction
mov al, '.'
int 10h
jmp $ ; hang
times 512 - ($ - $$) db 0 ; Fill sector.
环境:NASM,QEMU,Windows 7 64 位。
根据你最后的评论,我无法确定你更换了哪个 mov bx, 0x0000
来解决问题。这是解决方案:
mov bx, 0x0000
mov es, bx
mov bx, 0x7E00
与其冒无休止的重试风险,不如在 BIOS 报告错误时中止!
最好留言。
幸运的是,您是在模拟环境中完成所有这些操作,否则玩弄第一个硬盘 (mov dl, 0x80
) 绝不是一个好主意。
我正在尝试在程序集 bootloader/MBR 上启动我的程序集内核。 我正在将内核从偏移量 0x7e00 读取到内存中的偏移量 0x8000(扇区 1);和跳跃偏移量 0x7e00。为什么它不跳入我的内核?
; Boot.asm
[org 0x7c00]
[bits 16]
ReadDisk:
push ax
push bx
push cx
push dx
mov bx, 0x0000
mov es, bx
mov bx, 0x0000
mov ah, 0x02
mov al, 0x01
mov ch, 0x00
mov cl, 0x02
mov dh, 0x00
mov dl, 0x80
int 0x13
jc ReadDisk
jmp 0x7e00
times 510 - ($ - $$) db 0
dw 0xaa55
~~~~
; Kernel.asm
; Print dot on screen and hang
[org 0x7e00]
[bits 16]
mov ah, 0x0e ; BIOS teletype subfunction
mov al, '.'
int 10h
jmp $ ; hang
times 512 - ($ - $$) db 0 ; Fill sector.
环境:NASM,QEMU,Windows 7 64 位。
根据你最后的评论,我无法确定你更换了哪个 mov bx, 0x0000
来解决问题。这是解决方案:
mov bx, 0x0000
mov es, bx
mov bx, 0x7E00
与其冒无休止的重试风险,不如在 BIOS 报告错误时中止! 最好留言。
幸运的是,您是在模拟环境中完成所有这些操作,否则玩弄第一个硬盘 (mov dl, 0x80
) 绝不是一个好主意。