私は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
これは、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
が入力ファイルについて文句を言うのをやめることがあります。
I386アセンブリを作成しているので、リンカーにi386出力ファイルを生成するように指示する必要があります。
ld -m elf_i386 -s -o hello hello.o
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倍遅いです。彼らのお気に入りの高レベルのコンパイラまたはインタプリタによってどのような遅延が強制されているかを知っています。
ここでのフルスタックを完全に理解することは、手元の仕事をするのにナノ秒しかかからないという切望された特性を持つようにプログラムを強制できることを意味します。時間==お金。したがって、完了するまでに数ナノ秒以上かかるものを回避する方法に関するこの知識は、時間とお金を節約します。