Menu
Coddy logo textTech

Exitシステムコール (60)

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

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

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

構文:

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

rax = 60syscall を実行したときに何が起こるか:

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

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

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

プログラムが終了した後、シェル(ターミナル)は終了コードを保存します。以下のコマンドで確認できます:

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

これは以下の場合に役立ちます:

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

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

section .text
    global _start

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

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

global _start_start: が何であるかについて触れておきましょう。

コード概要必要な理由
global _startプログラムの開始位置をリンカーに伝えますこれがないと、リンカーはどのラベルがエントリポイントであるか判断できません
_start:コードの開始を示すラベルですCPUはここから実行を開始します

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

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

exitシステムコールを含めない場合、CPUはコードの後のメモリ内にある適当なデータ(ガベージデータ)を実行し続けます。これは通常、セグメンテーション違反(クラッシュ)や、全く予期しない動作を引き起こします。プログラムは正常に終了しません。

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

challenge icon

チャレンジ

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

メッセージ "Exiting with code 5" を表示するコードは既に提供されています。まだ理解する必要はありません。これについては第5章で説明します。

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

自分で試してみよう

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腕試し

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

基礎のすべてのレッスン