File Descriptor (rdi)
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 36/45。
前のレッスンでは、write syscall の一部として 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 syscall は入力を想定しており、出力ではありません。失敗するか、何も行いません |
| 2 (stderr) | stdout と同じように動作します(画面に出力します)が、エラー用です |
| その他の番号 | カーネルはそれを認識しないため、syscall は失敗します |
チャレンジ
改行が続く値 'OK'を持つmessageという文字列が与えられています。ファイルディスクリプタを画面(stdout)に出力するよう設定するコード行を書いてください。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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド