فراخوان های سیستمی در اسمبلی – System Calls
فراخوان های سیستمی در واقع API های هستند برای واسط بین فضای کاربر و فضای کرنل. ما قبلن هم فراخوان های سیستمی رو استفاده کردیم : sys_write و sys_exit ، برای نوشتن روی صفحه نمایش و خارج شدن از برنامه و … .
فراخوان های سیستمی در لینوکس – Linux
ما میتونیم از فراخوان های سیستمی لینوکس در برنامه هامون استفاده کنیم. برای این کار باید مراحل زیر رو طی کنیم:
• عدد فراخوان سیستمی رو در ثبات EAX قرار بدیم.
• استدلال های به فراخوان سیستمی رو در ثبات های EBX, ECX و غیره ذخیره کنیم.
• وقفه ی مربوطه رو فراخوانی کنیم 80h
• نتیجه هم در واقع به EAX بر میگرده
در کل 6 ثبات هست که استدلال هایی که فراخوان سیستمی استفاده میکنه رو ذخیره میکنه. که ثبات ها شامل EBX, ECX, EDX, ESI, EDI و EBP می باشد. اگر بیشتر از 6 استدلال وجود داشته باشه، فضای حافظه اولین استدلال در EBX ذخیره میشه.
قطعه کد زیر استفاده فراخوان سیستمی sys_exit رو نشون میده
mov eax, 1 ; system call number (sys_exit) int 0x80 ; call kernel
قطعه کد زیر استفاده فراخوان سیستمی sys_writeرو نشون میده
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
تمامی فراخوان های سیستمی با اعداد مربوط شون در /usr/include/asm/unistd.h ذخیره شده اند
thecaluetopointEAXbeforeyoucallint80h
جدول زیر بعضی از این مقادیر رو نشون میده :
مثال : مثال زیر عددی رو از کیبورد میخونه و در صفحه نمایش نشون میده :
وقتی برنامه ی بالا رو اجرا میکنیم خروجی زیر رو مشاهده میکنیم ( بستگی به اعداد وارد شده )
Please enter a number : 123456789 You have entered : 123456789
تمرین: فراخوان های سیستمی در Windows چگونه هستند؟( بیان نحوه ذخیره سازی و ویژگی ها و … )
تمرین برنامه نویسی : برنامه بنویسید که کاراکتر بعدی کارکتر وارد شده در کیبورد را نمایش دهد ( مثلن وقتی ما b رو میزنیم c نمایش داده بشه)
تمرین برنامه نویسی : برنامه بالا را در دو سیستم عامل مختلف اجرا کنید.