【问题标题】:NASM question regarding non-empty bin file关于非空 bin 文件的 NASM 问题
【发布时间】:2019-07-15 16:31:10
【问题描述】:
我正在尝试生成一个小的二进制文件来模拟 BIOS,
由于我需要将第一个操作码放在特定位置,因此我希望文件的大小至少为该位置,但它只生成少量字节。
你有特定的语法来生成训练初始操作码的空格吗?
我贴了一个小的 4 行代码,为了说明我的观点,它只生成一个 3 字节的二进制文件
org 0x7FF0
jmp start
start:
hlt
它会生成
0000000 00eb 00f4
0000003
【问题讨论】:
标签:
assembly
x86
nasm
bios
【解决方案1】:
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`。
【解决方案2】:
我不确定是问题的措辞令人困惑还是代码示例。如果您想创建一个 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 个字节除外),不一定要放在开头。
在引导程序放置在映像的最后一段(16 字节)中的 BIOS 中,这种类型的事情并不少见。
组装到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