Да, это возможно. Я не могу думать о хорошем использовании верхней части головы, хотя было бы легко придумать надуманный пример.
Я написал такой код как часть других ответов, но никогда не имел возможности представить простой тестовый комплект, на который можно ссылаться из других вопросов Stackoverflow. То, что вы просите, довольно тривиально. Это можно сделать, написав загрузчик в NASM, который содержит двоичный образ собранного кода, который вы хотите протестировать. Этот образ будет считываться с диска, начиная с LBA 1 (первый сектор после загрузчика), с использованием функции BIOS Int 13 / ah = 2 . Затем управление будет передано ему через FAR JMP на 0x0000: 0x7e00.
Код загрузчика будет выглядеть следующим образом:
bpb.inc :
%define WITH_BPB 1
global bpb_disk_info
jmp boot_start
TIMES 3-($-$) DB 0x90 ; Support 2 or 3 byte encoded JMPs before BPB.
bpb_disk_info:
; Dos 4.0 EBPB 1.44MB floppy
OEMname: db "mkfs.fat" ; mkfs.fat is what OEMname mkdosfs uses
bytesPerSector: dw 512
sectPerCluster: db 1
reservedSectors: dw 1
numFAT: db 2
numRootDirEntries: dw 224
numSectors: dw 2880
mediaType: db 0xf0
numFATsectors: dw 9
sectorsPerTrack: dw 18
numHeads: dw 2
numHiddenSectors: dd 0
numSectorsHuge: dd 0
driveNum: db 0
reserved: db 0
signature: db 0x29
volumeID: dd 0x2d7e5a1a
volumeLabel: db "NO NAME "
fileSysType: db "FAT12 "
boot.asm :
[ 111] Чтобы использовать это, вы бы сначала сгенерировали двоичный файл с именем stage2.bin
. Затем вы должны построить образ диска 1.44MiB с помощью этой команды:
nasm -f bin boot.asm -o disk.img
Код в stage2.bin
должен быть сгенерирован с допущением, что ORG (начальная точка) 0x07e00 в памяти. [1127 ]
Пример кода, сгенерированного для файла с именем stage2.bin
, который можно загрузить с помощью этого тестового набора:
testcode.asm [ 1139]:
ORG 0x7e00
start:
mov si, testCodeStr
call print_string
cli
.end_loop:
hlt
jmp .end_loop
testCodeStr: db "Test harness loaded and is executing code in stage2!", 0
; 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
Примечание : сверху есть ORG 0x7e00
. Это важно. Чтобы собрать этот файл в stage2.bin
, используйте:
nasm -f bin testcode.asm -o stage2.bin
Затем создайте образ диска 1.44MiB с:
nasm -f bin boot.asm -o disk.img
Результатом должен быть образ диска размером точно 1.44MiB, содержит копию stage2.bin
и загрузочный сектор нашего тестового жгута.
Файл stage2.bin
может быть любым, в который записан двоичный код для загрузки и запуска в 0x0000: 0x7e00. Язык (C, ассемблер и т. Д.), Используемый для создания кода в stage2.bin
, не имеет значения. Я использую NASM для этого примера. Когда этот тестовый код выполняется в QEMU с использованием qemu-system-i386 -fda disk.img
, он будет выглядеть примерно так:
Special Примечание: : Если вы не хотите использовать bpb.inc
и не собираетесь загружаться с USB с помощью эмуляции FDD, вы можете закомментировать или удалить эту строку в boot.asm
%include "bpb.inc"