Exitシステムコール (60)
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 32/45。
どのプログラムにとっても最も重要なシステムコールはexitです。これがないと、プログラムは永遠に実行され続けるか、メモリの終端に達したときにクラッシュしてしまいます。
exitシステムコール番号は60です。
構文:
mov rax, 60 ; exitのシステムコール番号
mov rdi, 0 ; 終了コード (0 = 成功)
syscall ; OSに終了を要求するrax = 60 で syscall を実行したときに何が起こるか:
- CPUがLinuxカーネルにジャンプします
- カーネルは "exit syscall with code 0" であると認識します
- カーネルがプログラムを終了します
- カーネルがシェルまたはオペレーティングシステムに制御を戻します
終了コード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システムコールで終了させてください。
チャレンジ
終了コード 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システムコールを追加する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。