Я не уверен, что формулировка вопроса сбивает с толку или пример кода.Если вы хотите создать образ ПЗУ / BIOS 32 КБ, в котором точка входа смещена в 0x7FF0, но код и данные находятся в этом образе раньше, вы можете сделать что-то вроде:
bits 16
; Assume BIOS code/data is loaded into memory at the beginning
; of some unspecified segment and all references are relative
; to offset 0x0000
org 0x0000
start:
; Insert BIOS code and data here
hlt
; Pad BIOS image from beginning of section ($$) to 32KiB-16
TIMES 32*1024-16-($-$$) db 0x00
; Emit the bootstrap JMP
bios_entry:
jmp start
; Pad BIOS image to 32KiB
TIMES 16-($-bios_entry) db 0x00
Предполагается, что ПЗУ 32 КБОбраз / BIOS помещается в некоторый неопределенный сегмент реального режима, где все ссылки относятся к началу этого сегмента.Метка start
может быть размещена в любом месте изображения (кроме последних 16 байтов), необязательно в начале.
Нередко такого рода действия выполняются в BIOS, где выполняется начальная загрузкабыл помещен в последний абзац (16 байт) изображения.
Собрать в bios.bin
с:
nasm -f bin bios.asm -o bios.bin
Размер файла должен быть ровно 32768 байт (32 КБ).hexdump bios.bin
должен привести к файлу, который содержит это:
0000000 00f4 0000 0000 0000 0000 0000 0000 0000
0000010 0000 0000 0000 0000 0000 0000 0000 0000
*
0007ff0 0de9 0080 0000 0000 0000 0000 0000 0000
0008000