0

我学习纯硬件(无操作系统)编程,但从闪存驱动器启动时遇到问题(使用金士顿 DT101 G2 8Gb)。初始代码,没有备份,我现在无法完全复制它:(,在模拟器(最新的 Bochs)和实时硬件上都可以正常工作。之后添加了更多功能(转储输出子例程和加载使用 int 13h 的功能 42h 的闪存驱动器中的扇区)在 Bochs 中完美运行,但在实时计算机上完全无法运行 - 计算机在尝试运行时重新启动。所以,我已将代码简化为我拥有的一种最简单的形式在开始和修改的段寄存器初始化。这是现在的样子:

load_address equ 0x7c00                     ;was used earlier but not now, just keeping it if anything

use16                                       ;we start in real mode
bootloader_start:
cli

;setting up the segments
xor ax, ax
mov ss, ax
mov sp, 0x7c00
push word 0x7c0
pop ds
push ds
push word continue
retf

continue:
sti

;copying CS into video memory to check it value (blue background)
mov ax, 0xb800
mov es, ax
mov ax, cs
push ax
mov ah, 0x17
mov [es:0], ax
pop ax
mov al, ah
mov ah, 0x17
mov [es:2], ax


;infinit loop
jmp short $



current_tty_address:        ;was used earlier
dw 0

boot_drive_number:          ;was used earlier
db 0

padding:
;padding to sector size - 2
times 510-($-$$) db 0
dw 0xaa55                   ;mbr identifier

;if comipling for Bochs, padding to hard disk image size (flat mode,   10Mb)
%ifdef BOCHS
padding2:
times 512 * (17 * 4 * 306 - 1) db 0
%endif

但这不能正常工作。它将一个字符放在第一个屏幕位置 (0, 0),但下一个位置只是黑色(但至少应该有蓝色背景,不管字符代码是什么)。此外,写在不同大小的闪存驱动器(金士顿 DT101 G2,32Gb)上的相同代码会给出“缺少操作系统...”消息。我尝试了不同的变体,但仍然无法完成这项工作,也无法弄清楚会发生什么。这是闪存驱动器的问题吗?可以回想一下,几个月前我用相同的闪存模型尝试了 LinuxLive,在 4 到 5 次启动后它就停止了启动。这里我用的是:电脑型号:HP EliteBook 8440p;(脱售);CPU:英特尔酷睿 i5 M520 2.40GHz 2 核;BIOS:惠普 68CCU 版本。F.0D, 14/07/2010(不知道有没有更新);编译器:NASM;

请帮助我了解会发生什么。非常感谢。

4

1 回答 1

0

这是我非常愚蠢的错误......因为当在磁盘探测器的物理驱动器列表中看不到任何内容时,我没有猜测以管理员身份运行磁盘探测器,而是从逻辑卷列表中进行选择。因此,该工具写入活动分区的扇区 0,而不是写入整个驱动器的扇区 0。这与硬盘完美配合,但我使用的两个闪存驱动器都出现了问题(BIOS 和 Windows + Disk Probe 在分区表处理中的不兼容可能或类似的东西)。所以,幸运的是问题很简单。感谢大家的努力。

于 2015-09-19T15:56:53.250 回答