2015-09-12 37 views
0

我学习纯硬件(无操作系统)编程,并且从闪存驱动器引导时出现问题(使用金士顿DT101 G2 8Gb)。最初的代码,没有备份,我现在不能完全复制它,因为它:(在模拟器(最新的Bochs)和现场硬件上都工作得很好。之后增加了更多的功能性(转储输出子程序和加载闪存驱动器使用int 13h函数42h)在Bochs中完美工作,但在现场计算机上完全没有 - 计算机在尝试运行时重新启动 因此,我已经将代码简化为一种最简单的形式I曾在年初和修改段寄存器的初始化这是它看起来像现在:。闪存驱动器上的主引导记录不起作用

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)给出了“缺少操作系统...”消息。我尝试了不同的变化,但仍然无法完成这项工作,也无法弄清楚会发生什么。 这是一个闪存驱动器的问题? A可以回想,几个月前,我尝试了使用相同闪存模式的LinuxLive,并在4 - 5发布后停止引导。 这里我使用的是: 电脑型号:惠普EliteBook 8440p; (offlease); CPU:Intel Core i5 M520 2.40GHz 2核; BIOS:Hewlett-Packard 68CCU Ver。 F.0D,14/07/2010(我不知道是否更新); Compilator:NASM; 磁盘操作软件:DiskProbe V1.0(R.尤金鲍康,微软)

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

+0

它放入第一个位置的是什么字符? –

+0

它为C0h代码(单行边界表的左下角)放置伪码符号 – Ruslan

+0

@Ruslan你的链接命令是什么样的? –

回答

0

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