Assembly - Quản lý tệp

Hệ thống coi bất kỳ dữ liệu đầu vào hoặc đầu ra nào dưới dạng luồng byte. Có ba luồng tệp tiêu chuẩn -

  • Đầu vào chuẩn (stdin),
  • Đầu ra tiêu chuẩn (stdout), và
  • Lỗi chuẩn (stderr).

Trình mô tả tệp

A file descriptorlà một số nguyên 16 bit được gán cho một tệp dưới dạng id tệp. Khi một tệp mới được tạo hoặc một tệp hiện có được mở, bộ mô tả tệp được sử dụng để truy cập tệp.

Bộ mô tả tệp của các luồng tệp tiêu chuẩn - stdin, stdoutstderr lần lượt là 0, 1 và 2.

Con trỏ tệp

A file pointerchỉ định vị trí cho thao tác đọc / ghi tiếp theo trong tệp theo byte. Mỗi tệp được coi là một chuỗi các byte. Mỗi tệp đang mở được liên kết với một con trỏ tệp chỉ định độ lệch tính bằng byte, liên quan đến phần đầu của tệp. Khi một tệp được mở, con trỏ tệp được đặt thành không.

Cuộc gọi hệ thống xử lý tệp

Bảng sau đây mô tả ngắn gọn các lệnh gọi hệ thống liên quan đến xử lý tệp:

% eax Tên % ebx % ecx % edx
2 sys_fork struct pt_regs - -
3 sys_read int không dấu char * size_t
4 sys_write int không dấu const char * size_t
5 sys_open const char * int int
6 sys_close int không dấu - -
số 8 sys_creat const char * int -
19 sys_lseek int không dấu off_t int không dấu

Các bước cần thiết để sử dụng lệnh gọi hệ thống giống như chúng ta đã thảo luận trước đó -

  • Đặt số cuộc gọi hệ thống vào sổ đăng ký EAX.
  • Lưu trữ các đối số cho lệnh gọi hệ thống trong thanh ghi EBX, ECX, v.v.
  • Gọi ngắt liên quan (80h).
  • Kết quả thường được trả về trong thanh ghi EAX.

Tạo và mở tệp

Để tạo và mở tệp, hãy thực hiện các tác vụ sau:

  • Đặt lệnh gọi hệ thống sys_creat () số 8, vào thanh ghi EAX.
  • Đặt tên tệp vào sổ đăng ký EBX.
  • Đặt quyền tệp vào thanh ghi ECX.

Lệnh gọi hệ thống trả về bộ mô tả tệp của tệp được tạo trong thanh ghi EAX, trong trường hợp lỗi, mã lỗi nằm trong thanh ghi EAX.

Mở một tệp hiện có

Để mở tệp hiện có, hãy thực hiện các tác vụ sau:

  • Đặt lệnh gọi hệ thống sys_open () số 5, vào thanh ghi EAX.
  • Đặt tên tệp vào sổ đăng ký EBX.
  • Đặt chế độ truy cập tệp vào thanh ghi ECX.
  • Đặt quyền tệp vào thanh ghi EDX.

Lệnh gọi hệ thống trả về bộ mô tả tệp của tệp được tạo trong thanh ghi EAX, trong trường hợp lỗi, mã lỗi nằm trong thanh ghi EAX.

Trong số các chế độ truy cập tệp, thường được sử dụng nhất là: chỉ đọc (0), chỉ ghi (1) và đọc-ghi (2).

Đọc từ một tệp

Để đọc từ một tệp, hãy thực hiện các tác vụ sau:

  • Đặt lệnh gọi hệ thống sys_read () số 3, vào thanh ghi EAX.

  • Đặt bộ mô tả tệp vào thanh ghi EBX.

  • Đặt con trỏ vào bộ đệm đầu vào trong thanh ghi ECX.

  • Đặt kích thước bộ đệm, tức là số byte cần đọc, vào thanh ghi EDX.

Lệnh gọi hệ thống trả về số byte được đọc trong thanh ghi EAX, trong trường hợp lỗi, mã lỗi nằm trong thanh ghi EAX.

Ghi vào tệp

Để ghi vào tệp, hãy thực hiện các tác vụ sau:

  • Đặt lệnh gọi hệ thống sys_write () số 4, vào thanh ghi EAX.

  • Đặt bộ mô tả tệp vào thanh ghi EBX.

  • Đặt con trỏ đến bộ đệm đầu ra trong thanh ghi ECX.

  • Đặt kích thước bộ đệm, tức là số byte cần ghi, vào thanh ghi EDX.

Lệnh gọi hệ thống trả về số byte thực tế được ghi trong thanh ghi EAX, trong trường hợp lỗi, mã lỗi nằm trong thanh ghi EAX.

Đóng tệp

Để đóng tệp, hãy thực hiện các tác vụ sau:

  • Đặt lệnh gọi hệ thống sys_close () số 6, vào thanh ghi EAX.
  • Đặt bộ mô tả tệp vào thanh ghi EBX.

Lệnh gọi hệ thống trả về, trong trường hợp có lỗi, mã lỗi trong thanh ghi EAX.

Cập nhật tệp

Để cập nhật tệp, hãy thực hiện các tác vụ sau:

  • Đặt lệnh gọi hệ thống sys_lseek () số 19, vào thanh ghi EAX.
  • Đặt bộ mô tả tệp vào thanh ghi EBX.
  • Đặt giá trị bù vào thanh ghi ECX.
  • Đặt vị trí tham chiếu cho độ lệch trong thanh ghi EDX.

Vị trí tham chiếu có thể là:

  • Bắt đầu tệp - giá trị 0
  • Vị trí hiện tại - giá trị 1
  • Cuối tệp - giá trị 2

Lệnh gọi hệ thống trả về, trong trường hợp có lỗi, mã lỗi trong thanh ghi EAX.

Thí dụ

Chương trình sau tạo và mở một tệp có tên myfile.txt , và viết văn bản 'Chào mừng đến với Điểm Hướng dẫn' vào tệp này. Tiếp theo, chương trình đọc từ tệp và lưu trữ dữ liệu vào một bộ đệm có tên là thông tin . Cuối cùng, nó hiển thị văn bản như được lưu trữ trong thông tin .

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

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Written to file
Welcome to Tutorials Point