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 wskazuje systemowi operacyjnemu, 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 (standardowe dane wyjściowe programu) |
| 2 | stderr | Dane wyjściowe na ekranie (komunikaty o błędach) |
Dlaczego są dwa wyjścia na ekran?
Zwykłe wyjście (stdout) i wyjście błędów (stderr) trafiają na ten sam ekran, ale są traktowane oddzielnie. 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 wypisywania w tym kursie:
Do wypisywania komunikatów zawsze będziesz używać deskryptora pliku 1 (stdout). Na razie nie potrzebujesz stderr.
Przykład:
mov rdi, 1 ; wyślij dane wyjściowe na stdout (ekran)Co się stanie, jeśli użyjesz niewłaściwego deskryptora pliku?
| Jeśli użyjesz | Wynik |
|---|---|
| 0 (stdin) | Wywołanie systemowe zapisu oczekuje danych wejściowych, a nie wyjściowych: zakończy się niepowodzeniem lub nic nie zrobi |
| 2 (stderr) | Działa jak stdout (wypisuje na ekranie), ale jest przeznaczony do błędów |
| Dowolnej innej liczby | Jądro jej 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, aby wypisywać na ekran (stdout). Napisz tylko instrukcję mov dla rdi.
Spróbuj swoich sił
section .data
message db 'OK', 0x0a
msgLen equ $ - message
section .text
global _start
_start:
; Uczeń ustawia tutaj deskryptor pliku
%include "solution.asm"
mov rax, 1
; rdi powinien być już ustawiony przez ucznia
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