3

最近我一直想进入汇编编码,只是为了获得一些经验。我决定研究它并获得了一些好的结果(尽管它很简单),但是一切仍然模糊不清,我非常感谢其他人就如何正确地将多个.asm 文件构建到.. &.. & ..完成Oracle VM的.vfd.img文件。

所以在过去几周的空闲时间里,我一直在网络上进行研究,试图找到一种工作方法,使我能够:

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

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

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

然后我只运行读取 output.img 并正确显示它的 Oracle VM。耶。

现在。我已经用 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 或这些程序并不深入,所以在我来到这里之前,我已经尽可能地阅读了。所以,如果你能保持解释清楚明了。对不起,如果它有很多要求,请不要烧烤。:)

谢谢!

4

2 回答 2

2

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

无论如何,链接对您的引导扇区没有任何好处。当您的计算机(或 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 - 如果你还没有,请查看。快乐开机!

于 2012-12-01T22:30:35.000 回答
2

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

例如:

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

and compile kernel.asm as you normally would. The code in bootloader.asm will be executed just as if it were in kernel.asm where the include line is. This allows building a single binary from multiple asm source files.

Another way is to pre-include with

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

Also see http://www.nasm.us/doc/nasmdoc4.html#section-4.6

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

于 2014-05-31T06:53:22.970 回答