سؤال

لقد قرأت في الكثير من الأماكن أن لغة التجميع لا تُستخدم عادةً لإنشاء برامج كاملة، ولكنها تستخدم بواسطة برامج أخرى لجعل إجراءات معينة أكثر كفاءة، خاصة تلك التي يتم استدعاؤها بضعة آلاف مرة في الثانية.أتساءل كيف يتم دمج أجزاء صغيرة من كود التجميع في برامج أكبر.

  • اعتقدت أنه يمكن إنشاء ملف تنفيذي صغير ثم تشغيله من برنامج آخر، لكن هذا يبدو غير فعال.

  • ثم فكرت في التجميع المضمّن لـ Visual Studio، ولكن هذا خاص بشركة Microsoft، ويبدو أنه ستكون هناك طريقة أفضل.

فكيف يمكن استخدام أجزاء صغيرة من كود التجميع داخل برنامج أكبر دون إنشاء برامج منفصلة أو استخدام التجميع المضمن لـ Visual Studio؟

هل كانت مفيدة؟

المحلول

إليك مثال (دول مجلس التعاون الخليجي):

__asm__ ("movl %eax, %ebx\n\t"
"movl $56, %esi\n\t"
"movl %ecx, $label(%edx,%ebx,$4)\n\t"
"movb %ah, (%ebx)");

بالنسبة إلى Microsoft Inline Assembly، الكلمة الأساسية هي __asm، ويتم تغليف رمز التجميع بأقواس متعرجة، وهو ليس سلسلة، ويكون سجل الوجهة الآن على اليسار.

مثال مايكروسوفت:

int foo(void) {
  __asm{
   mov eax,100 ; Moves 100 into eax!
   leave
   ret
  };
}

روابط لمزيد من المعلومات

تعليمات التجميع المضمنة والمرجع: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

برنامج IBM التعليمي الخاص بـ x86: http://www.ibm.com/developerworks/linux/library/l-ia.html

نصائح أخرى

التجميع المضمّن ليس خاصًا بـ Visual Studio - ويدعمه مجلس التعاون الخليجي أيضًا.يعد التجميع المضمن عادةً أسهل طريقة لدمج التجميع في البرنامج.ومع ذلك، هناك مشكلتان - يمكن أن يؤثر ذلك بشكل كبير على إمكانية نقل التعليمات البرمجية الخاصة بك، وبعض المترجمين لا يدعمونها - على سبيل المثال، لا يدعمها مترجم Microsoft x64.

بالنسبة للمترجمين الذين لا يدعمون التجميع المضمن أو عندما تريد احتواء كل التعليمات البرمجية الخاصة بالجهاز، فإنك تقوم عادةً بفصل الأجزاء المحددة للغة التجميع في ملفات خاصة بهم، مما يعرض رمز التجميع كوظائف يمكن أن يستدعيها كود C++ الخاص بك.ثم تقوم بتجميعها وربطها كجزء من البناء.الرابط الخاص بك لا يهتم باللغة المستخدمة لإنشاء ملفات الكائنات - يمكنه تجميع ملفات الكائنات من لغات متعددة في برنامج واحد.

ثم فكرت في التجميع المضمّن لـ Visual Studio، ولكن هذا خاص بشركة Microsoft، ويبدو أنه ستكون هناك طريقة أفضل.

يدعم كل مترجم شكلاً من أشكال التجميع المضمّن، على الرغم من أنه عادةً ما يكون بطرق مختلفة قليلاً.

لذلك، إذا كنت بحاجة إلى استخدام التجميع المضمن، فقم بتغليف كل مقتطف في وظيفة صغيرة.ثم يمكنك إعادة تنفيذ هذه الوظائف دون بذل الكثير من الجهد عند النقل إلى مترجم آخر.

بالنسبة للأجزاء الصغيرة من التعليمات البرمجية مثل الحلقات الداخلية، عادةً ما يتم ذلك باستخدام التجميع المضمن.وهذا هو قطعاً ليست محددة مايكروسوفت!(تدعمها دول مجلس التعاون الخليجي وكل المترجمات الحديثة تقريبًا، على الرغم من وجود اختلافات مختلفة في بناء الجملة).

بالنسبة للأجزاء الأكبر من التعليمات البرمجية (على سبيل المثال، أداة تحميل التشغيل لنظام التشغيل)، عادةً ما يتم وضعها في ملف مصدر منفصل (تمامًا مثلما تستخدم ملفات مصدر متعددة مع كل لغة)، ثم يتم ربطها ببقية البرنامج باستخدام الرابط.

ضع في اعتبارك أن التجميع يستخدم غالبًا لأنظمة التشغيل في الوقت الحاضر، لأن المترجمين أصبحوا الآن جيدين بدرجة كافية لدرجة أنه لا يساعد كثيرًا في استخدامه للحلقات الداخلية في أشياء مثل الألعاب (وهو ليس قابلاً للنقل على الإطلاق إلى بنيات مختلفة).يتم استخدامه بشكل رئيسي ل مستوى منخفض حقا أشياء مثل مقاطعات الأجهزة وإعداد الترحيل (الذاكرة الافتراضية).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top