【发布时间】:2015-09-12 18:03:18
【问题描述】:
我学习纯硬件(无操作系统)编程,但从闪存驱动器启动时遇到问题(使用金士顿 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; 磁盘操作软件:DiskProbe V 1.0(R. Eugene-Baucom,Microsoft)
请帮助我了解会发生什么。 非常感谢。
【问题讨论】:
-
把什么字符放到第一位?
-
它为C0h代码放置伪符号(单行边框表格的左下角)
-
@Ruslan 你的链接命令是什么样的?
-
@Ruslan :如果您不执行链接步骤,您使用什么
nasm命令来生成引导映像。由于您没有 ORG 语句,除非您另行通知链接器,否则它将为 0。我只是确保我知道这段代码的起点是什么。 -
嗨迈克尔,我不使用链接。在 Bochs 中运行的 nasm 命令是
nasm -fbin -dBOCHS boot.asm -o boot.bin对于实时硬件:nasm -fbin boot.asm -o boot.bin一点更新。昨天我买了一个 Segate 外置硬盘并用它尝试了相同的代码。它奏效了......我不想过早下结论(我的第一个代码也在闪存驱动器上工作)并且会进一步使用我的硬盘来看看它是否会继续工作
标签: assembly operating-system usb-flash-drive mbr