web-dev-qa-db-ja.com

UbuntuのNASMで.asmファイルを実行しようとするとエラーが発生します

私はubuntu64ビットを使用していて、NASMで.asmファイルを実行しようとしています。しかし、次のコードを実行しようとすると、このエラーが返されます。 Iḿがやろうとしているのは、ソースからオブジェクトファイルをコンパイル(またはアセンブル)して実行可能ファイルをビルドすることです$ nasm -f elf hello.asm、そしてファイルを作成した後hello.oは、リンカーを呼び出して、オブジェクトファイルから実行可能ファイル自体を生成しています。

$ ld -s -o hello hello.o

これにより、最終的にhello実行可能ファイルがビルドされます。

私はこのチュートリアルに従っています http://www.faqs.org/docs/Linux-HOWTO/Assembly-HOWTO.html

エラー:

入力ファイル `hello.o 'のi386アーキテクチャはi386:x86-64出力と互換性がありません

コード:

     section .data              ;section declaration

 msg     db      "Hello, world!",0xa    ;our dear string
 len     equ     $ - msg                 ;length of our dear string

 section .text              ;section declaration

             ;we must export the entry point to the ELF linker or
     global _start       ;loader. They conventionally recognize _start as their
             ;entry point. Use ld -e foo to override the default.

 _start:

 ;write our string to stdout

         mov     edx,len ;third argument: message length
         mov     ecx,msg ;second argument: pointer to message to write
         mov     ebx,1   ;first argument: file handle (stdout)
         mov     eax,4   ;system call number (sys_write)
         int     0x80   ;call kernel

  ;and exit

     mov    ebx,0   ;first syscall argument: exit code
         mov     eax,1   ;system call number (sys_exit)
         int     0x80   ;call kernel
28
rogcg

これは、nasmによって生成されたものとldが作成しようとしているものとの間の単純な不一致である可能性があるようです。

i386 architecture of input file 'hello.o' is incompatible with i386:x86-64 output

言い換えると、nasmは32ビットのオブジェクトファイルhello.oを生成し、ldはそれを取得して64ビットの実行可能ファイルを作成したいと考えています。

nasm -hfコマンドは、使用可能な出力形式を提供するはずです。

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

リンクされたチュートリアルで実行するように求められているようです。

nasm -f elf hello.asm

使用してみてください:

nasm -f elf64 hello.asm

代わりに、ldが入力ファイルについて文句を言うのをやめることがあります。

37
paxdiablo

I386アセンブリを作成しているので、リンカーにi386出力ファイルを生成するように指示する必要があります。

ld -m elf_i386 -s -o hello hello.o
12
caf

Ubuntu 64ビットでnasmアプリをコンパイル、リンク、実行する方法。

nasmをインストールします:

Sudo apt-get install nasm

ファイル名hello.asmでファイルを保存します

section .data
  hello:     db 'Hello world!',10    ; 'Hello world!' plus a linefeed character
  helloLen:  equ $-hello             ; Length of the 'Hello world!' string
                                     ; (I'll explain soon)

section .text
  global _start

_start:
  mov eax,4            ; The system call for write (sys_write)
  mov ebx,1            ; File descriptor 1 - standard output
  mov ecx,hello        ; Put the offset of hello in ecx
  mov edx,helloLen     ; helloLen is a constant, so we don't need to say
                       ;  mov edx,[helloLen] to get it's actual value
  int 80h              ; Call the kernel

  mov eax,1            ; The system call for exit (sys_exit)
  mov ebx,0            ; Exit with return code of 0 (no error)
  int 80h

コンパイル:

nasm -f elf64 hello.asm

リンクする:

ld -s -o hello hello.o

実行する

el@apollo:~$ ./hello
Hello world!

動作します! お気に入りのコンパイラに、マシンコードに変換するために通常渡されるアセンブリコードを生成するように要求します。 Google検索:「php/Java/python/c ++プログラムをアセンブリに変換する」

展望:今日、すべての人々が一般大衆のために汎用コンピューティングを解体して取り除こうとしているので、私たちは新入生にコア原理からベアメタル、そして最後にアセンブラーとプログラミング言語に至るまで、汎用チューリングマシンを構築する方法の概念。

アセンブリの学習はプログラミングにどのように役立ちますか?そこにあるコンピュータープログラムの99%は、プログラマーがそうしないという理由だけで最適化できるよりも10倍から100倍遅いです。彼らのお気に入りの高レベルのコンパイラまたはインタプリタによってどのような遅延が強制されているかを知っています。

ここでのフルスタックを完全に理解することは、手元の仕事をするのにナノ秒しかかからないという切望された特性を持つようにプログラムを強制できることを意味します。時間==お金。したがって、完了するまでに数ナノ秒以上かかるものを回避する方法に関するこの知識は、時間とお金を節約します。

https://softwareengineering.stackexchange.com/questions/156722/how-does-learning-Assembly-aid-in-programming

4
Eric Leschinski