【问题标题】:assembly - How to boot kernel that is appended end of kernel?程序集 - 如何引导附加在内核末尾的内核?
【发布时间】:2015-08-31 03:01:56
【问题描述】:

我正在尝试在程序集引导加载程序/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 位。

【问题讨论】:

  • 这个用法我不熟悉,但是需要设置BH(页面)和BL(颜色)吗?
  • 不,我写的时候没有页面也没有颜色。
  • 您正在读取扇区 2 到 0000:0000!
  • 由于 int 13h 的错误,它似乎在循环。能不能把返回值发送到串口看看为什么会失败?
  • 怎么做,@donjuedo?

标签: assembly kernel nasm 16-bit mbr


【解决方案1】:

从您的上一条评论中,我无法弥补您替换了哪个 mov bx, 0x0000 来解决问题。这是解决方案:

mov bx, 0x0000
mov es, bx
mov bx, 0x7E00

您应该在 BIOS 报告错误时中止,而不是冒险进行无休止的重试! 最好有消息。

幸运的是,您是在模拟环境中完成所有这些操作,否则玩弄第一个硬盘 (mov dl, 0x80) 绝不是一个好主意。

【讨论】:

  • 基于此答案,从 BIOS 调用代码时注意 dl 中的值是明智的。这将告诉您系统启动的驱动器可以为您节省大量的痛苦和故障排除......它可能不是 0x80。
  • 我应该将 dl 的值保存到变量中吗??
猜你喜欢
  • 2021-10-12
  • 2021-02-28
  • 2014-10-24
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2020-09-10
  • 2016-02-09
相关资源
最近更新 更多