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> を実行すると何が起こるか:
- CPU は Linux カーネルにジャンプする
- カーネルは「コード 0 で
exitsyscall」と認識する
- カーネルがプログラムを終了させる
- カーネルがシェルまたはオペレーティングシステムに制御を戻す
終了コード 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 で終了させてください。
チャレンジ
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システムコールを追加する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド