正确编译并将多个asm文件链接到.vfd - 对于Oracle VM?

时间:2012-12-01 09:20:38

标签: assembly virtual-machine nasm ld floppy

最近我一直想进入汇编编码,只是为了获得一些经验。我决定调查并获得一些好的结果(虽然它简单的asm),但是一切都仍然模糊,我非常感谢其他人对如何正确构建多个 .asm文件的一些意见进入 ..&amp; ..&amp; .. 以完成 .vfd .img 文件 Oracle VM < /强>

所以在我业余时间的过去几周里,我一直在网上研究,试图找到一种方法让我能够:

1. Compile my .asm files into individual .obj files
2. Link these multiple files into one .bin
3. Place this .bin into a .vfd or .img
4. Finally ran on the Oracle VM.

我目前在 Windows 7 64位系统上使用的程序是:

(全部通过 MinGW

1. nasm   - to compile the asm to .obj / .bin files
2. ld     - to link .obj files into a .bin (I think)
3. dd     - to create a .img file from a .bin file

经过一段时间的混乱之后,我已经能够将单个.asm 文件编译成 .bin文件,然后将其放入 .img 使用 dd (以下内容来自在线教程):

(按以下顺序执行这些命令的bat文件)

1. nasm -f bin -o bootloader.bin bootloader.asm  
2. dd if=bootloader.bin of=output.img count=1440

然后我运行了Oracle VM,它读取output.img并正确显示它。 YAY。

现在。我已经用Visual c ++ 编写了几年,我通常在单一解决方案中使用很多文件。我觉得在asm编码时,我也应该能够拥有多个文件。所以我读了很多,很多人使用'ld' - 一个链接器,其中'.obj文件加入.bin文件?

所以我将以上bat文件编辑为以下内容:

1a. nasm -f bin -o bootloader.bin bootloader.asm 
1b. nasm -f bin -o kernel.bin     kernel.asm 
2.  ld -o link.bin bootloader.obj kernel.obj 
3.  dd if=link.bin of=output.img  count=1440

我得到的第一个错误是:“无法在非PE输出文件上执行PE操作”。后 我用谷歌搜索...和谷歌搜索 ...和用Google搜索 ....和 用Google搜索 ..... (一个链接到下一个),我找不到任何其他工作方法 - 我只是有更多的错误!我老实说迷路了。 - 我尝试了几个不同的程序(例如objcopy),许多不同的参数等等。我没有取得太多进展。我需要指导。 :)

这是我最后的问题。这些文件''链接'' ld一起给我想要的结果我寻求? (一个最终二进制文件中的多个文件)以及如何在 Windows系统正确进行操作?

我并非全都深入了解asm或这些程序所以我已经尝试在我到达之前读取尽可能。所以,如果你能保持解释清楚,那么请。我很抱歉,如果要求很多,请不要烧烤。 :)

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为没有办法“链接”多个平面二进制文件(Nasm的-f bin输出)。如果我们被迫使用(G)as,则没有-f bin输出。 ld将从ELF可链接对象创建一个平面二进制文件。我认为命令行类似于ld -oformat binary -T.text=0x7C00 -o boot.bin boot.o。我不知道MinGW的ld是否会这样做,我不知道它是否会处理多个文件。要尝试的东西,至少......

在任何情况下,链接对你的bootsector都没有任何好处。当您的计算机(或VM?)启动时,只加载第一个扇区 - 确切地说是512个字节。你必须提供代码来将你的“kernel.bin”(或“stage2.bin”)从磁盘(或.vfd?)加载到内存中的已知位置。为了方便地找到这个代码,方便让它位于引导扇区之后。您可以使用catcopy(我认为您需要/b选项)来组合“boot.bin”和“kernel.bin” “到一个文件 - 然后dd它到软盘(或.vfd?)。

“kernel.bin”更灵活。它可以大于512字节,并且可以从多个目标文件构建。您需要一个平面二进制文件,或者您可以为某些可执行格式提供加载程序 - 可能是MZ,因为您仍处于16位模式。一旦你切换到32位(或64位)Pmode,你可能想安排加载PE或ELF或任何可执行格式......

我知道这类事情的最佳信息来源是http://www.osdev.org - 如果你还没有,请查看。快乐的靴子'!

答案 1 :(得分:1)

我相信您正在寻找include指令的功能。

例如:

;****in kernel.asm
%include "bootloader.asm"
;... continue with kernel code

并像往常一样编译kernel.asm。 bootloader.asm中的代码将被执行,就像kernel.asm行所在的include一样。这允许从多个asm源文件构建单个二进制文件。

另一种方法是预先包含

nasm -f bin -o kernel.bin kernel.asm -p bootloader.asm

另见http://www.nasm.us/doc/nasmdoc4.html#section-4.6

http://www.nasm.us/doc/nasmdoc2.html#section-2.1.17