【发布时间】:2016-07-14 02:10:30
【问题描述】:
因为第一个扇区只有 512 字节,而其余的代码很大,我想我需要一个单独的 .lst 文件的汇编代码。 我不确定这是否称为绑定,但我想在使用 NASM 制作 .img 文件时绑定此汇编程序文件。
第一个
ORG 0x7c00
start:
JMP entry
DB 0x90
; Start of BIOS Parameter Block
DB "MyOS "
DW 512
DB 1
DW 1
DB 2
DW 224
DW 2880
DB 0xf0
DW 9
DW 18
DW 2
DD 0
DD 2880
DB 0,0,0x29
DD 0xffffffff
DB "MyOS-Vol "
DB "FAT12 "
TIMES 18 DB 0
; End of BIOS Parameter Block
entry:
MOV AX, 0
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
MOV ES,AX
MOV SI,msg
loop:
MOV AL,BYTE [SI]
ADD SI, 1
CMP AL,0
JE fin
MOV AH, 0x0e
MOV BX, 0xe1
INT 0x10
JMP putloop
fin:
HLT
JMP fin
msg:
DB 0x0a, 0x0a
DB "hello, world"
DB 0x0a
DB 0
maker:
TIMES 0x01fe-(maker-start) DB 0
DB 0x55, 0xaa
第二个
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
TIMES 4600 DB 0
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
TIMES 1469432 DB 0
如何将第二个代码附加到第一个代码?不是通过复制粘贴文本,而是将目标文件链接在一起。
对于那些正在寻找 fat12 磁盘格式的人。 DOS Boot Record Format for FAT12 and FAT16
【问题讨论】:
-
我假设您正在谈论在 x86 PC 硬件上启动的限制。没有神奇的方法可以链接事物,以便您可以将第一部分放在引导扇区中,将其余部分放在其他地方。引导加载程序必须处理附加代码的加载并执行它。
-
我明白你的意思。我想我没有清楚地描述我的观点。对于那个很抱歉。我想问的是这个。如何在加载到硬件之前将 asm 文件绑定在一起?我知道编译器在制作可执行文件之前会链接目标文件。但是汇编程序呢?我想出了让小程序读取文件并将另一个文件附加为字符串函数。但这似乎不是办法。 nasm有什么选择吗?我找不到一个:(
-
因为您的 asm 文件顶部有
org 0x7c00,这意味着您正在使用-f bin选项(如nasm -f bin boot.asm -o boot.bin)组装代码。nasm -f bin的输出已经是一个完全链接的平面二进制图像,不能在传统意义上链接。它实际上是写入引导加载程序(通常使用 DD 之类的工具)。您使用的是 Windows / OSX 还是 Linux?您要使用哪个链接器(LD、GCC 等)? -
通常你所做的是使用 DD 将引导扇区写入映像,然后使用 DD 将任何其他数据写入磁盘映像.我写了一个Stackoverflow answer,其中包含一些基本信息,如果您有 DD 可能会有所帮助
-
如果我不了解,您几乎会认为您正在尝试使用第二个文件将磁盘映像预格式化为 FAT12。
标签: macos assembly x86 nasm boot