Menu
Coddy logo textTech

Exitシステムコール (60)

CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 32/45。

どのプログラムにとっても最も重要な syscall は exit です。これがなければ、プログラムは永遠に実行され続けるか、メモリの終端に到達したときにクラッシュします。

exit syscall の番号は 60 です。

構文:

mov rax, 60    ; 終了用のシステムコール番号
mov rdi, 0     ; 終了コード (0 = 成功)
syscall        ; OSに終了を依頼する

rax = 60 を指定して <strong>syscall</strong> を実行すると何が起こるか:

  1. CPU は Linux カーネルにジャンプする
  2. カーネルは「コード 0 で exit syscall」と認識する
  1. カーネルがプログラムを終了させる
  2. カーネルがシェルまたはオペレーティングシステムに制御を戻す

終了コード 0 は成功を意味します。つまり、プログラムはエラーなしで完了しました。終了コード 1 から 255 は、さまざまなエラーを示します。何が問題だったかを知らせるために、任意の番号を選べます。

終了コードが重要な理由:

プログラムが終了すると、シェル(ターミナル)は終了コードを保存します。次のようにして確認できます:

./myprogram
echo $?    ; 終了コードを出力します

これは次の用途に役立ちます:

  • プログラムが成功したかどうかを確認するスクリプト
  • デバッグ(エラーごとに異なるコード)
  • プログラムを連結して実行すること

完全な最小プログラム:

section .text
    global _start

_start:
    mov rax, 60    ; 終了システムコール
    mov rdi, 0     ; 終了コード 0 (成功)
    syscall

このプログラムは目に見えることを何もしません。ただ正常に終了するだけです。しかし、これは有効で完全なプログラムです。

global _start_start: について説明しましょう。

コードその内容必要な理由
global _startプログラムの開始位置をリンカーに伝えるこれがないと、リンカーはどのラベルがエントリポイントなのか分からない
_start:コードの開始位置を示すラベルCPUはここから実行を開始する

詳細を暗記する必要はありません。すべての main.asm には、コードの前にこの2行が必要だと知っておいてください。これらはすべてのプログラムで使用します。

exit syscall を忘れるとどうなりますか?

exit syscall を含めないと、CPU はコードの後のメモリにたまたま存在する無意味なデータを実行し続けます。通常、これによりセグメンテーションフォールト(クラッシュ)や、まったく予期しない動作が発生します。プログラムは正常に終了しません。

プログラムは必ず exit syscall で終了させてください。

challenge icon

チャレンジ

exit syscall を exit code 5 で追加してください。

"Exiting with code 5" という message を出力するコードはすでに用意されています。まだ理解する必要はありません。これは第5章で扱います。

あなたの作業は、最後に exit syscall を追加することだけです。

自分で試してみよう

section .data
    msg db 'Exiting with code 5', 0x0a
    msgLen equ $ - msg

section .text
    global _start

_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msgLen
    syscall

; TODO: 終了コード5でexitシステムコールを追加する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン

自分で練習してみよう: Assemblyプレイグラウンド