2016-09-18 14 views
0

アセンブリNASMセグメンテーションフォールト、それはどういう意味ですか?

all: 
    nasm -f elf64 -o asm.o asm.s 
    ld asm.o -o asm 
    rm asm.o 

を次のようにアセンブリI以下のアセンブリコード、私はエラーを取得するSegmentation fault (core dumped)

section .text 
global _start 

_start: 
    mov eax, 8 

私のMakefileがあるとき、私は問題が何であるかを知りません。

私は64ビットのUbuntuを実行しています。

ありがとうございました。

+1

あなたが終了するシステムコールを使用していないがあなたのプログラムは 'mov eax、8 'の実行を終了すると、最終的に障害が発生するまでメモリ内に何が起こったとしてもプログラムを実行し続けます。あなたのプログラムを終了するには、これらの命令を追加することができます 'mov eax、60'' xor edi、edi' 'syscall'。 Linuxシステムコールに関する優れた情報源は[Ryan Chapmanのブログ](http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/) –

+0

ありがとうございます、それは魅力のように機能します! :D –

+0

'xor edi、edi'の部分は何をしていますか?これはそれなしで動作するようです。 –

答えて

0

CPUがプログラムを実行し、mov eax, 8命令を見つけて実行しました...そして今何をしていますか?オブジェクトファイルにはこれ以上の命令はありませんが、CPUには誰も指示しませんでした! @MichaelPetchのように、それは次のものを実行します。おそらく有効な命令はありません。

最も簡単な解決策IMOは、GCCなどのプログラムの初期化とクリーンアップを担当するラッパーを使用します。

section .text 
global main 

main: 
    mov eax, 8 
    ret 

mainが関数であるので、あなたが返すようにret命令を必要とする:ちょうどあなたが次のようにソースファイルを変更C.

からに精通してもmain機能へmov eax, 8を置きますそれから)

、次のスクリプトを使用します。

nasm -f elf64 -o asm.o asm.s 
gcc asm.o -o asm 
rm asm.o 
関連する問題