การประกอบ - การจัดการไฟล์
ระบบจะพิจารณาข้อมูลอินพุตหรือเอาต์พุตเป็นสตรีมไบต์ มีสตรีมไฟล์มาตรฐานสามไฟล์ -
- อินพุตมาตรฐาน (stdin)
- เอาต์พุตมาตรฐาน (stdout) และ
- ข้อผิดพลาดมาตรฐาน (stderr)
ตัวอธิบายไฟล์
ก file descriptorคือจำนวนเต็ม 16 บิตที่กำหนดให้กับไฟล์เป็น ID ไฟล์ เมื่อสร้างไฟล์ใหม่หรือเปิดไฟล์ที่มีอยู่ตัวอธิบายไฟล์จะถูกใช้เพื่อเข้าถึงไฟล์
ตัวอธิบายไฟล์ของสตรีมไฟล์มาตรฐาน - stdin, stdout และ stderr คือ 0, 1 และ 2 ตามลำดับ
ตัวชี้ไฟล์
ก file pointerระบุตำแหน่งสำหรับการดำเนินการอ่าน / เขียนที่ตามมาในไฟล์ในรูปของไบต์ แต่ละไฟล์ถือเป็นลำดับไบต์ ไฟล์ที่เปิดแต่ละไฟล์เชื่อมโยงกับตัวชี้ไฟล์ที่ระบุออฟเซ็ตเป็นไบต์โดยสัมพันธ์กับจุดเริ่มต้นของไฟล์ เมื่อเปิดไฟล์ตัวชี้ไฟล์จะถูกตั้งค่าเป็นศูนย์
ระบบจัดการไฟล์โทร
ตารางต่อไปนี้อธิบายสั้น ๆ เกี่ยวกับการเรียกระบบที่เกี่ยวข้องกับการจัดการไฟล์ -
% eax | ชื่อ | % ebx | % ecx | % edx |
---|---|---|---|---|
2 | sys_fork | โครงสร้าง pt_regs | - | - |
3 | sys_read | int ที่ไม่ได้ลงนาม | ถ่าน * | size_t |
4 | sys_write | int ที่ไม่ได้ลงนาม | const ถ่าน * | size_t |
5 | sys_open | const ถ่าน * | int | int |
6 | sys_close | int ที่ไม่ได้ลงนาม | - | - |
8 | sys_creat | const ถ่าน * | int | - |
19 | sys_lseek | int ที่ไม่ได้ลงนาม | off_t | int ที่ไม่ได้ลงนาม |
ขั้นตอนที่จำเป็นสำหรับการใช้การเรียกระบบนั้นเหมือนกันดังที่เราได้กล่าวไว้ก่อนหน้านี้ -
- ใส่หมายเลขการโทรของระบบในทะเบียน EAX
- จัดเก็บอาร์กิวเมนต์สำหรับการเรียกระบบในการลงทะเบียน EBX, ECX และอื่น ๆ
- โทรไปที่การขัดจังหวะที่เกี่ยวข้อง (80 ชม.)
- โดยปกติผลลัพธ์จะถูกส่งกลับในทะเบียน EAX
การสร้างและเปิดไฟล์
สำหรับการสร้างและเปิดไฟล์ให้ดำเนินการดังต่อไปนี้ -
- ใส่การเรียกระบบ sys_creat () หมายเลข 8 ในทะเบียน EAX
- ใส่ชื่อไฟล์ในทะเบียน EBX
- ใส่สิทธิ์ของไฟล์ในทะเบียน ECX
การเรียกระบบจะส่งคืนไฟล์ descriptor ของไฟล์ที่สร้างในทะเบียน EAX ในกรณีที่เกิดข้อผิดพลาดรหัสข้อผิดพลาดจะอยู่ในทะเบียน EAX
การเปิดไฟล์ที่มีอยู่
สำหรับการเปิดไฟล์ที่มีอยู่ให้ดำเนินการดังต่อไปนี้ -
- ใส่การเรียกระบบ sys_open () หมายเลข 5 ในทะเบียน EAX
- ใส่ชื่อไฟล์ในทะเบียน EBX
- ใส่โหมดการเข้าถึงไฟล์ในทะเบียน ECX
- ใส่สิทธิ์ของไฟล์ในการลงทะเบียน EDX
การเรียกระบบจะส่งคืนไฟล์ descriptor ของไฟล์ที่สร้างในทะเบียน EAX ในกรณีที่เกิดข้อผิดพลาดรหัสข้อผิดพลาดจะอยู่ในทะเบียน EAX
ในโหมดการเข้าถึงไฟล์ที่ใช้กันมากที่สุด ได้แก่ อ่านอย่างเดียว (0) เขียนอย่างเดียว (1) และอ่าน - เขียน (2)
อ่านจากไฟล์
สำหรับการอ่านจากไฟล์ให้ดำเนินการดังต่อไปนี้ -
ใส่การเรียกระบบ sys_read () หมายเลข 3 ในทะเบียน EAX
ใส่ file descriptor ในรีจิสเตอร์ EBX
วางตัวชี้ไปที่บัฟเฟอร์อินพุตในทะเบียน ECX
ใส่ขนาดบัฟเฟอร์เช่นจำนวนไบต์ที่จะอ่านในรีจิสเตอร์ EDX
การเรียกระบบจะส่งคืนจำนวนไบต์ที่อ่านในทะเบียน EAX ในกรณีที่เกิดข้อผิดพลาดรหัสข้อผิดพลาดจะอยู่ในทะเบียน EAX
การเขียนไฟล์
สำหรับการเขียนลงไฟล์ให้ดำเนินการดังต่อไปนี้ -
ใส่การเรียกระบบ sys_write () หมายเลข 4 ในทะเบียน EAX
ใส่ file descriptor ในรีจิสเตอร์ EBX
วางตัวชี้ไปที่บัฟเฟอร์เอาต์พุตในทะเบียน ECX
ใส่ขนาดบัฟเฟอร์เช่นจำนวนไบต์ที่จะเขียนในรีจิสเตอร์ EDX
การเรียกระบบจะส่งคืนจำนวนไบต์จริงที่เขียนในทะเบียน EAX ในกรณีที่เกิดข้อผิดพลาดรหัสข้อผิดพลาดจะอยู่ในทะเบียน EAX
การปิดไฟล์
สำหรับการปิดไฟล์ให้ดำเนินการดังต่อไปนี้ -
- ใส่การเรียกระบบ sys_close () หมายเลข 6 ในทะเบียน EAX
- ใส่ file descriptor ในรีจิสเตอร์ EBX
การเรียกระบบจะส่งคืนในกรณีที่เกิดข้อผิดพลาดรหัสข้อผิดพลาดในการลงทะเบียน EAX
การอัปเดตไฟล์
สำหรับการอัปเดตไฟล์ให้ดำเนินการดังต่อไปนี้ -
- ใส่การเรียกระบบ sys_lseek () หมายเลข 19 ในทะเบียน EAX
- ใส่ file descriptor ในรีจิสเตอร์ EBX
- ใส่ค่าออฟเซ็ตในทะเบียน ECX
- วางตำแหน่งอ้างอิงสำหรับออฟเซ็ตในรีจิสเตอร์ EDX
ตำแหน่งอ้างอิงอาจเป็น:
- จุดเริ่มต้นของไฟล์ - ค่า 0
- ตำแหน่งปัจจุบัน - ค่า 1
- สิ้นสุดไฟล์ - ค่า 2
การเรียกระบบจะส่งคืนในกรณีที่เกิดข้อผิดพลาดรหัสข้อผิดพลาดในการลงทะเบียน EAX
ตัวอย่าง
โปรแกรมต่อไปนี้สร้างและเปิดไฟล์ชื่อmyfile.txtและเขียนข้อความ 'ยินดีต้อนรับสู่ Tutorials Point' ในไฟล์นี้ ถัดไปโปรแกรมอ่านจากไฟล์และเก็บข้อมูลลงในบัฟเฟอร์ชื่อข้อมูล สุดท้ายก็จะแสดงข้อความตามที่จัดเก็บไว้ในข้อมูล
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
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -
Written to file
Welcome to Tutorials Point