将多个asm文件正确编译并链接到.vfd for Oracle VM中



最近我一直想进入汇编编码,只是为了积累一些经验。我决定研究一下,并得到了一些好的结果(尽管它是简单的asm),但一切仍然很模糊,我非常感谢其他人就如何将多个.asm文件正确构建到中提供一些意见&amp.vfd.imgOracle 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.

我目前在windows7 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文件,然后使用dd将其放入.img(以下来自在线教程):

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

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

然后我运行了Oracle虚拟机,它读取output.img并正确显示它。耶。

现在。我已经用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操作"。之后我在谷歌上搜索了。。并且在谷歌上搜索。。。并在谷歌上搜索。。。。并且在谷歌上搜索。。。。。(一个链接到下一个),我找不到任何其他有效的方法——我只是得到了更多的错误!我真的迷路了。-我尝试了几个不同的程序(例如objcopy),许多不同的参数等等。但我没有取得太大进展。我需要指导。:)

这是我最后的问题。将">这些文件与ld"链接"在一起是否会给我所需的结果我寻求?(一个最终二进制文件中有多个文件),以及如何在windows系统上正确执行

我并不完全深入了解asm或这些程序,所以在我到达这里之前,我已经尽力阅读了。所以,请你能保持解释的简洁明了。如果要求太多,我很抱歉,请不要盘问

谢谢!

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

无论如何,链接对你的引导扇区没有任何好处。当你的计算机(或虚拟机?)启动时,只加载第一个扇区——准确地说是512字节。您必须提供代码来将"kernel.bin"(或"stage2.bin")从磁盘(或.vfd?)加载到内存中的已知位置。为了容易地找到这个进一步的代码,将其立即定位在引导扇区之后是很方便的。您可以使用catcopy(我想您会想要/b选项)将"boot.bin"one_answers"kernel.bin"组合为一个文件,然后将dd组合为软盘(或.vfd?)。

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

我所知道的这类事情最好的信息来源是http://www.osdev.org-如果你还没有,那就去看看吧。祝你好运!

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

例如:

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

并像往常一样编译kernel.asm。bootloader.asm中的代码将像kernel.asminclude行所在的代码一样执行。这允许从多个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

相关内容

  • 没有找到相关文章

最新更新