Dosya Tanımlayıcı (rdi)
Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası — ders 36 / 45.
Önceki derste, write syscall'unun bir parçası olarak mov rdi, 1 kullandınız. Bu 1 sayısı, bir dosya tanımlayıcı (file descriptor) olarak adlandırılır.
Dosya tanımlayıcı, işletim sistemine verinin nereye gönderileceğini söyleyen bir sayıdır.
Linux'taki üç standart dosya tanımlayıcısı:
| Dosya tanımlayıcısı | Ad | Verinin gittiği yer |
|---|---|---|
| 0 | stdin | Klavye girişi (kullanıcıdan veri okuma) |
| 1 | stdout | Ekran çıktısı (normal program çıktısı) |
| 2 | stderr | Ekran çıktısı (hata mesajları) |
Ekran için neden iki çıktı var?
Normal çıktı (stdout) ve hata çıktısı (stderr) aynı ekrana gider, ancak bunlar ayrı ayrı ele alınır. Bu şunları yapmanıza olanak tanır:
- Hataları ekranda görmeye devam ederken normal çıktıyı bir dosyaya yönlendirmek
- Normal çıktı gizlendiğinde bile hataları göstermek
Bu kursta yazdırma işlemi için:
Mesajları yazdırmak için her zaman 1 (stdout) dosya tanımlayıcısını kullanacaksınız. Henüz stderr'e ihtiyacınız yok.
Örnek:
mov rdi, 1 ; çıktıyı stdout'a (ekrana) gönderYanlış dosya tanımlayıcısı (file descriptor) kullanırsanız ne olur?
| Kullanılan | Sonuç |
|---|---|
| 0 (stdin) | write syscall çıktı değil, girdi bekler — başarısız olur veya hiçbir şey yapmaz |
| 2 (stderr) | stdout gibi çalışır (ekrana yazdırır), ancak hatalar için tasarlanmıştır |
| Başka herhangi bir sayı | Çekirdek (kernel) bunu tanımaz — syscall başarısız olur |
Görev
Size, değeri 'OK' olan ve ardından bir yeni satır karakteri gelen message adlı bir dize verilmiştir. Dosya tanımlayıcısını ekrana (stdout) yazdırmak üzere ayarlayan kod satırını yazın. Yalnızca rdi için mov komutunu yazın.
Kendin dene
section .data
message db 'OK', 0x0a
msgLen equ $ - message
section .text
global _start
_start:
; Öğrenci dosya tanımlayıcıyı burada ayarlar
%include "solution.asm"
mov rax, 1
; rdi zaten öğrenci tarafından ayarlanmış olmalıdır
mov rsi, message
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscallBu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Temeller bölümündeki tüm dersler
3İlk komut - MOV
MOV nedir?MOV Anlık DeğerMOV Yazmaçtan YazmacaMOV Bellekten YazmacaMOV Yazmaçtan BelleğeLEA - Adres YüklemeFarklı Boyutlarla MOVPratik: Yazmaçları Takas EtmeÖzet: MOV Meydan Okuması6Write Syscall
Write Syscall (1)Dosya Tanımlayıcı (rdi)Buffer Adresi (rsi)Bayt Sayısı (rdx)Hepsini Bir Araya Getirmeİki String YazdırmaYeni Satırın ÖnemiÖzet: Write Hazırlığı