为什么我的裸机hello世界代码无法在x86_64中启动

问题描述 投票:1回答:1

我正在做一个hello world项目,以便在我的x86裸机上运行,但是代码没有运行(引导),并且机器继续执行下一个引导设备的操作,我用汇编语言编写了代码,以下步骤是我所做的:

步骤1:通过Bios呼叫显示字符A和B的代码

.L1 :
mov %ah,0x0E     
mov %bh,0x00     
mov %bl,0x07     
mov %al,65   
INT $0x10    

mov %ah,0x0E     
mov %bh,0x00     
mov %bl,0x07     
mov %al,66   
INT $0x10   
jmp .L1

步骤2:

汇编代码并以二进制格式生成代码:

as -o Code Code.txt
objcopy -O binary Code binfile

步骤3:

打开HxD并显示汇编代码的二进制形式并填充它用零直到我填充它们的第一个512字节的最后两个字节55AA(十六进制)的样子:

enter image description here

第4步:

将图像复制到闪存:

dd bs=512 count=1 if=binfile of="\\.\e:"

((注意:我在Windows上使用dd)


  • 注:依赖于第一个扇区中的引导代码将显示两个字符的事实没有使用anu进一步的引导加载程序,这是我的第一个项目,因此我设法使其保持简单。

  • 不显示chacters,并且显示消息无效的可启动设备,该设备通常跳至下一个设备并启动Windows ..我在这里缺少什么?

assembly x86-64 bios att bare-metal
1个回答
1
投票

收集评论中讨论的一些问题:

  1. 每台x86机器都以16位real mode引导,因此引导代码必须为16位代码。您需要在源文件的顶部指定.code16以获得gnu来生成该文件。如果最终要在64位长模式下执行,则必须编写代码以进行模式切换。这在CPU手册中有详细记录,但是有点复杂。 (请注意,这样做之后,您将不再能够调用int 10h BIOS函数,因为它们也是16位代码。)

  2. 在AT&T汇编语法中,这是gnu默认使用的语法,将立即将0x0e加载到ah寄存器中被写为mov $0x0e, %ah。您的版本会将%ah的内容存储到您不需要的存储位置0x0e中。这几乎适用于代码中的每条指令。但是您可能想改为使用其他汇编器,例如nasm,该汇编器更适合处理16位代码。

  3. 主引导记录(硬盘的零扇区)应该包含磁盘的分区表,从偏移量446开始。您的磁盘中仅包含零。在某种意义上,这无关紧要,因为您的代码永远不会尝试从磁盘读取任何内容,但是它可能会导致您的BIOS决定MBR无效并且磁盘不可引导。

  4. 我不相信您的dd命令实际上正在写入磁盘的主引导记录。它可能改为写入其分区之一的引导扇区。我对dd for windows不太熟悉,因此您需要自己进行解决。

我不确定您的问题是否是由这些问题之一或其他原因引起的,但无论如何最终还是要修复它们。

© www.soinside.com 2019 - 2024. All rights reserved.