Этот ответ основан на опыте и обоснованном предположении. Тестировать без реального оборудования довольно сложно. Я предполагаю, что OP записывает свой загрузочный сектор в MBR, а не в VBR.
За долгие годы были созданы BIOS, которые были глупыми и умными (некоторые слишком умными, ИМХО). Некоторые пытаются различить носитель, которым может быть дисковод гибких дисков или жесткий диск, на основе наличия блока параметров 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
В случае успешного размещения на носителе этот код должен напечатать:
Привет, мир!
person
Michael Petch
schedule
18.12.2018