آموزش 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 نمایش داده بشه)

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

دیدگاهتان را بنویسید