۹

ارتباط با زبان C

یاد می‌گیریم چطور کدهای اسمبلی فوق سریع خود را از داخل یک برنامه C صدا بزنیم.

چرا این کار رو می‌کنیم؟

نوشتن یه برنامه کامل با اسمبلی خیلی سخته. اما می‌تونیم بخش‌های خیلی حساس به سرعت برنامه رو با اسمبلی بنویسیم و بقیه منطق برنامه رو با یه زبان سطح بالاتر مثل C مدیریت کنیم. اینطوری از بهترین‌های هر دو دنیا استفاده می‌کنیم!

مثال: تابع جمع در اسمبلی

یه تابع در اسمبلی می‌نویسیم که دو عدد رو جمع کنه و از C صداش می‌زنیم.

add.asm
section .text
    global add_numbers  ; این تابع رو برای فایل‌های دیگه قابل دسترس کن

add_numbers:
    ; C پارامترها رو روی پشته می‌ذاره
    mov eax, [esp + 4]  ; اولین پارامتر
    mov ebx, [esp + 8]  ; دومین پارامتر
    add eax, ebx        ; جمعشون کن
    ret                 ; نتیجه در EAX برگردونده می‌شه
main.c
#include <stdio.h>

// به کامپایلر C می‌گیم که این تابع جای دیگه‌ای تعریف شده
extern int add_numbers(int a, int b);

int main() {
    int result = add_numbers(10, 20);
    printf("The result is: %d\n", result); // خروجی: The result is: 30
    return 0;
}

برای کامپایل این دو با هم:

nasm -f elf32 add.asm -o add.o
gcc -m32 -c main.c -o main.o
gcc -m32 main.o add.o -o program
./program