
نموذج لغوي صغير يقوم بتسمية ووصف الدوال في ملفات x86-64 الثنائية المجردة، مع مجموعة بيانات مفتوحة، وخطوط أساس، وتجارب ضبط دقيق LoRA.
الإنجليزية · التركية
نموذج لغوي صغير ينظر إلى دالة في ملف ثنائي مجرّد ويمنحها اسمًا ذا معنى ووصفًا قصيرًا.
تحتوي مجموعة بيانات v4 على 228,177 دالة من 341 مشروعًا عبر 5 مستويات تحسين، وهي منشورة على Hugging Face ضمن إعداد v4. سكربت Ghidra جاهز. أفضل نموذج صغير حتى الآن، Qwen3-8B + LoRA المدرَّب على بيانات v5 (الوصف أولًا، ثم الاسم)، يصل إلى F1 للاسم 0.124 على عيّنة الاختبار الثابتة v4 و0.155 على eval_115؛ وأفضل نموذج كبير مع سياق الاستدعاء يسجّل 0.167 على نفس عيّنة الاختبار. انظر النتائج، القسم 6. يكتب النموذج وصفًا من جملة واحدة بالإنجليزية وأخرى بالتركية إلى جانب الاسم. المحوّل متاح على Hugging Face: krxi123/asmsense-qwen3-8b-lora.
افتح برنامجًا مجرّدًا في Ghidra أو IDA وسترى مئات الدوال المسماة FUN_00401a30. يتكوّن جزء كبير من الهندسة العكسية من فهم هذه الدوال وتسميتها واحدة تلو الأخرى. يهدف هذا المشروع إلى تعليم نموذج تلك الخطوة الأولى:
input (stripped x86-64) target output
───────────────────────────── ──────────────────────────────────────────────
movzx eax, byte ptr [rsi] name: adler32_update
lea rdx, [rdi + rax] description: Computes the Adler-32 checksum
cmp rdx, 0xfff1 ← 65521 over the bytes of a buffer.
... # TR: Tampondaki baytlar üzerinden Adler-32
# sağlama toplamı hesaplar.
يمكن للنماذج الكبيرة متعددة الأغراض التعامل مع هذه المهمة إلى حد ما، لكنها بطيئة ومكلفة ومستضافة على السحابة. الهدف هو الإجابة عن هذا السؤال:
هل يمكن لنموذج صغير مُدرَّب على بيانات مُصمَّمة لهذا الغرض أن يضاهي أو حتى يتفوق على النماذج الكبيرة في هذه المهمة—مع العمل على حاسوب محمول؟
يتم تقييم ثلاث فئات على نفس مجموعة الاختبار:
| الفئة | النموذج | الدور |
|---|---|---|
| السقف | نماذج مفتوحة كبيرة (DeepSeek، GLM، MiMo، Gemma، Qwen) | أفضل ما يمكن تحقيقه حاليًا بالنماذج الجاهزة |
| خط الأساس | نموذج مفتوح صغير، قبل الضبط الدقيق | نقطة البداية |
| هذا المشروع | نفس النموذج الصغير + LoRA على هذه المجموعة البياناتية | مساهمة المشروع |
توليد البيانات (cikar.py): يتم تجميع مشاريع C مفتوحة المصدر لمعمارية x86-64 عند مستويات تحسين مختلفة (-O0، -O2). يتم استخراج لغة التجميع لكل دالة. تأتي الحقيقة المرجعية—اسم الدالة الأصلي—مباشرةً من المصدر، لذا لا حاجة إلى وسم يدوي. يسجّل projeler.json الـ commit وأعلام المترجم المستخدمة لكل مشروع.
محاكاة ملف ثنائي مُجرَّد: يشبه الناتج ما يعرضه Ghidra لدالة في ملف ثنائي مُجرَّد:
sub_01a3، وتصبح البيانات العامة dat_0042 (تُخلط الأرقام، مع مساحات أسماء منفصلة لـ -O0 و-O2)،loc_1 وloc_2،memcpy، __stack_chk_fail) والسلاسل النصية الحرفية (; -> "out of memory") ظاهرة لأنها ظاهرة أيضًا في ملف ثنائي حقيقي.إذا ظهر الاسم الحقيقي للدالة في لغة التجميع الخاصة بها—على سبيل المثال، في رسالة خطأ—يُوسَم الصف بـ sizinti ويُستبعَد من مجموعة الاختبار.
التقييم (taban.py): يتلقى النموذج لغة التجميع فقط ويُطلَب منه توقّع اسم. تُقيَّم التوقعات بتداخل الرموز (F1)، لذا تحصل الإجابات القريبة مثل crc32_update وupdate_crc على درجة جزئية.
loc_6:
movzx r9d, byte ptr [rsi + rdx]
add rdi, r9 ← adler32_z (-O2), as the model sees it
add rcx, rdi
inc rdx
cmp rax, rdx
jne loc_6
| المشاريع | الدوال (-O0 + -O2) | |
|---|---|---|
| التدريب | zlib, libpng, sqlite, lua, mbedtls, zstd, libsodium, expat, brotli, jansson, lz4, libyaml, xxhash, cJSON | 16,804 |
| الاختبار (مقاوم للحفظ) | tomlc17, cyaml, mu_json_x, sajs, picomatch | 777 → مجموعة التقييم 115 |
مجموعة البيانات متاحة على Hugging Face: krxi123/asmsense (16,804 مثال تدريبي، 777 مثال اختباري، مجموعة التقييم eval_115، ونصوص التراخيص). وهي منسوخة أيضاً على Kaggle: krxiii/asmsense.
تم اختيار مشاريع C ذات تراخيص متساهلة (MIT، BSD، Apache-2.0، ISC، zlib) من GitHub باستخدام olcekle.py وتجميعها عند -O0/-O1/-O2/-O3/-Os باستخدام cikar_bin.py (مكتبة ديناميكية حقيقية + strip -x). لم يتم تشغيل سكربتات بناء المشاريع؛ تم تجميع الملفات فردياً باستخدام clang، وتم تخطي الملفات أو المشاريع التي فشل تجميعها. تمت إزالة تكرار الصفوف حسب تجزئة التجميع المُطبَّع. تمت إزالة الصفوف التي كان تجميعها مطابقاً لبيانات التحقق/الاختبار من التدريب، بينما تمت إزالة النسخ المُضمَّنة التي ظهرت أزواجها (ملف، اسم) في التدريب من التحقق/الاختبار. كل صف يحتوي على حقل lisans.
| التقسيم | المشاريع | الصفوف | دوال المصدر الفريدة |
|---|---|---|---|
| التدريب | 290 | 196,117 | 72,179 |
| التحقق | 23 | 19,770 | 6,667 |
| الاختبار (قليل الشهرة، ≤200 نجمة، 2024+) | 28 | 12,290 | 4,685 |
من أصل 473 مشروعاً، أنتج 352 صفوفاً وفشل 120 في التجميع (كود نواة، أو مضمّن، أو معتمد على المنصة). تم استخدام clang فقط. تُحفظ البيانات خارج Git ويمكن إعادة توليدها باستخدام python3 aday_bul.py و python3 olcekle.py hepsi.
تقسيم التدريب/الاختبار هو على مستوى المشروع بشكل صارم: لا يمكن أن تظهر أي دالة من مشروع على كلا الجانبين. تم اختيار مشاريع الاختبار عمداً لتكون قليلة الشهرة (2-190 نجمة)، ومعظمها بدأ في 2024-2025، مما يجعل من غير المرجح بكثير أن تكون النماذج الكبيرة قد صادفتها أثناء التدريب مقارنة بمكتبة مثل zlib. التراخيص: veri/LISANSLAR.md.
استثناء معروف: الكود المُضمَّن. أكّد تدقيق مستقل لبيانات v6 المنشورة (rapor/arastirma/V6_VERI_DENETIMI.md، veri_denetim_v6.py) أنه لا يوجد مشروع أو معرّف أو (مشروع، ملف، اسم) يظهر على كلا الجانبين، لكن مشروع الاختبار snkv يُضمِّن SQLite تحت أسماء ملفاته الخاصة بينما sqlite مشروع تدريبي. في عيّنة الاختبار الثابتة المكوّنة من 2,000 صف، 217 صفاً (10.85%) لها اسم مطابق لدالة تدريبية في SQLite. كل نموذج يسجّل نتائج أدنى على تلك الصفوف، لذا فهي لا تضخّم النتائج؛ بل تضيّق الفجوة بين الصغير والكبير بدلاً من ذلك (انظر النتائج، القسم 6). تحتوي عيّنة التحقق valid_300 على 16 صفاً مشابهاً (5.3%).
متوسط F1 للأسماء (1.0 = تطابق تام). في عمود "F1 بعد إزالة البادئة"، تُزال البادئة الاسمية الشائعة لكل مشروع (cyaml_، mu_، sajs_) من كلا الجانبين؛ لا يمكن للنموذج استنتاج هذه البادئة من التجميع.
| النموذج | -O0 | -O2 | F1 بعد إزالة البادئة | التطابقات التامة |
|---|---|---|---|---|
| mimo-v2.6-pro (استدلال) | 0.20 | 0.17 | 0.21 | 3 / 115 |
| mimo-v2.6-pro | 0.18 | 0.16 | 0.20 | 4 / 115 |
| glm-5.3 (استدلال) | 0.16 | 0.11 | 0.15 | 4 / 115 |
| qwen3.8-flash-next (استدلال) | 0.16 | 0.08 | 0.13 | 3 / 115 |
| deepseek-v4.1-flash (استدلال) | 0.12 | 0.08 | 0.12 | 3 / 115 |
| deepseek-v4.1-flash | 0.10 | 0.11 | 0.12 | 2 / 115 |
| glm-5.3 | 0.12 | 0.08 | 0.12 | 2 / 115 |
| qwen3.8-flash-next | 0.13 | 0.07 | 0.11 | 1 / 115 |
| gemma-4-31b (استدلال) | 0.11 | 0.08 | 0.10 | 2 / 115 |
| gemma-4-31b | 0.11 | 0.07 | 0.10 | 0 / 115 |
| qwen2.5-coder-0.5b، غير مدرَّب | 0.00 | 0.01 | 0.01 | 0 / 112 |
| qwen2.5-coder-0.5b + LoRA v1 | 0.02 | 0.00 | 0.01 | 0 / 112 |
استخدمت جولات الاستدلال سقف max_tokens قدره 12,288. حتى عند هذا الحد، فشل deepseek و qwen في إكمال الاستدلال وإنتاج إجابة في أكثر من نصف الطلبات؛ وفعل glm الشيء نفسه في 50 من 115. تم احتساب هذه الصفوف كـ 0.
نفس خط أنابيب البيانات، نفس عدد الدوال (115)، mimo-v2.6-pro:
| بدون استدلال | مع استدلال | |
|---|---|---|
| zlib (شهير جداً) | 9 تطابقات تامة، F1 0.18 | 28 تطابقاً تاماً، F1 0.29 |
| مشاريع قليلة الشهرة | 4 تطابقات تامة، F1 0.20 | 3 تطابقات تامة، F1 0.21 |