我正在开发一个程序(用于实模式),该程序由引导加载程序加载到内存中的某个地址并跳转到该地址并开始执行该程序。问题是我将项目分成两个文件:a.asm(16 位 asm,NASM 语法)和bc(我用 gcc 编译 dos (djgpp))。此外,bc使用了 allegro 库中的一些函数(我将它作为静态库,.a)。
我的问题是,我如何编译和链接这 3 个文件?我的第一个想法是:
我尝试了上述方法,但在第 3 步,链接器抛出错误,提示无法识别ao(NASM 生成的目标文件)的格式,这可能是因为我没有调用正确的标志和选项组装文件时,或..
我想要一些关于如何解决这个问题的指导。
谢谢。
DJGPP 生成的 .o 文件包含 32 位(i386)代码,不能直接从 16 位代码中调用。
在 DOS 下,32 位代码通常使用DOS 扩展器运行,它切换到 32 位保护模式,设置内存映射和 DOS API 转换(即在调用时切换回 16 位实模式的小型蹦床函数int 21h DOS API)。然后加载并调用 32 位代码。
用于在 16 位和 32 位模式之间切换的 DOS 扩展器的轻量级替代品:
使用gcc -m16 ( .code16gcc
) 的虚幻模式。有关gcc -m16 的更多详细信息,请参阅此答案和其他答案。
Syslinux项目的引导加载程序,包含 16 位汇编 (NASM)、32 位汇编 (NASM) 和 32 位 C (GCC) 代码,并在它们之间切换。
要将 16 位和 32 位代码链接在一起,您可以运行objcopy -O binary func.o func.bin
(32-bit),然后添加%incbin "func.bin"
到您的 16 位 NASM 源文件中。但是,这会破坏重定位(因此您将无法使用全局变量)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句