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