最近,我一直想进入汇编编码,只是为了有一些经验,在我的腰带。我决定研究它,并取得了一些好的结果(尽管它的asm很简单),但是一切仍然很模糊,我非常感谢其他人提供一些关于如何将多个 .asm文件正确地构建到中的输入。和..。&.以.vfd或用于Oracle VM的.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文件编译成a .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并正确显示它。耶耶。
现在。我已经用Visualc++编写了几年代码,通常在单个解决方案中使用许多文件。我认为在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操作”。在我搜索后..。谷歌搜索..。谷歌了..。和Googled.....(一个链接到下一个)而我找不到其他有效的方法--我只是得到了更多的错误!我真的迷路了。-我尝试了几个不同的程序(如objcopy),,许多不同的参数,等等。而且我没有取得太大的进步。我需要指引。:)
这是我最后的问题。‘链接’把和 ld放在一起,会给我想要的结果吗?,,?(最后一个二进制文件中有多个文件)以及如何正确地在我的windows system上实现
我并不是对asm或这些程序有深入的了解,所以,我已经尝试过尽可能多地阅读,在我来到这里之前,尽可能多地阅读。所以,如果你能把这些解释写得清楚些,那就好了。我很抱歉,如果有很多的要求,请不要烧烤。:)
谢谢!
发布于 2012-12-01 22:30:35
我不认为有任何方法可以“链接”多个平面二进制文件(Nasm的-f bin
输出)。如果我们被迫使用(G)as,就没有-f bin
输出。ld
将从ELF可链接对象创建平面二进制文件。我认为命令行类似于ld -oformat binary -T.text=0x7C00 -o boot.bin boot.o
。我不知道MinGW的ld
是否会这么做,我也不知道它是否会处理多个文件。至少可以试试..。
在任何情况下,链接都不会对您的引导区有任何好处。当您的计算机(或VM?)引导时,只加载第一个扇区--完全是512字节。您必须提供代码才能从磁盘(或.vfd?)加载"kernel.bin“(或"stage2.bin”)。记忆中已知的位置。为了方便地找到进一步的代码,在引导扇区之后立即定位它是很方便的。您可以使用cat
或copy
(我想您希望使用/b
选项)将"boot.bin“和"kernel.bin”合并到一个文件中,然后将其dd
到软盘(或.vfd?)。
"kernel.bin“更灵活。它可以大于512字节,并且可以从多个对象文件构建。您将需要一个平面二进制文件,或者您可以为某些可执行格式提供加载程序--可能是MZ,因为您仍然处于16位模式。一旦您切换到32位(或64位)位模式,您可能想要安排加载PE或ELF或任何可执行格式.
我所知道的最好的信息来源是http://www.osdev.org --如果你还没有,那就去看看吧。祝你开心!
发布于 2014-05-31 06:53:22
我相信您正在寻找include
指令的功能。
例如:
;****in kernel.asm
%include "bootloader.asm"
;... continue with kernel code
并像往常一样编译kernel.asm。bootloader.asm
中的代码将被执行,就像它在include
行所在的kernel.asm
中一样。这允许从多个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
https://stackoverflow.com/questions/13658063
复制相似问题