Menu
CoddyTech

Exitシステムコール (60)

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

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

exit システムコールの番号は 60 です。

構文:

mov rax, 60    ; exit用のsyscall番号
mov rdi, 0     ; 終了コード(0 = 成功)
syscall        ; OSに終了を要求する

syscallを rax = 60で実行すると何が起こるか:

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

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

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

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

./myprogram
echo $?    ; Prints the exit code

これは次のような場合に便利です:

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

最小限の完全なプログラム:

section .text
    global _start

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

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

global _startと_start:が何なのか説明しましょう。

コードこれは何かなぜ必要か
global _startプログラムの開始位置をリンカーに伝えますこれがないと、リンカーはどのラベルがエントリーポイントなのかわかりません
_start:コードの開始位置を示すラベルCPUはここから実行を開始します

詳細を暗記する必要はありません。すべてのmain.asmには、コードの前にこの2行が必要だと覚えておけば十分です。これらはすべてのプログラムで使います。

終了システムコールを忘れるとどうなりますか?

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

プログラムは必ず終了システムコールで終わらせてください。

challenge icon

チャレンジ

終了コード 5 で終了するシステムコールを追加してください。

メッセージ "Exiting with code 5" を出力するコードは、すでに用意されています。まだ理解する必要はありません。第 5 章で説明します。

あなたの作業は、最後に終了システムコールを追加することだけです。

自分で試してみよう

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 syscall を追加する
quiz icon腕試し

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

基礎のすべてのレッスン

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