我學習純硬件(無操作系統)編程,並且從閃存驅動器引導時出現問題(使用金士頓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.尤金鮑康,微軟)
請幫我理解發生了什麼。 非常感謝。
它放入第一個位置的是什麼字符? –
它爲C0h代碼(單行邊界表的左下角)放置僞碼符號 – Ruslan
@Ruslan你的鏈接命令是什麼樣的? –