我正在创建自定义MBR,该MBR必须加载存储在接下来的32个扇区中的应用程序,除加载应用程序外,其他所有功能都可以正常工作,我不知道自己在做什么错,所以如果有人知道如何解决它,请帮帮我。
html, body{
min-height: 100%;
height: 100%;
}
.fill{
height: calc(100vh - 100px);
}
body {
padding-top: 60px; /* space for the top nav bar */
margin-right: 30px;
}
#appBuckets {
overflow: auto;
width: 100%;
height: calc(100vh - 150px);
}
#forgeViewer {
width: 100%;
}
.myAwesomeToolbarButton {
background-image: url(img/icon.png);
background-size: 24px;
background-repeat: no-repeat;
background-position: center;
}
答案 0 :(得分:3)
主要问题是,在致电int 0x13, ah = 0x02
时,您需要在dl
中读取设备的设备编号。 BIOS会在dl
中将您引导的设备号提供给您,但是代码会覆盖它(之前的mov dx, 0x184F
),因此您要从完全不同的设备(可能不存在)。
还有多个其他问题。段寄存器未正确设置(例如,mov ax,ds
而不是mov ds,ax
),并且未正确设置(应在使用段之前完成,例如在{{1}之前) }段由代码中的ds
指令用来打印字符串)。您不能仅仅假设mov al,[si]
在不检查错误的情况下就可以工作(并且如果有错误,您应该显示漂亮的“最终用户可读”错误消息,使用户有希望弄清楚他们可以做什么)解决问题)。
最后有一个概念上的问题。对于分区设备(硬盘驱动器,USB闪存等),MBR要做的主要事情是从活动分区启动操作系统的引导加载程序(不应将MBR视为任何特定操作系统的一部分,操作系统的引导代码开始以及操作系统分区的第一个扇区)。对于未分区的设备(软盘),出于各种原因(因此其他操作系统不会认为该磁盘是未格式化的,因此BIOS认为该磁盘对“ USB闪存”等各种特殊情况有效),则需要BPB(BIOS参数块)仿真软盘”和“可启动CD仿真软盘”)。
更新
是的,这个问题正在演变,上面的某些答案不再适用。当前的问题是:
int 0x13, ah = 0x02
在使用它的ds
指令使用前未设置mov [BOOT_DRIVE], dl
不正确。 BIOS启动代码时,它可以执行mov ax,cs
或jmp 0x0000:0x7C00
(或任意组合),因此未将jmp 0x07C0:0x0000
设置为已知值并将未知值加载到{{1 }}不会有太大帮助。cs
(紧接在ax
之后)未设置mov ax,ds
,而是使用BIOS恰好在mov ax,cs
中保留的值加载了ds
。我认为这条指令应该是ax
(根据使用的是哪种计算机/ BIOS,它可能会起作用,也可能不会起作用)ds
,mov ds,ax
和mov ax, ds
(紧随mov ax, es
标签之后)有相同的问题(应为mov ax, ss
,kernel:
和mov ds, ax