首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译汇编代码

编译汇编代码
EN

Stack Overflow用户
提问于 2010-06-21 23:40:21
回答 2查看 2.6K关注 0票数 3

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

代码语言:javascript
复制
@echo off
set path=C:\NASM;%PATH%
nasm -f aout -o start.o start.asm
ld -T link.ld -o kernel.bin start.o

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

代码语言:javascript
复制
start.o: file not recognised: File format not recognized

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

编辑

这是我的link.ld文件:

代码语言:javascript
复制
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文件的代码(我正在为我一直在使用的操作系统创建内核):

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

回答 2

Stack Overflow用户

发布于 2010-06-22 03:42:51

你有没有试过nasm -f coff?

在nasm -hf输出中:

代码语言:javascript
复制
coff      COFF (i386) object files (e.g. DJGPP for DOS)
票数 1
EN

Stack Overflow用户

发布于 2012-11-15 01:43:53

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

ld默认接受elf格式(它在unix平台上很大程度上取代了旧的、过时的aout格式),您可能必须在链接器脚本中指定aout作为输入格式(或者告诉nasm输出elf格式的目标文件)。多重引导在elf中工作得最好,并且不需要所有的"aout_kludge“

这段代码(或任何内核代码)的执行方式是由引导加载程序加载的。由于这是一个兼容多重引导的内核,因此它应该由兼容多重引导的引导加载程序加载,比如grub (请参阅http://www.gnu.org/software/grub/)。

我知道您使用的是windows,所以您的站点上可能没有正确安装info文档系统,但是您可以在http://www.gnu.org/software/grub/manual/multiboot/multiboot.html上阅读GNU文档。而且看起来这段代码是打算在类似unix的平台上编译的,所以至少你使用djgpp是正确的(gcc移植到了windows)。

当我在GNU/Linux上工作时,我很难调试任何需要解决的MS windows或djgpp问题,也许GNU ld (binutils的一部分)信息文档会有所帮助-- http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_toc.html

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

https://stackoverflow.com/questions/3086071

复制
相关文章

相似问题

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