关于非空bin文件的NASM问题

时间:2019-02-21 17:03:49

标签: assembly x86 nasm bios

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

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

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

SELECT "V_RELEASES_COMB"."ITEMNO",
       "V_RELEASES_COMB"."REV",
       "V_RELEASES_COMB"."DESCRIP",
       "V_RELEASES_COMB"."ORDERNO",
       "V_RELEASES_COMB"."PONO",
       "V_RELEASES_COMB"."RELEASE_QUAN",
       "V_RELEASES_COMB"."REQUEST_DATE",
       "V_RELEASES_COMB"."PROMISE_DATE",
       "V_RELEASES_COMB"."SHIP_DATE",
       "V_RELEASES_COMB"."CUSTNO",
       "V_RELEASES_COMB"."COMPANY",
       "V_RELEASES_COMB"."DAYS_DIFF",
       "V_RELEASES_COMB"."CUMM_SHIPPED",
       "V_RELEASES_COMB"."EPLANT_ID",
       "EPLANT"."COMPANY",
       "V_RELEASES_COMB"."ACTUAL_SHIPDATE"
FROM "IQMS"."V_RELEASES_COMB" "V_RELEASES_COMB"
     LEFT OUTER JOIN "IQMS"."EPLANT" "EPLANT" ON "V_RELEASES_COMB"."EPLANT_ID" = "EPLANT"."ID"
WHERE "V_RELEASES_COMB"."SHIP_DATE" > 01 / 01 / 2018
  "V_RELEASES_COMB"."CUMM_SHIPPED" > 0
  AND "V_RELEASES_COMB"."EPLANT_ID" > 79
ORDER BY "V_RELEASES_COMB"."CUSTNO";

它产生

org 0x7FF0
    jmp start

start:
    hlt

2 个答案:

答案 0 :(得分:2)

    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`。

答案 1 :(得分:1)

我不确定这是令人困惑的问题的措辞还是代码示例。如果要创建入口点偏移为0x7FF0的32KiB ROM / BIOS映像,但代码和数据位于映像中较早的位置,则可以执行以下操作:

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