همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. مدیریت فایل در زبان اسمبلی (Assembly) شامل ایجاد و باز کردن، خواندن از یک فایل، بستن، به روز رسانی و نوشتن به یک فایل است. البته در ابتدا با مفهوم File Descriptor و فراخوان های سیستمی آشنا خواهیم شد.
سیستم هر داده ورودی یا خروجی را به عنوان جریان بایت در نظر می گیرد. سه جریان فایل استاندارد وجود دارد.
ورودی استاندارد (stdin)
خروجی استاندارد (stdout)
خطای استاندارد (stderr)
File Descriptor یک عدد صحیح ۱۶ بیتی است که به عنوان شناسه فایل به یک فایل اختصاص داده می شود. هنگامی که یک فایل جدید ایجاد شده یا یک فایل موجود باز می شود ، از تFile Descriptor برای دسترسی به فایل استفاده می شود.
File Descriptor جریان های استاندارد stdin ، stdout و stderr به ترتیب ۰ ، ۱ و ۲ هستند.
اشاره گر فایل (File Pointer)
یک اشاره گر فایل مکان را برای یک عمل خواندن یا نوشتن بعدی در فایل از نظر بایت مشخص می کند. هر فایل به عنوان دنباله ای از بایت در نظر گرفته می شود. هر فایل باز با یک اشاره گر فایل همراه است که offset در بایت ها را مشخص می کند ، نسبت به ابتدای فایل. با باز کردن فایل، اشاره گر فایل روی صفر تنظیم می شود.
در جدول زیر به طور خلاصه فراخوان های سیستمی مربوط به file handling توضیح داده شده است.
eax% | Name | ebx% | ecx% | edx% |
---|---|---|---|---|
۲ | sys_fork | struct pt_regs | – | – |
۳ | sys_read | unsigned int | char * | size_t |
۴ | sys_write | unsigned int | const char * | size_t |
۵ | sys_open | const char * | int | int |
۶ | sys_close | unsigned int | – | – |
۸ | sys_creat | const char * | int | – |
۱۹ | sys_lseek | unsigned int | off_t | unsigned int |
با مدیریت فایل در زبان اسمبلی (Assembly) همراه هستیم.
مراحل مورد نیاز برای استفاده از فراخوان های سیستم یکسان است ، همان طور که قبلاً در مورد آن صحبت کردیم.
برای ایجاد و باز کردن فایل، کارهای زیر را باید انجام دهید.
فراخوان سیستم توصیف گر فایل (file descriptor) ایجاد شده را در ثبات EAX برمی گرداند ، در صورت بروز خطا ، کد خطا در ثبات EAX است.
برای باز کردن فایل موجود ، موارد زیر را باید انجام دهید.
فراخوان سیستم توصیف گر فایل ایجاد شده را در ثبات EAX برمی گرداند ، در صورت بروز خطا ، کد خطا در ثبات EAX است.
در بین حالت های دستیابی به فایل ، متداول ترین آن ها عبارتند از: (read-only (0) , write-only (1) و (read-write (2
برای خواندن از یک فایل ، کارهای زیر را باید انجام دهید.
system call تعداد بایت های خوانده شده در ثبات EAX را برمی گرداند ، در صورت بروز خطا ، کد خطا در EAX ثبت می شود.
برای نوشتن روی فایل، کارهای زیر را باید انجام دهید.
فراخوان سیستم تعداد واقعی بایت های نوشته شده در ثبات EAX را برمی گرداند ، در صورت بروز خطا ، کد خطا در ثبت EAX است.
برای بستن فایل، کارهای زیر را باید انجام دهید.
فراخوان سیستم در صورت بروز خطا ، کد خطا در ثبات EAX را برمی گرداند.
برای به روز کردن فایل ، کارهای زیر را باید انجام دهید.
موقعیت منبع می تواند:
فراخوان سیستم در صورت بروز خطا ، کد خطا در ثبت EAX را برمی گرداند.
برنامه زیر فایلی به نام myfile.txt ایجاد و باز می کند و متن ‘Welcome to Tutorials Point’ را در این فایل می نویسد. در مرحله بعد ، برنامه از فایل خوانده می شود و داده ها را در یک بافر به نام info ذخیره می کند. در آخر ، متن را به صورت ذخیره شده در info نمایش می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | 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 |
هنگامی که کد فوق کامپایل و اجرا می شود ، نتیجه ی زیر را ایجاد می کند.
1 2 | Written to file Welcome to Tutorials Point |
مدیریت فایل در زبان اسمبلی (Assembly) را به پایان می رسانیم.
مدیریت فایل در زبان اسمبلی (Assembly) که شامل ایجاد و باز کردن فایل ها، بستن، خواندن از یک فایل، به روز رسانی و نوشتن به یک فایل است را به همراه مفهوم File Descriptor و فراخوان های سیستمی دنبال نمودیم. در جلسه ی آینده با مبحث مدیریت حافظه (Memory Management) در خدمتتون خواهیم بود. با ادامه ی آموزش زبان اسمبلی (Assembly) از وب سایت آموزشی پی وی لرن همراه باشید.