Menu
Coddy logo textTech

File Descriptor (rdi)

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

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

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

Linux における 3 つの標準ファイルディスクリプター:

ファイルディスクリプター名前データの送信先
0stdinキーボード入力(ユーザーからデータを読み取る)
1stdout画面出力(通常のプログラム出力)
2stderr画面出力(エラーメッセージ)

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

通常の出力(stdout)とエラー出力(stderr)は同じ画面に表示されますが、それぞれ別々に扱われます。これにより、次のことができます:

  • エラーを画面に表示したまま、通常の出力をファイルにリダイレクトする
  • 通常の出力が非表示の場合でもエラーを表示する

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

メッセージを出力する際は、常にファイルディスクリプタ 1(stdout)を使用します。まだ stderr は必要ありません。

例:

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

間違ったファイルディスクリプタを使うとどうなりますか?

使用する場合結果
0 (stdin)write syscall は入力を想定しており、出力ではありません。失敗するか、何も行いません
2 (stderr)stdout と同じように動作します(画面に出力します)が、エラー用です
その他の番号カーネルはそれを認識しないため、syscall は失敗します
challenge icon

チャレンジ

改行が続く値 '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
quiz icon腕試し

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

基礎のすべてのレッスン

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