NASM关于非空bin文件的问题

NASM question regarding non-empty bin file

我正在尝试生成一个小的二进制文件来模拟 BIOS, 因为我需要第一个操作码位于特定位置,所以我希望文件的大小至少为该位置,但它只生成少量字节。

您是否有生成空 space 训练初始操作码的特定语法?

我粘贴了一个 4 行的小代码,以表明我的观点,它只生成一个 3 字节的二进制文件

org 0x7FF0
    jmp start

start:
    hlt

它生成

0000000 00eb 00f4                              
0000003
    TIMES 0x7FF0 db 0
    jmp start
start:
    hlt

这将生成一个 0x7FF3 字节的文件但是我真的怀疑它是否有用。如果您计划读取此文件,使 jmp start 位于线性地址 0x00007FF0,您将覆盖内存中的所有重要内容,如中断向量 table、BIOS 变量,...

如果您需要第一个操作码位于特定位置,只需在该特定地址加载 3 字节的小文件。
如果您使用 BIOS LoadSector 函数,您可能希望扩展代码以填充完整的 512 字节扇区:

    jmp start
start:
    hlt
    TIMES 512-3 db 0

然后在 ES:BX 处加载它等于 0x07FF:0x0000`。

我不确定是问题的措辞令人困惑还是代码示例。如果你想创建一个 32KiB ROM/BIOS 图像,其中入口点偏移 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

假设 32KiB ROM/BIOS 图像放置在某个未指定的实模式段,其中所有引用都相对于该段的开头。标签 start 可以放在图像中的任何位置(最后 16 个字节除外),不一定要放在开头。

在 bootstrap 被放置在映像的最后一段(16 字节)中的 BIOS 中,这种类型的事情并不少见。

Assemble 到 bios.bin 与:

nasm -f bin bios.asm -o bios.bin

文件应该正好是 32768 字节 (32KiB)。 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