Я хочу сделать простой загрузчик с нуля.Я хочу, чтобы он мог загружаться по USB на недавнем ноутбуке, то есть он имеет загрузку UEFI, но теоретически он поддерживает загрузку Legacy.
Поэтому я написал небольшой ассемблерный код, который просто печатает «hello world», искомпилировал его с помощью nasm -f bin boot.asm -o boot.com Затем я собрал дискету из двоичного файла с помощью dd.Дискета работала нормально с qemu-system-x86_64.Я перенес его в MBR флешки, отформатированной как FAT32, используя dd if = boot.bin из = / dev / sda.Но при загрузке на нем с моего последнего компьютера USB не отображается в загрузочных устройствах.
Я попытался: - загрузить его на Qemu (с помощью qemu-system-x86_64 -hdb / dev / sda) успешно - загрузите его на действительно старый компьютер с процессором Intel Pentium 4, и все заработало как положено.- включите устаревший режим в настройках BIOS - отключите безопасную загрузку - загрузите его на другом компьютере, где флешка появляется в загрузочных устройствах, но ничего не печатается.
Я нашел его в Интернете, поэтому сборка должнабыть правильным
;; A tiny, working bootloader for x86 PCs. Has a few subroutines
;; so it's slightly less useless than just printing "hello world".
;;
;; writeup here: http://joebergeron.io/posts/post_two.html
;;
;; Joe Bergeron, 2016.
;;
bits 16
mov ax, 07C0h
mov ds, ax
mov ax, 07E0h ; 07E0h = (07C00h+200h)/10h, beginning of stack segment.
mov ss, ax
mov sp, 2000h ; 8k of stack space.
call clearscreen
push 0000h
call movecursor
add sp, 2
push msg
call print
add sp, 2
cli
hlt
clearscreen:
push bp
mov bp, sp
pusha
mov ah, 07h ; tells BIOS to scroll down window
mov al, 00h ; clear entire window
mov bh, 07h ; white on black
mov cx, 00h ; specifies top left of screen as (0,0)
mov dh, 18h ; 18h = 24 rows of chars
mov dl, 4fh ; 4fh = 79 cols of chars
int 10h ; calls video interrupt
popa
mov sp, bp
pop bp
ret
movecursor:
push bp
mov bp, sp
pusha
mov dx, [bp+4] ; get the argument from the stack. |bp| = 2, |arg| = 2
mov ah, 02h ; set cursor position
mov bh, 00h ; page 0 - doesn't matter, we're not using double-buffering
int 10h
popa
mov sp, bp
pop bp
ret
print:
push bp
mov bp, sp
pusha
mov si, [bp+4] ; grab the pointer to the data
mov bh, 00h ; page number, 0 again
mov bl, 00h ; foreground color, irrelevant - in text mode
mov ah, 0Eh ; print character to TTY
.char:
mov al, [si] ; get the current char from our pointer position
add si, 1 ; keep incrementing si until we see a null char
or al, 0
je .return ; end if the string is done
int 10h ; print the character if we're not done
jmp .char ; keep looping
.return:
popa
mov sp, bp
pop bp
ret
msg: db "Oh boy do I sure love assembly!", 0
times 510-($-$$) db 0
dw 0xAA55
Я хочу иметь возможность загрузить USB на моем последнем компьютере с процессором i7-8550U и совместимым с UEFI / Legacy.На данный момент флешка не отображается в загрузочных устройствах.
РЕДАКТИРОВАТЬ: Спасибо за ваши ответы!Я попытался установить блок параметров Bios (BPB), добавив этот фрагмент кода:
ORG 0
BITS 16
jmp near start
db "MYBOOT "
dw 512
db 1
dw 1
db 2
dw 512
dw 65535
db 0xf8
dw 20
dw 63
dw 16
dd 0
dd 0
db 0x29
dd 0xffff
db 0
db 0
db "NO NAME "
db "FAT32 "
start:
blablabla (see above)
, и теперь на рабочем столе Ubuntu появляется USB-флешка (я заметил, что он исчезнет, если я использую что-то еще, кроме'jmp near start', как 'jmp short start') Но он все еще не хочет появляться в моем меню загрузки BIOS. Я действительно не знаю, почему он не хочет видеть его в данный момент.У меня биос версии F.23, может есть какой нибудь особенный способ сделать это с этим биосом?