۹
ارتباط با زبان 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