【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2018-10-11
      相关资源
      最近更新 更多