我正在尝试生成一个小的二进制文件来模拟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
答案 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