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, stdout và stderr 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