Montaj - Dosya Yönetimi
Sistem, herhangi bir girdi veya çıktı verisini bayt akışı olarak kabul eder. Üç standart dosya akışı vardır -
- Standart giriş (stdin),
- Standart çıktı (standart çıktı) ve
- Standart hata (stderr).
Dosya Tanımlayıcı
Bir file descriptorbir dosyaya dosya kimliği olarak atanan 16 bitlik bir tamsayıdır. Yeni bir dosya oluşturulduğunda veya mevcut bir dosya açıldığında, dosyaya erişmek için dosya tanımlayıcı kullanılır.
Standart dosya akışlarının dosya tanımlayıcısı - stdin, stdout ve stderr sırasıyla 0, 1 ve 2'dir.
Dosya İşaretçisi
Bir file pointerbayt cinsinden dosyada sonraki bir okuma / yazma işleminin konumunu belirtir. Her dosya bir bayt dizisi olarak kabul edilir. Her açık dosya, dosyanın başlangıcına göre bayt cinsinden bir kayma belirten bir dosya işaretçisi ile ilişkilendirilir. Bir dosya açıldığında, dosya işaretçisi sıfıra ayarlanır.
Dosya İşleme Sistemi Çağrıları
Aşağıdaki tablo dosya işlemeyle ilgili sistem çağrılarını kısaca açıklamaktadır -
% eax | İsim | % ebx | % ecx | % edx |
---|---|---|---|---|
2 | sys_fork | struct pt_regs | - | - |
3 | sys_read | imzasız int | karakter * | size_t |
4 | sys_write | imzasız int | const karakter * | size_t |
5 | sys_open | const karakter * | int | int |
6 | sys_close | imzasız int | - | - |
8 | sys_creat | const karakter * | int | - |
19 | sys_lseek | imzasız int | off_t | imzasız int |
Sistem çağrılarını kullanmak için gerekli adımlar, daha önce tartıştığımız gibi aynıdır -
- Sistem çağrı numarasını EAX kaydına girin.
- Sistem çağrısındaki argümanları EBX, ECX vb. Kayıtlarında saklayın.
- İlgili kesmeyi arayın (80h).
- Sonuç genellikle EAX kaydına döndürülür.
Dosya Oluşturma ve Açma
Bir dosya oluşturmak ve açmak için aşağıdaki görevleri gerçekleştirin -
- EAX kaydına 8 numaralı sys_creat () sistem çağrısını koyun.
- Dosya adını EBX yazmacına koyun.
- Dosya izinlerini ECX kaydına koyun.
Sistem çağrısı, EAX kaydında oluşturulan dosyanın dosya tanımlayıcısını döndürür; hata durumunda, hata kodu EAX kaydındadır.
Varolan bir Dosyayı Açmak
Mevcut bir dosyayı açmak için aşağıdaki görevleri gerçekleştirin -
- EAX kaydına 5 numaralı sys_open () numaralı sistem çağrısını koyun.
- Dosya adını EBX yazmacına koyun.
- Dosya erişim modunu ECX kaydına koyun.
- Dosya izinlerini EDX kaydına koyun.
Sistem çağrısı, EAX kaydında oluşturulan dosyanın dosya tanımlayıcısını döndürür; hata durumunda, hata kodu EAX kaydındadır.
Dosya erişim modları arasında en yaygın olarak kullanılanlar şunlardır: salt okunur (0), salt yazılır (1) ve okuma-yazma (2).
Dosyadan Okuma
Bir dosyadan okumak için aşağıdaki görevleri gerçekleştirin -
EAX kaydına 3 numaralı sys_read () sistem çağrısını koyun.
Dosya tanımlayıcısını EBX yazmacına koyun.
İşaretçiyi ECX yazmacındaki giriş arabelleğine koyun.
Tampon boyutunu, yani okunacak bayt sayısını EDX yazmacına koyun.
Sistem çağrısı, EAX kaydında okunan bayt sayısını döndürür, hata durumunda, hata kodu EAX kaydındadır.
Dosyaya Yazmak
Bir dosyaya yazmak için aşağıdaki görevleri gerçekleştirin -
EAX kaydına 4 numaralı sys_write () sistem çağrısını koyun.
Dosya tanımlayıcısını EBX yazmacına koyun.
İşaretçiyi ECX yazmacındaki çıktı tamponuna koyun.
Tampon boyutunu, yani yazılacak bayt sayısını EDX yazmacına koyun.
Sistem çağrısı, EAX kaydına yazılan gerçek bayt sayısını döndürür, hata durumunda, hata kodu EAX kaydındadır.
Bir Dosyayı Kapatmak
Bir dosyayı kapatmak için aşağıdaki görevleri gerçekleştirin -
- EAX kaydına sys_close () numarası 6 olan sistem çağrısını koyun.
- Dosya tanımlayıcısını EBX yazmacına koyun.
Sistem çağrısı, hata durumunda EAX kaydındaki hata kodunu döndürür.
Bir Dosyayı Güncelleme
Bir dosyayı güncellemek için aşağıdaki görevleri gerçekleştirin -
- EAX kaydına sys_lseek () 19 numaralı sistem çağrısını koyun.
- Dosya tanımlayıcısını EBX yazmacına koyun.
- Ofset değerini ECX kaydına koyun.
- Ofset için referans konumunu EDX kaydına koyun.
Referans konumu şunlar olabilir:
- Dosyanın başlangıcı - değer 0
- Geçerli konum - değer 1
- Dosya sonu - değer 2
Sistem çağrısı, hata durumunda EAX kaydındaki hata kodunu döndürür.
Misal
Aşağıdaki program, myfile.txt adlı bir dosya oluşturup açar ve bu dosyaya bir 'Tutorials Point'e Hoş Geldiniz' metni yazar. Daha sonra, program dosyadan okur ve verileri info adlı bir arabelleğe kaydeder . Son olarak, bilgi içinde depolanan metni görüntüler .
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
;create the file
mov eax, 8
mov ebx, file_name
mov ecx, 0777 ;read, write and execute by all
int 0x80 ;call kernel
mov [fd_out], eax
; write into the file
mov edx,len ;number of bytes
mov ecx, msg ;message to write
mov ebx, [fd_out] ;file descriptor
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
; close the file
mov eax, 6
mov ebx, [fd_out]
; write the message indicating end of file write
mov eax, 4
mov ebx, 1
mov ecx, msg_done
mov edx, len_done
int 0x80
;open the file for reading
mov eax, 5
mov ebx, file_name
mov ecx, 0 ;for read only access
mov edx, 0777 ;read, write and execute by all
int 0x80
mov [fd_in], eax
;read from file
mov eax, 3
mov ebx, [fd_in]
mov ecx, info
mov edx, 26
int 0x80
; close the file
mov eax, 6
mov ebx, [fd_in]
int 0x80
; print the info
mov eax, 4
mov ebx, 1
mov ecx, info
mov edx, 26
int 0x80
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
file_name db 'myfile.txt'
msg db 'Welcome to Tutorials Point'
len equ $-msg
msg_done db 'Written to file', 0xa
len_done equ $-msg_done
section .bss
fd_out resb 1
fd_in resb 1
info resb 26
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
Written to file
Welcome to Tutorials Point