Menu
Coddy logo textTech

File Descriptor (rdi)

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

前回のレッスンでは、writeシステムコールの一部としてmov rdi, 1を使用しました。その数値1は、ファイルディスクリプタと呼ばれます。

ファイルディスクリプタは、オペレーティングシステムにデータの送信先がどこであるかを伝える数値です。

Linuxにおける3つの標準ファイル記述子(ファイルディスクリプタ):

ファイル記述子名前データの出力先
0stdinキーボード入力(ユーザーからのデータの読み取り)
1stdout画面出力(通常のプログラム出力)
2stderr画面出力(エラーメッセージ)

なぜ画面に2つの出力があるのでしょうか?

標準出力 (stdout) と標準エラー出力 (stderr) は同じ画面に表示されますが、別々に扱われます。これにより、以下のことが可能になります:

  • エラーを画面で確認しながら、標準出力をファイルにリダイレクトする
  • 標準出力が非表示の場合でもエラーを表示する

このコースでの出力について:

メッセージを出力するには、常にファイル記述子 1 (stdout) を使用します。stderr はまだ必要ありません。

例:

mov rdi, 1      ; 出力をstdout(画面)に送信する

誤ったファイル記述子を使用するとどうなりますか?

使用するもの結果
0 (stdin)writeシステムコールは出力ではなく入力を期待するため、失敗するか何もしません
2 (stderr)stdoutのように動作しますが(画面に表示される)、エラー用として意図されています
その他の数値カーネルがそれを認識しないため、システムコールが失敗します
challenge icon

チャレンジ

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
quiz icon腕試し

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

基礎のすべてのレッスン