Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何链接从C代码生成的对象文件、静态库和NASM生成的对象文件?_C_Assembly_Linker_Dos_Real Mode - Fatal编程技术网

如何链接从C代码生成的对象文件、静态库和NASM生成的对象文件?

如何链接从C代码生成的对象文件、静态库和NASM生成的对象文件?,c,assembly,linker,dos,real-mode,C,Assembly,Linker,Dos,Real Mode,我正在编写一个程序(对于实模式),该程序由引导加载程序加载到内存中的一个地址,然后跳转到该地址并开始执行该程序。问题是我将项目分为两个文件:a.asm(16位asm,NASM语法)和b.c(我使用gccfordos(djgpp)编译)。另外,b.c使用了allegro库中的一些函数(我把它作为一个静态库,.a) 我的问题是,如何编译和链接这3个文件?我的第一个想法是: 使用gcc编译和组装b.c(使用-c标志),结果得到一个b.o文件 使用NASM(-fbin或..?)组装a.asm并获得a.o

我正在编写一个程序(对于实模式),该程序由引导加载程序加载到内存中的一个地址,然后跳转到该地址并开始执行该程序。问题是我将项目分为两个文件:a.asm(16位asm,NASM语法)和b.c(我使用gccfordos(djgpp)编译)。另外,b.c使用了allegro库中的一些函数(我把它作为一个静态库,.a)

我的问题是,如何编译和链接这3个文件?我的第一个想法是:

  • 使用gcc编译和组装b.c(使用-c标志),结果得到一个b.o文件
  • 使用NASM(-fbin或..?)组装a.asm并获得a.o
  • 链接b.o、a.o和allegro.a以获得纯二进制(无.exe头、, 无调试信息等)
  • 我尝试了上述方法,但在步骤3,链接器抛出一个错误,指出a.o(NASM生成的对象文件)的格式无法识别,这可能是因为我在组装文件时没有调用正确的标志和选项,或者

    我想要一些关于如何处理这个问题的指导


    谢谢。

    由DJGPP生成的.o文件包含32位(i386)代码,不能直接从16位代码调用

    在DOS下,32位代码通常使用a运行,a切换到32位保护模式,设置内存映射和DOS API转换(即调用int 21h DOS API时切换回16位实模式的小型蹦床函数)。然后加载并调用32位代码

    用于在16位和32位模式之间切换的DOS扩展器的轻量级替代方案:

    • 使用gcc-m16(
      .code16gcc
      )。有关gcc-m16的更多详细信息,请参阅和其他答案

    • 项目的引导加载程序,包含16位汇编(NASM)、32位汇编(NASM)和32位C(GCC)代码,并在它们之间切换


    要将16位和32位代码链接在一起,可以运行
    objcopy-O binary func.O func.bin
    (32位),然后将
    %incbin“func.bin”
    添加到16位NASM源文件中。但是,这会中断重新定位(因此您将无法使用全局变量)。

    您不需要
    -f bin
    。您需要使用任何对象文件格式。可能是
    -f coff
    。请参见
    nasm-hf
    @Jester I used-fcoff,我得到了“coff格式不支持非32位重定位”。djgpp生成的32位代码不能以您期望的方式链接到16位代码。它生成的代码通常需要DOS,Allegro库也需要DOS。我的建议是使用FreeDOS作为“引导加载程序”,并将启动程序的命令放在AUTOEXEC.BAT文件中。