Perakitan - Manajemen File

Sistem menganggap data masukan atau keluaran sebagai aliran byte. Ada tiga aliran file standar -

  • Masukan standar (stdin),
  • Output standar (stdout), dan
  • Kesalahan standar (stderr).

Deskriptor File

SEBUAH file descriptoradalah integer 16-bit yang ditetapkan ke file sebagai id file. Saat file baru dibuat atau file yang sudah ada dibuka, deskriptor file digunakan untuk mengakses file.

Deskriptor file dari aliran file standar - stdin, stdout dan stderr adalah 0, 1 dan 2, masing-masing.

Penunjuk File

SEBUAH file pointermenentukan lokasi untuk operasi baca / tulis berikutnya dalam file dalam satuan byte. Setiap file dianggap sebagai urutan byte. Setiap file yang terbuka dikaitkan dengan penunjuk file yang menentukan offset dalam byte, relatif terhadap awal file. Saat file dibuka, penunjuk file diatur ke nol.

Panggilan Sistem Penanganan File

Tabel berikut menjelaskan secara singkat panggilan sistem yang terkait dengan penanganan file -

% eax Nama % ebx % ecx % edx
2 sys_fork struct pt_regs - -
3 sys_read unsigned int char * size_t
4 sys_write unsigned int const char * size_t
5 sys_open const char * int int
6 sys_close unsigned int - -
8 sys_creat const char * int -
19 sys_lseek unsigned int off_t unsigned int

Langkah-langkah yang diperlukan untuk menggunakan panggilan sistem sama, seperti yang kita bahas sebelumnya -

  • Masukkan nomor panggilan sistem di register EAX.
  • Simpan argumen ke panggilan sistem di register EBX, ECX, dll.
  • Panggil interupsi yang relevan (80 jam).
  • Hasilnya biasanya dikembalikan dalam register EAX.

Membuat dan Membuka File

Untuk membuat dan membuka file, lakukan tugas berikut -

  • Letakkan sistem call sys_creat () nomor 8, di register EAX.
  • Masukkan nama file di register EBX.
  • Masukkan izin file ke register ECX.

Panggilan sistem mengembalikan deskriptor file dari file yang dibuat dalam register EAX, jika terjadi kesalahan, kode kesalahan ada dalam register EAX.

Membuka File yang Ada

Untuk membuka file yang sudah ada, lakukan tugas berikut -

  • Letakkan system call sys_open () nomor 5, di register EAX.
  • Masukkan nama file di register EBX.
  • Letakkan mode akses file di register ECX.
  • Letakkan izin file di register EDX.

Panggilan sistem mengembalikan deskriptor file dari file yang dibuat dalam register EAX, jika terjadi kesalahan, kode kesalahan ada dalam register EAX.

Di antara mode akses file, yang paling umum digunakan adalah: read-only (0), write-only (1), dan read-write (2).

Membaca dari File

Untuk membaca dari file, lakukan tugas berikut -

  • Letakkan system call sys_read () nomor 3, di register EAX.

  • Letakkan deskriptor file di register EBX.

  • Letakkan penunjuk ke buffer input di register ECX.

  • Letakkan ukuran buffer, yaitu jumlah byte yang akan dibaca, di register EDX.

Panggilan sistem mengembalikan jumlah byte yang dibaca di register EAX, jika terjadi kesalahan, kode kesalahan ada di register EAX.

Menulis ke File

Untuk menulis ke file, lakukan tugas berikut -

  • Letakkan system call sys_write () number 4, di register EAX.

  • Letakkan deskriptor file di register EBX.

  • Letakkan penunjuk ke buffer keluaran di register ECX.

  • Letakkan ukuran buffer, yaitu jumlah byte yang akan ditulis, di register EDX.

Panggilan sistem mengembalikan jumlah sebenarnya dari byte yang ditulis dalam register EAX, jika terjadi kesalahan, kode kesalahan ada dalam register EAX.

Menutup File

Untuk menutup file, lakukan tugas berikut -

  • Letakkan system call sys_close () number 6, di register EAX.
  • Letakkan deskriptor file di register EBX.

Panggilan sistem kembali, jika terjadi kesalahan, kode kesalahan dalam register EAX.

Memperbarui File

Untuk memperbarui file, lakukan tugas berikut -

  • Letakkan sistem call sys_lseek () nomor 19, di register EAX.
  • Letakkan deskriptor file di register EBX.
  • Masukkan nilai offset ke register ECX.
  • Letakkan posisi referensi untuk offset di register EDX.

Posisi referensi bisa jadi:

  • Awal file - nilai 0
  • Posisi saat ini - nilai 1
  • Akhir file - nilai 2

Panggilan sistem kembali, jika terjadi kesalahan, kode kesalahan dalam register EAX.

Contoh

Program berikut membuat dan membuka file bernama myfile.txt , dan menulis teks 'Selamat Datang di Tutorial Point' di file ini. Selanjutnya, program membaca dari file dan menyimpan data ke dalam buffer bernama info . Terakhir, ini menampilkan teks seperti yang disimpan dalam info .

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

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Written to file
Welcome to Tutorials Point