首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为Oracle正确编译多个asm文件并将其链接到.vfd中?

为Oracle正确编译多个asm文件并将其链接到.vfd中?
EN

Stack Overflow用户
提问于 2012-12-01 09:20:37
回答 2查看 4.1K关注 0票数 3

最近,我一直想进入汇编编码,只是为了有一些经验,在我的腰带。我决定研究它,并取得了一些好的结果(尽管它的asm很简单),但是一切仍然很模糊,我非常感谢其他人提供一些关于如何将多个 .asm文件正确地构建到中的输入。和..。&..vfd或用于Oracle VM.img文件结束。

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

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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文件)

代码语言:javascript
运行
复制
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文件如下:

代码语言:javascript
运行
复制
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或这些程序有深入的了解,所以,我已经尝试过尽可能多地阅读,在我来到这里之前,尽可能多地阅读。所以,如果你能把这些解释写得清楚些,那就好了。我很抱歉,如果有很多的要求,请不要烧烤。:)

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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”)。记忆中已知的位置。为了方便地找到进一步的代码,在引导扇区之后立即定位它是很方便的。您可以使用catcopy (我想您希望使用/b选项)将"boot.bin“和"kernel.bin”合并到一个文件中,然后将其dd到软盘(或.vfd?)。

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

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

票数 2
EN

Stack Overflow用户

发布于 2014-05-31 06:53:22

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

例如:

代码语言:javascript
运行
复制
;****in kernel.asm
%include "bootloader.asm"
;... continue with kernel code

并像往常一样编译kernel.asm。bootloader.asm中的代码将被执行,就像它在include行所在的kernel.asm中一样。这允许从多个asm源文件构建一个二进制文件。

另一种方法是预包含

代码语言:javascript
运行
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13658063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档