Deskryptor pliku (rdi)
Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 36 z 45.
W poprzedniej lekcji użyto mov rdi, 1 jako części wywołania systemowego write. Ta liczba 1 jest nazywana deskryptorem pliku.
Deskryptor pliku to liczba, która informuje system operacyjny, dokąd wysłać dane.
Trzy standardowe deskryptory plików w systemie Linux:
| Deskryptor pliku | Nazwa | Dokąd trafiają dane |
|---|---|---|
| 0 | stdin | Dane wejściowe z klawiatury (odczyt danych od użytkownika) |
| 1 | stdout | Dane wyjściowe na ekranie (normalne dane wyjściowe programu) |
| 2 | stderr | Dane wyjściowe na ekranie (komunikaty o błędach) |
Dlaczego ekran ma dwa strumienie wyjściowe?
Zwykłe wyjście (stdout) i wyjście błędów (stderr) trafiają na ten sam ekran, ale są traktowane osobno. Dzięki temu możesz:
- Przekierować zwykłe wyjście do pliku, a jednocześnie widzieć błędy na ekranie
- Wyświetlać błędy nawet wtedy, gdy zwykłe wyjście jest ukryte
Do drukowania w tym kursie:
Do drukowania komunikatów zawsze będziesz używać deskryptora pliku 1 (stdout). Na razie nie potrzebujesz stderr.
Przykład:
mov rdi, 1 ; wyślij wynik do stdout (na ekran)Co się stanie, jeśli użyjesz nieprawidłowego deskryptora pliku?
| Jeśli użyjesz | Wynik |
|---|---|
| 0 (stdin) | Wywołanie systemowe zakończy się niepowodzeniem, jeśli dane wejściowe pochodzą z potoku lub pliku. W terminalu tekst zwykle nadal zostanie wyświetlony, ale stdin służy do danych wejściowych, a nie wyjściowych |
| 2 (stderr) | Działa tak jak stdout (wyświetla tekst na ekranie), ale służy do błędów |
| Dowolny inny numer | Jądro go nie rozpoznaje: wywołanie systemowe kończy się niepowodzeniem |
Wyzwanie
Otrzymujesz ciąg znaków o nazwie message o wartości 'OK', po którym następuje znak nowej linii. Napisz wiersz kodu, który ustawia deskryptor pliku na wyświetlanie na ekranie (stdout). Zapisz tylko instrukcję mov dla rdi.
Spróbuj swoich sił
section .data
message db 'OK', 0x0a
msgLen equ $ - message
section .text
global _start
_start:
; Student ustawia tutaj deskryptor pliku
%include "solution.asm"
mov rax, 1
; rdi powinien być już ustawiony przez studenta
mov rsi, message
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscallTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
1Maszyna
Czym jest CPUPamięćRejestry a pamięćJak działają instrukcjeWzorzec dwóch plikówArchitektura x86-642Systemy liczbowe
Dlaczego system binarny?Liczby binarneZamiana z systemu dziesiętnego na binarnyDlaczego system szesnastkowy?Zamiana z systemu szesnastkowego na dziesiętnyZamiana z systemu dziesiętnego na szesnastkowyASCII i system szesnastkowy5Wywołanie systemowe zakończenia
Czym jest syscall?Wywołanie systemowe zakończenia (60)Kody zakończeniaPodsumowanie: prawidłowe zakończenie3Pierwsza instrukcja – MOV
Czym jest MOV?MOV z wartością natychmiastowąMOV między rejestramiMOV z pamięci do rejestruMOV z rejestru do pamięciLEA – załaduj adresMOV z różnymi rozmiaramiĆwiczenie: zamiana rejestrówPowtórka: wyzwanie MOV6Wywołanie systemowe write
Wywołanie systemowe write (1)Deskryptor pliku (rdi)Adres bufora (rsi)Liczba bajtów (rdx)Połączmy elementyWyświetlanie dwóch ciągówZnak nowej linii ma znaczeniePodsumowanie: konfiguracja writePoćwicz samodzielnie: Edytor online Assembly