闪存驱动器上的主引导记录不起作用

时间:2015-09-12 18:03:18

标签: assembly operating-system usb-flash-drive mbr

我学习纯硬件(没有操作系统)编程,并且从闪存驱动器启动时遇到问题(使用金士顿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; (offlease); CPU:Intel Core i5 M520 2.40GHz 2核心; BIOS:Hewlett-Packard 68CCU Ver。 F.0D,14/07/2010(我不知道它是否更新); Compilator:NASM; 磁盘操作软件:DiskProbe V 1.0(R. Eugene-Baucom,Microsoft)

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

0 个答案:

没有答案