如何从部门加载应用程序?

时间:2018-10-19 19:14:39

标签: assembly nasm x86-16 bootloader

我正在创建自定义MBR,该MBR必须加载存储在接下来的32个扇区中的应用程序,除加载应用程序外,其他所有功能都可以正常工作,我不知道自己在做什么错,所以如果有人知道如何解决它,请帮帮我。

Victoria.asm

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;
}

1 个答案:

答案 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,csjmp 0x0000:0x7C00(或任意组合),因此未将jmp 0x07C0:0x0000设置为已知值并将未知值加载到{{1 }}不会有太大帮助。
  • cs(紧接在ax之后)未设置mov ax,ds,而是使用BIOS恰好在mov ax,cs中保留的值加载了ds。我认为这条指令应该是ax(根据使用的是哪种计算机/ BIOS,它可能会起作用,也可能不会起作用)
  • dsmov ds,axmov ax, ds(紧随mov ax, es标签之后)有相同的问题(应为mov ax, sskernel:mov ds, ax