File Descriptor (rdi)
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy. Lektion 36 von 45.
In der vorherigen Lektion hast du mov rdi, 1 als Teil des write-Systemaufrufs verwendet. Diese Zahl 1 wird als Dateideskriptor bezeichnet.
Ein Dateideskriptor ist eine Zahl, die dem Betriebssystem mitteilt, wohin es die Daten senden soll.
Die drei Standard-Dateideskriptoren unter Linux:
| Dateideskriptor | Name | Wohin die Daten gehen |
|---|---|---|
| 0 | stdin | Tastatureingabe (Daten vom Benutzer einlesen) |
| 1 | stdout | Bildschirmausgabe (normale Programmausgabe) |
| 2 | stderr | Bildschirmausgabe (Fehlermeldungen) |
Warum gibt es zwei Ausgaben für den Bildschirm?
Die normale Ausgabe (stdout) und die Fehlerausgabe (stderr) werden auf demselben Bildschirm angezeigt, aber getrennt behandelt. Dadurch kannst du:
- Die normale Ausgabe in eine Datei umleiten und trotzdem die Fehler auf dem Bildschirm sehen
- Fehler anzeigen, selbst wenn die normale Ausgabe ausgeblendet ist
Zum Ausgeben in diesem Kurs:
Du verwendest zum Ausgeben von Meldungen immer den Dateideskriptor 1 (stdout). stderr brauchst du vorerst nicht.
Beispiel:
mov rdi, 1 ; Ausgabe an stdout (den Bildschirm) sendenWas passiert, wenn du den falschen Dateideskriptor verwendest?
| Wenn du verwendest | Ergebnis |
|---|---|
| 0 (stdin) | Der Systemaufruf schlägt fehl, wenn die Eingabe aus einer Pipe oder einer Datei kommt. In einem Terminal wird der Text normalerweise trotzdem ausgegeben, aber stdin ist für die Eingabe und nicht für die Ausgabe gedacht |
| 2 (stderr) | Funktioniert wie stdout (gibt Text auf dem Bildschirm aus), ist aber für Fehlermeldungen gedacht |
| Eine beliebige andere Zahl | Der Kernel erkennt sie nicht: Der Systemaufruf schlägt fehl |
Aufgabe
Dir wird eine Zeichenkette namens message mit dem Wert 'OK' gefolgt von einem Zeilenumbruch gegeben. Schreibe die Codezeile, die den Dateideskriptor so setzt, dass auf dem Bildschirm ausgegeben wird (stdout). Schreibe nur die mov-Anweisung für rdi.
Probier es selbst
section .data
message db 'OK', 0x0a
msgLen equ $ - message
section .text
global _start
_start:
; Der Lernende setzt hier den Dateideskriptor
%include "solution.asm"
mov rax, 1
; rdi sollte bereits vom Lernenden gesetzt worden sein
mov rsi, message
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscallDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Die Maschine
Was ist eine CPUSpeicherRegister vs. SpeicherWie Befehle funktionierenZwei-Dateien-MusterDie x86-64 Architektur3Erster Befehl - MOV
Was ist MOV?MOV ImmediateMOV Register zu RegisterMOV Speicher zu RegisterMOV Register zu SpeicherLEA - Adresse ladenMOV mit verschiedenen GrößenÜbung: Register tauschenRückblick: MOV Challenge6Write-Syscall
Write-Syscall (1)File Descriptor (rdi)Pufferadresse (rsi)Byte-Anzahl (rdx)Alles zusammenfügenZwei Strings ausgebenNewline ist wichtigRückblick: Write-SetupÜbe selbstständig: Assembly-Playground