۵
فراخوانیهای سیستمی (Syscalls)
یاد میگیریم چطور با سیستمعامل برای کارهایی مثل چاپ متن حرف بزنیم.
فراخوانی سیستمی چیست؟
برنامههای ما در سطح کاربر (User Mode) اجرا میشن و دسترسی مستقیم به سختافزار ندارن. برای انجام کارهای اساسی مثل خوندن از فایل، نوشتن روی صفحه، یا خروج از برنامه، باید از هسته (Kernel) سیستمعامل کمک بگیریم. به این "درخواست کمک" از هسته، فراخوانی سیستمی یا Syscall میگن.
در لینوکس، ما با دستور `int 0x80` یه وقفه (Interrupt) ایجاد میکنیم تا کنترل رو به هسته بدیم. قبلش باید تو رجیسترهای خاصی، مشخص کنیم که چی ازش میخوایم.
چند فراخوانی سیستمی پرکاربرد (لینوکس ۳۲ بیتی)
ما شماره فراخوانی رو در رجیستر `EAX` و پارامترها رو به ترتیب در `EBX`, `ECX`, `EDX` و... قرار میدیم.
; --- فراخوانی sys_exit ---
; کار: خروج از برنامه
; شماره در EAX: 1
; پارامتر در EBX: کد وضعیت خروج (۰ یعنی موفقیتآمیز)
mov eax, 1
mov ebx, 0
int 0x80
; --- فراخوانی sys_write ---
; کار: نوشتن در یک فایل (مثلا صفحه نمایش)
; شماره در EAX: 4
; پارامتر در EBX: توصیفگر فایل (۱ برای stdout/صفحه نمایش)
; پارامتر در ECX: آدرس دادهای که باید نوشته بشه
; پارامتر در EDX: تعداد بایتهایی که باید نوشته بشه
mov eax, 4
mov ebx, 1
mov ecx, my_message
mov edx, message_length
int 0x80