Syscallとは?
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 31/45。
mov や lea のようなアセンブリ命令を書きました。これらの命令は CPU 上で直接実行されます。しかし、画面への出力、キーボードからの読み取り、プログラムの終了など、CPU だけでは実行できないことを行う必要がある場合はどうすればよいでしょうか?
これらのタスクでは、オペレーティングシステム(このコースではLinux)が必要です。
syscallとは何ですか?
syscall(システムコール)とは、プログラムからオペレーティングシステムへの要求です。OSに何かをしてもらうための方法です。
syscalls が必要な理由:
| タスク | CPU だけで実行できるか? | syscall が必要か? |
|---|---|---|
| 2つの数値を加算する | はい | いいえ |
| レジスタ間でデータを移動する | はい | いいえ |
| 画面にテキストを表示する | いいえ | はい |
| キーボード入力を読み取る | いいえ | はい |
| プログラムを終了する | いいえ | はい |
| ファイルを開く | いいえ | はい |
syscall の仕組み:
- syscall 番号を
raxに入れます(何をしたいのかを OS に伝えます) - 引数を他のレジスタ(
rdi、rsi、rdxなど)に入れます syscall命令を実行します
- CPUがOSカーネルにジャンプする
- OSがリクエストを実行する
- OSがプログラムに制御を戻す
たとえ:
syscall は、政府機関に電話をかけるようなものだと考えてください:
| 手順 | たとえ | アセンブリでの処理 |
|---|---|---|
| 1 | 必要なサービスを決める | syscall 番号を選ぶ(rax に入れる) |
| 2 | 書類に記入する | レジスタに引数を入れる |
| 3 | 申請を提出する | syscall を実行する |
| 4 | 政府機関が処理する | OS カーネルが処理を行う |
| 5 | 結果を受け取る | プログラムが続行する |
このコースで学ぶシステムコール:
| システムコール | 番号 | 動作 | 章 |
|---|---|---|---|
exit | 60 | プログラムを終了する | 第4章 |
write | 1 | テキストを画面に表示する | 第5章 |
今のところ最も重要な syscall: <strong>exit</strong>
exit がなければ、プログラムは永遠に実行され続けるか、クラッシュしてしまいます。あなたが作成するすべてのプログラムは、exit syscall で終了しなければなりません。
mov rax, 60 ; syscall number for exit
mov rdi, 0 ; exit code (0 = success)
syscall ; ask the OS to exit自分で試してみよう
このレッスンにはコードチャレンジは含まれていません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド