Этот ответ основан на опыте и обоснованном предположении.Это довольно сложно проверить без реального оборудования.Я предполагаю, что OP записывает свой загрузочный сектор в MBR, а не VBR.
BIOS были созданы за эти годы, которые были глупыми и умными (некоторые слишком умные, IMHO).Некоторые пытаются различить носители, которые могут быть дисководами гибких дисков или жесткими дисками, основываясь на наличии блока параметров BIOS и / или таблицы разделов с загрузочным разделом.К сожалению, это не стандартизировано, и многие производители BIOS проверяют свой код только на дисках, разбитых на разделы Windows.
Некоторые BIOS, которые считают, что они видят действительную таблицу разделов, допускают эмуляцию жесткого диска и пытаются загрузить загрузочную запись тома (VBR).) из активного раздела, а не выполнять код в MBR.У меня есть подозрение, что это тот случай, когда машина все еще загружается, несмотря на обнуление кода и сохранение таблицы разделов.Выполненный код, вероятно, пришел непосредственно из VBR.
Если вы используете устройства, которые работают как жесткие диски (а не как дискеты), вы можете создать MBR с таблицей разделов, где единственный активный раздел начинается с началапривод (CHS = 0,0,1 или LBA = 0);помечен как загрузочный;и имеет ненулевой тип раздела.Если вы столкнулись с намерением компьютера загрузить VBR напрямую, этот метод обманул бы его загрузкой MBR как VBR.
Пример кода, который должен загружаться на ваш USB как жесткий диск на компьютерах, которые вы, похоже, тестируетеможет выглядеть так:
bits 16
org 0x7c00
boot_start:
xor ax, ax ; DS=0 since we use ORG 0x7c00. 0x0000<<4+0x7c00=0x7c00
mov ds, ax
mov es, ax
; If you will be reading data into memory outside of 0x7c00 to 0x7dff
; then you want to set the stack SS:SP - uncomment these lines
; mov ss, ax ; Stack at 0x0000:0x7c00
; mov sp, 0x7c00 ; Just below bootloader
cld ; Forward movement of string instructions
; (MOVSB, SCASB, etc)
mov si, HelloWorldMsg ; Print hello world
call print_string
end_loop: ; Loop forever to terminate
hlt
jmp end_loop
; Function: print_string
; Display a string to the console on display page 0
;
; Inputs: SI = Offset of address to print
; Clobbers: AX, BX, SI
print_string:
mov ah, 0x0e ; BIOS tty Print
xor bx, bx ; Set display page to 0 (BL)
jmp .getch
.repeat:
int 0x10 ; print character
.getch:
lodsb ; Get character from string
test al,al ; Have we reached end of string?
jnz .repeat ; if not process next character
.end:
ret
HelloWorldMsg: db "Hello, world!", 0x0d, 0x0a, 0
times 446-($-$$) db 0 ; Pad with 0s up until first partition entry
part1_entry:
db 0x80 ; 0x80 = Active boot partition, 0x00=inactive
db 0x00, 0x01, 0x00 ; CHS of first absolute sector (MBR) of hard drive
; Head=0, Sector=1, Cylinder=0
db 0x0c ; Partition type (has to be non-zero)
; 0x0c = Win 95 FAT32 (LBA)
db 0x00, 0x01, 0x00 ; CHS of last absolute sector (MBR) of hard drive
; Head=0, Sector=1, Cylinder=0
; We are effectively saying Size of partition is 1 sector
dd 0x0 ; LBA of first absolute sector (0=MBR)
dd 0x1 ; Number of sectors in partition. We set it to 1 but if you
; wish you could set it to the number of sectors on the disk
times 510-($-$$) db 0 ; Pad remainder of boot sector up to boot signature. This zeroes
; partition entries 2,3,4 effectively making them inactive
dw 0xAA55 ; The standard PC boot signature after partition table
Вы можете создать MBR с помощью:
nasm -f bin boot.asm -o boot.bin
При успешном размещении на носителе этот код должен напечатать:
Hello, мир!