File Descriptor (rdi)
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 36/45。
前回のレッスンでは、writeシステムコールの一部としてmov rdi, 1を使用しました。その数値1は、ファイルディスクリプタと呼ばれます。
ファイルディスクリプタは、オペレーティングシステムにデータの送信先がどこであるかを伝える数値です。
Linuxにおける3つの標準ファイル記述子(ファイルディスクリプタ):
| ファイル記述子 | 名前 | データの出力先 |
|---|---|---|
| 0 | stdin | キーボード入力(ユーザーからのデータの読み取り) |
| 1 | stdout | 画面出力(通常のプログラム出力) |
| 2 | stderr | 画面出力(エラーメッセージ) |
なぜ画面に2つの出力があるのでしょうか?
標準出力 (stdout) と標準エラー出力 (stderr) は同じ画面に表示されますが、別々に扱われます。これにより、以下のことが可能になります:
- エラーを画面で確認しながら、標準出力をファイルにリダイレクトする
- 標準出力が非表示の場合でもエラーを表示する
このコースでの出力について:
メッセージを出力するには、常にファイル記述子 1 (stdout) を使用します。stderr はまだ必要ありません。
例:
mov rdi, 1 ; 出力をstdout(画面)に送信する誤ったファイル記述子を使用するとどうなりますか?
| 使用するもの | 結果 |
|---|---|
| 0 (stdin) | writeシステムコールは出力ではなく入力を期待するため、失敗するか何もしません |
| 2 (stderr) | stdoutのように動作しますが(画面に表示される)、エラー用として意図されています |
| その他の数値 | カーネルがそれを認識しないため、システムコールが失敗します |
チャレンジ
message という名前の、値が 'OK' でその後に改行が続く文字列が与えられています。画面(stdout)に出力するためにファイルディスクリプタを設定するコードを1行記述してください。rdi に対する mov 命令のみを記述してください。
自分で試してみよう
section .data
message db 'OK', 0x0a
msgLen equ $ - message
section .text
global _start
_start:
; ここで学生がファイルディスクリプタを設定します
%include "solution.asm"
mov rax, 1
; rdiはすでに学生によって設定されているはずです
mov rsi, message
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscallこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。