编译汇编代码

时间:2010-06-21 15:40:21

标签: assembly batch-file nasm djgpp

我正在尝试编译我用NASM编写的ASM程序和来自DJGPP的“ld”命令。这是我用来编译它的批处理文件的代码:

@echo off
set path=C:\NASM;%PATH%
nasm -f aout -o start.o start.asm
ld -T link.ld -o kernel.bin start.o

但是当我运行文件时,我得到了:

start.o: file not recognised: File format not recognized

什么,在我的构建文件中,我做错了导致此错误消息?

修改

这是我的link.ld文件:

OUTPUT_FORMAT("binary")
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
  .text phys : AT(phys) {
    code = .;
    *(.text)
    *(.rodata)
    . = ALIGN(4096);
  }
  .data : AT(phys + (data - code))
  {
    data = .;
    *(.data)
    . = ALIGN(4096);
  }
  .bss : AT(phys + (bss - code))
  {
    bss = .;
    *(.bss)
    . = ALIGN(4096);
  }
  end = .;
}

修改

没有其他工作,所以这里是我的ASM文件的代码(我正在为我一直在研究的操作系统创建内核):

[BITS 32]
global start
start:
    mov esp, _sys_stack
    jmp stublet

ALIGN 4
mboot:
    MULTIBOOT_PAGE_ALIGN    equ 1<<0
    MULTIBOOT_MEMORY_INFO   equ 1<<1
    MULTIBOOT_AOUT_KLUDGE   equ 1<<16
    MULTIBOOT_HEADER_MAGIC  equ 0x1BADB002
    MULTIBOOT_HEADER_FLAGS  equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO |         MULTIBOOT_AOUT_KLUDGE
    MULTIBOOT_CHECKSUM  equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
    EXTERN code, bss, end

    dd MULTIBOOT_HEADER_MAGIC
    dd MULTIBOOT_HEADER_FLAGS
    dd MULTIBOOT_CHECKSUM

    dd mboot
    dd code
    dd bss
    dd end
    dd start

stublet:
    jmp $

SECTION .bss
    resb 8192
_sys_stack:

3 个答案:

答案 0 :(得分:2)

您在代码文件中缺少文本部分:

[BITS 32]
SECTION .text
global start
...

对于对象格式,请尝试-f coff,因为这似乎是DJCPP的正确格式(感谢@ninjalj):

valid output formats for -f are (`*' denotes default):
  * bin       flat-form binary files (e.g. DOS .COM, .SYS)
    ith       Intel hex
    srec      Motorola S-records
    aout      Linux a.out object files
    aoutb     NetBSD/FreeBSD a.out object files
    coff      COFF (i386) object files (e.g. DJGPP for DOS)
    elf32     ELF32 (i386) object files (e.g. Linux)
    elf       ELF (short name for ELF32) 
    elf64     ELF64 (x86_64) object files (e.g. Linux)
    as86      Linux as86 (bin86 version 0.3) object files
    obj       MS-DOS 16-bit/32-bit OMF object files
    win32     Microsoft Win32 (i386) object files
    win64     Microsoft Win64 (x86-64) object files
    rdf       Relocatable Dynamic Object File Format v2.0
    ieee      IEEE-695 (LADsoft variant) object file format
    macho32   NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files
    macho     MACHO (short name for MACHO32)
    macho64   NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files
    dbg       Trace of all info passed to output stage

我没有DJCPP的解决方案,但我能够在我的64位Linux(添加.text部分)上编译和链接,如下所示:

~$ nasm -f elf64 start.asm
~$ ld -T link.ld -o kernel.bin start.o

答案 1 :(得分:1)

你有没有尝试过nasm -f coff?

来自nasm -hf输出:

coff      COFF (i386) object files (e.g. DJGPP for DOS)

答案 2 :(得分:0)

根据多引导头信息判断,以及此文件链接到二进制格式输出(如链接器脚本中指定)这一事实告诉我这是一个操作系统内核(或至少是一个学术示例因此,它意味着要在独立模式下编译和运行,而不是常规的用户空间进程(需要内核来管理)。

默认情况下,ld接受elf格式(它非常取代unix平台上旧的,过时的aout格式),你可能必须在链接描述文件中指定aout作为输入格式(或者告诉nasm输出elf格式对象)文件)。 multiboot最适合精灵,不需要所有“aout_kludge”

此代码(或任何内核代码)的执行方式是由引导加载程序加载。由于这是一个多引导兼容的内核,它意味着由多引导兼容的引导加载程序(如grub)加载(参见http://www.gnu.org/software/grub/)。

我意识到你在Windows上,所以你可能没有在你的站点上正确安装信息文档系统,但你可以阅读http://www.gnu.org/software/grub/manual/multiboot/multiboot.html阅读GNU文档。此外,看起来这个代码是在unix平台上编译的,所以至少你是正确的使用djgpp(gcc移植到windows)。

当我在GNU / Linux上工作时,我很难调试任何需要解决的MS窗口或djgpp问题,也许GNU ld(binutils的一部分)信息文档会有所帮助 - {{3} }