Dosya Tanımlayıcı (rdi)
Coddy'nin Assembly Journey'sinin Temel Bilgiler bölümünün bir parçası. Ders 36 / 45.
Önceki derste, write sistem çağrısının bir parçası olarak mov rdi, 1 kullandınız. 1 sayısına dosya tanımlayıcısı adı verilir.
Dosya tanımlayıcısı, işletim sistemine verileri nereye göndereceğini söyleyen bir sayıdır.
Linux'taki üç standart dosya tanımlayıcısı:
| Dosya tanımlayıcısı | Ad | Verilerin 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 ayrı ayrı işlenirler. Bu, şunları yapmanızı sağlar:
- Ekranda hataları görmeye devam ederken normal çıktıyı bir dosyaya yönlendirmek
- Normal çıktı gizlendiğinde bile hataları göstermek
Bu kursta yazdırma için:
Mesajları yazdırmak için her zaman 1 (stdout) dosya tanımlayıcısını kullanacaksın. Henüz stderr'e ihtiyacın yok.
Örnek:
mov rdi, 1 ; çıktıyı stdout'a gönder (ekran)Yanlış dosya tanımlayıcısını kullanırsanız ne olur?
| Şunu kullanırsanız | Sonuç |
|---|---|
| 0 (stdin) | write sistem çağrısı çı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 kullanılması amaçlanmıştır |
| Başka herhangi bir sayı | Çekirdek bunu tanımaz: sistem çağrısı başarısız olur |
Görev
Yeni satırın ardından 'OK' değerine sahip message adlı bir dize veriliyor. Dosya tanımlayıcısını ekrana (stdout) yazdıracak şekilde ayarlayan kod satırını yazın. Yalnızca rdi için mov yönergesini yazın.
Kendin dene
section .data
message db 'OK', 0x0a
msgLen equ $ - message
section .text
global _start
_start:
; Öğrenci dosya tanımlayıcısını burada ayarlar
%include "solution.asm"
mov rax, 1
; rdi zaten öğrenci tarafından ayarlanmış olmalı
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.
Temel Bilgiler 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ığıKendi başına pratik yap: Assembly playground