2015-09-12 35 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 +磁盤探針在分區表處理可能或類似的東西不兼容)。 所以幸運的是這個問題很簡單。感謝大家的努力。