Вопрос NASM относительно непустого файла bin - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь сгенерировать небольшой двоичный файл для эмуляции BIOS, так как мне нужно, чтобы первый код операции находился в определенном месте, я ожидаю, что файл будет по крайней мере такого размера, но он генерирует тольконебольшое количество байтов.

У вас есть специальный синтаксис для генерации пустого пространства, обучающий исходный код операции?

Я вставляю небольшой код из 4 строк, чтобы показать мою точку зрения, он генерирует только3-байтовый двоичный файл

org 0x7FF0
    jmp start

start:
    hlt

генерирует

0000000 00eb 00f4                              
0000003

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я не уверен, что формулировка вопроса сбивает с толку или пример кода.Если вы хотите создать образ ПЗУ / 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
0 голосов
/ 22 февраля 2019
    TIMES 0x7FF0 db 0
    jmp start
start:
    hlt

Это создаст файл размером 0x7FF3 байта , но Я искренне сомневаюсь, что это будет полезно.Если вы планируете читать этот файл, так что jmp start попадает на линейный адрес 0x00007FF0, вы перезапишите все важные данные в памяти, такие как таблица векторов прерываний, переменные BIOS, ...

Если вам нужнопервый код операции, который должен быть в определенном месте, просто загрузите небольшой 3-байтовый файл по этому конкретному адресу.
Если вы используете функцию BIOS LoadSector, вам может потребоваться расширить код для заполнения полного 512-байтового сектора:

    jmp start
start:
    hlt
    TIMES 512-3 db 0

Затем загрузите его в ES:BX, равном 0x07FF: 0x0000`.

...