آموزش Assembly-قسمت ششم
فراخوان های سیستمی در اسمبلی - 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 نمایش داده بشه)
تمرین برنامه نویسی : برنامه بالا را در دو سیستم عامل مختلف اجرا کنید.
نظرات کاربران