最近我一直想进入汇编编码,只是为了获得一些经验。我决定调查并获得一些好的结果(虽然它简单的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或这些程序所以我已经尝试在我到达之前读取尽可能。所以,如果你能保持解释清楚,那么请。我很抱歉,如果要求很多,请不要烧烤。 :)
谢谢!
答案 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?)加载到内存中的已知位置。为了方便地找到这个代码,方便让它位于引导扇区之后。您可以使用cat
或copy
(我认为您需要/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