最近我一直想进入汇编编码,只是为了积累一些经验。我决定研究一下,并得到了一些好的结果(尽管它是简单的asm),但一切仍然很模糊,我非常感谢其他人就如何将多个.asm文件正确构建到中提供一些意见&以.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?)加载到内存中的已知位置。为了容易地找到这个进一步的代码,将其立即定位在引导扇区之后是很方便的。您可以使用cat
或copy
(我想您会想要/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.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