Menu
CoddyTech

Syscallとは?

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

movやleaのようなアセンブリ命令を書きました。これらの命令はCPU上で直接実行されます。しかし、画面への出力、キーボードからの入力、プログラムの終了など、CPU単体ではできない処理を行う必要がある場合はどうすればよいでしょうか?

これらの課題では、オペレーティングシステム(このコースではLinux)が必要です。

システムコールとは何ですか?

syscall(システムコール)は、プログラムからオペレーティングシステムへの要求です。OSに何かをしてもらうための方法です。

システムコールが必要な理由:

タスクCPUだけで実行できる?システムコールが必要?
2つの数値を加算するはいいいえ
レジスタ間でデータを移動するはいいいえ
画面にテキストを表示するいいえはい
キーボード入力を読み取るいいえはい
プログラムを終了するいいえはい
ファイルを開くいいえはい

システムコールの仕組み:

  1. システムコール番号をraxに設定します(OSに何をしたいかを伝えます)
  2. 他のレジスタ(rdi、rsi、rdxなど)に引数を設定します
  3. syscall命令を実行します
  1. CPUがOSカーネルにジャンプする
  2. OSが要求を実行する
  3. OSがプログラムに制御を戻す

たとえ:

システムコールは、役所に問い合わせるようなものだと考えてみましょう。

手順たとえアセンブリでは
1必要なサービスを決めるシステムコール番号を選ぶ(raxに入れる)
2書類に記入する引数をレジスタに入れる
3申請を提出するsyscallを実行する
4役所が処理するOSカーネルが処理を行う
5結果を受け取るプログラムが続行する

このコースで学ぶシステムコール:

システムコール番号機能章
exit60プログラムを終了する第4章
write1画面にテキストを出力する第5章

現時点で最も重要なシステムコール: exit

exitがなければ、プログラムは永遠に実行され続けるか、クラッシュしてしまいます。作成するすべてのプログラムは、exitシステムコールで終了しなければなりません。

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

自分で試してみよう

このレッスンにはコードチャレンジは含まれていません。

quiz icon腕試し

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

基礎のすべてのレッスン

自分で練習してみよう: Assemblyプレイグラウンド