همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. فراخوان های سیستمی (System Calls) در لینوکس مبحث این بخش ماست.
فراخوان های سیستمی API هایی برای برقرار رابطه بین فضای کاربر و فضای هسته هستند. قبلاً از system call ها استفاده کرده ایم. sys_write و sys_exit ، به ترتیب برای نوشتن روی صفحه و خروج از برنامه.
می توانید در برنامه های اسمبلی خود از فراخوان های سیستمی لینوکس استفاده کنید. برای استفاده از فراخوان های سیستمی لینوکس در برنامه خود باید مراحل زیر را انجام دهید.
شش ثبات وجود دارد که آرگومان های مورد استفاده System Call را ذخیره می کند. این ها EBX ، ECX ، EDX ، ESI ، EDI و EBP هستند. این رجیسترها آرگومان های متوالی را دریافت می کنند، با ثبات EBX شروع می شود. اگر بیش از شش آرگومان وجود داشته باشد ، مکان حافظه اولین آرگومان در ثبات EBX ذخیره می شود.
قطعه کد زیر استفاده از فراخوان سیستمی sys_exit را نشان می دهد.
1 2 | mov eax,1 ; system call number (sys_exit) int 0x80 ; call kernel |
قطعه کد زیر استفاده از فراخوان سیستمی sys_write را نشان می دهد.
1 2 3 4 5 | mov edx,4 ; message length mov ecx,msg ; message to write mov ebx,1 ; file descriptor (stdout) mov eax,4 ; system call number (sys_write) int 0x80 ; call kernel |
همه syscall ها در /usr/include/asm/unistd.h به همراه شماره آن ها ذکر شده است.
در جدول زیر برخی از فراخوان های سیستمی مورد استفاده در این آموزش را می بینید.
%eax | Name | %ebx | %ecx | %edx | %esx | %edi |
---|---|---|---|---|---|---|
۱ | sys_exit | int | – | – | – | – |
۲ | 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 | – | – | – | – |
مثال زیر عددی را از صفحه کلید می خواند و آن را روی صفحه نمایش می دهد.
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 | section .data ;Data segment userMsg db 'Please enter a number: ' ;Ask the user to enter a number lenUserMsg equ $-userMsg ;The length of the message dispMsg db 'You have entered: ' lenDispMsg equ $-dispMsg section .bss ;Uninitialized data num resb 5 section .text ;Code Segment global _start _start: ;User prompt mov eax, 4 mov ebx, 1 mov ecx, userMsg mov edx, lenUserMsg int 80h ;Read and store the user input mov eax, 3 mov ebx, 2 mov ecx, num mov edx, 5 ;5 bytes (numeric, 1 for sign) of that information int 80h ;Output the message 'The entered number is: ' mov eax, 4 mov ebx, 1 mov ecx, dispMsg mov edx, lenDispMsg int 80h ;Output the number entered mov eax, 4 mov ebx, 1 mov ecx, num mov edx, 5 int 80h ; Exit code mov eax, 1 mov ebx, 0 int 80h |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 2 3 | Please enter a number: 1234 You have entered:1234 |
با فراخوان های سیستمی (System Calls) در لینوکس آشنا شدیم. در جلسه آینده حالتهای آدرس دهی را مورد بررسی قرار خواهیم داد. با آموزش زبان اسمبلی (Assembly) همراه باشید.
اسمبلی
سلام جناب خیلی خوشحال شدم که با مطالب شما درباره اسمبلی مواجه شدم…یه سوال داشتم اگه میشه منا راهنمایی کنین
گفته بودین که تمام سیستم کال ها داخل /usr/include/asm/unistd.h قرار داره… من این فایلا چک کردم ولی چیز زیادی متوجه نشدم.
چطور میشه از این سیستم کال ها استفاده کرد؟ ممنون میشم راهنمایین کنین