آموزش Assembly-قسمت ششم

1395/2/23 کیومرث قادری 1821

فراخوان های سیستمی در اسمبلی - 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 نمایش داده بشه)

تمرین برنامه نویسی : برنامه بالا را در دو سیستم عامل مختلف اجرا کنید.

کلمات کلیدی