Exitシステムコール (60)
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 32/45。
どのプログラムにとっても最も重要なシステムコールは exit です。これがなければ、プログラムは永遠に実行され続けるか、メモリの終端に達したときにクラッシュします。
exit システムコールの番号は 60 です。
構文:
mov rax, 60 ; exit用のsyscall番号
mov rdi, 0 ; 終了コード(0 = 成功)
syscall ; OSに終了を要求するsyscallを rax = 60で実行すると何が起こるか:
- CPUがLinuxカーネルにジャンプする
- カーネルは「コード0でexitシステムコール」と認識する
- カーネルがプログラムを終了する
- カーネルがシェルまたはオペレーティングシステムに制御を戻す
終了コード 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はコードの後のメモリにたまたま存在する不正なデータを実行し続けます。通常、これによりセグメンテーションフォールト(クラッシュ)や、まったく予期しない動作が発生します。プログラムは正常に終了しません。
プログラムは必ず終了システムコールで終わらせてください。
チャレンジ
終了コード 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 を追加する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド