النافذة العربية للبرمجة

النافذة العربية للبرمجة
 
الرئيسيةالمشاركاتمكتبة الصورس .و .جبحـثالأعضاءالمجموعاتالتسجيلدخول

شاطر | 
 

 الدرس الثاني مقدمة عن لغة التجميع

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل 
كاتب الموضوعرسالة
عبدالهادي الحداد
مدير الموقع
avatar

عدد الرسائل : 483
العمر : 32
الموقع : اليمن الحبيبة
العمل/الترفيه : طالب برمجة
تاريخ التسجيل : 13/06/2008

بطاقة الشخصية
المدير العام / عبدالهادي الحداد:

مُساهمةموضوع: الدرس الثاني مقدمة عن لغة التجميع   الإثنين يونيو 16, 2008 3:25 pm

بسم الله الرحمن الرحيم



ما هي لغة التجميع؟
تصمم وحدة المعالجة المركزية CPU لتنفيذ مجموعة صغيرة من التعليمات التي تدعى بتعليمات "لغة الآلة" machine Language وكل تعليمة في هذه اللغة تحدد العملية الواجب اجراؤها على بعض المعاملات operands فمثلا، تتم احدى العمليات النموذجية لجمع معاملين، حيث تشفر العمليات كسلسلة من البتات التي يمكن تفسيرها من قبل وحدة المعالجة المركزية CPU.
تخزّن المعاملات بشكل طبيعي في الذاكرة ويحدد العنوان الذي يخزن عنده المعامل ضمن تعليمة الآلة. فمثلاً, تمثل السلسلة 0000010100001010 تعليمة نموذجية بلغة الآلة, وفيها نجد ان البتات (الخانات) الثمانية الأكثر اهمية most significant bits تمثل شفرة العملية operation code بينما يمثل العنوان بالبتات الثمانية الاقل اهمية. على هذا الاساس فان كل التعليمات هي عبارة عن تسلسل من البتات التي يمكن فهمها وتفسيرها وتنفيذها بواسطة جملة من الدارات الموجودة في وحدة المعالجة CPU.

ان هذا التسلسل من البتات يعتبر صعب الفهم من قبلنا كبشر ولذلك يتم ترميز تعليمات لغة الآلة باستخدام مجموعة مختصرات mnemonics لتمثيل شفرات العمليات ومجموعة رموز symbols لتمثيل عناوين الذاكرة بالاضافة الى المسجلات في الوحدة CPU. تكتب تعليمة الآلة السابقة مثلا بواسطة المختصرات كما يلي:

كودmnemonic dest, src ; comments goes here

وتسمى هذه التعليمة بتعليمة لغة التجميع.

ان كل تعليمة بلغة التجميع هي تمثيل مقابل لتعليمة بلغة الآلة بمعنى ان كل تعليمة في لغة التجميع ستترجم الى تعليمة محددة في لغة الالة وبالتالي فاي تعليمة تستطيع الوحدة CPU تنفيذها ستكون مكتوبة وفق تعليمة مقابلة لها بلغة التجميع.
تعتمد لغة التجميع حسب طبيعتها الخاصة على الالة المستخدمة بمعنى ان برنامج لغة التجميع المكتوب من اجل حواسيب IBM يمكن تنفيذه فقط على حواسيب متوافقة مع IBM ولا يمكن تنفيذه على حواسيب Apple.

يترجم برنامج لغة التجميع الى برنامج لغة الالة بواسطة برنامج اخر يدعى المجمع assembler وصتمم المجمعات معا برمجيا لتلائم معظم الحواسيب الشائعة مثل حواسيب IBM والحواسيب المتوافقة معها والتي تزودنا بها شركات شهيرة مثل Microsoft و Borland.

لغة التجميع واللغة عالية المستوى:
ان اللغات عالية المستوى مثل Pascal, C هي لغات مستقلة عن الالة فالشفرة المصدرية المكتوبة بلغة C مثلا يمكن تنفيذها على اي حاسوب يتوفر فيه مترجم C وبما ان لغة C مستلقة عن الالة فان تفاصيل البنية الحاسوبية الخاصة تكون مخفية عن مبرمج لغة C لانها غير مرتبطة بهذه البنية. لذلك فان برامج C لا تستطيع مباشرة ان تعالج محتويات مسجلات الوحدة CPU لمعالج محدد.

لقد صممت برامج اللغة عالية المستوى ايضا لتكون مختصرة وقابلة للقراءة فتعليمة مثل c = a+b سوف تترجم بواسطة المترجم الى عدة تعليمات من لغة الالة. لذلك فان برامج اي لغة عالية المستوى هي مجموعة من التعليمات اقل بكثير اذا ما قابلناها ببرامج لغة التجميع.

تعتبر البرامج المكتوبة بلغات عالية المستوى اقل فعالية عند تحويلها الى لغة الالة بالمقارنة مع البرامج المكتوبة بلغة التجميع، لان اللغات عالية المستوى هي لغات مستقلة عن الالة ومصممة بالدرجة الاولى لمساعدة المبرمجين على الفهم بدلا من تحسين فعالية الالة. فمثلا البرنامج المكتوب بلغة C++ لاظهار رسالة "Hello World!" سيحتاج عند تحويله الى شفرة الالة الى حوالي 8000 بايت بينما اذا كتب بلغة التجميع فانه سيحتاج الى حوالي 600 بايت تقريبا. على هذا الاساس تعتبر برامج لغة التجميع اكثر فعالية من برامج اي لغة عالية المستوى. بمعنى ان برامج لغة التجميع المكتوبة للعديد من التطبيقات تتطلب حجما اقل وتنفذ بسرعة اكبر بالمقارنة مع البرامج عالية المستوى لنفس التطبيق. لكن كتابة برنامج بلغة التجميع يحتاج الى خبرة عالية وجهد بشري كبير وهذا ناتج عن حقيقة ان مبرمج لغة التجميع يجب ان يكون لديه تصور وفهم عميق لوحدة المعالجة CPU التي ييد استخدامها.

تتميز برامج لغة التجميع بطولها والصعوبة الزائدة في اكتشاف الاخطاء وتصحيحها بدلا من تطويرها, كما انه من الصعب ايضا ادخال ميزات جديدة على برامج موجودة بلغة التجميع بمعنى ان هناك صعوبة واضحة في تطوير برامج لغة التجميع والمحافظة عليها او الاحتفاظ بها.

لماذا نحتاج الى لغة التجميع؟
يوجد نوعان من البرامج المكتوبة للتنفيذ على الحواسيب هما: برامج التطبيقات application programs وبرامج النظام system programs.
تكتب برامج التطبيقات بصورة طبيعية بلغة عالية المستوى لتحقيق مهام مثل لوائح الجرد والتحكم ومعالجة المتحولات والطلبات التجارية وغيرها. لكن بالمقابل فان برامج النظام هي برامج عامة جدا مهمتها تبسيط استخدام الحاسوب ومن هذه البرامج نذكر المترجمات compilers والمحررات editors وانظمة التشغيل operating systems.

تستطيع انظمة من بين هذه البرامج ادارة موارد النظام واذا كان المطلوب وصل اجهزة خارجية الى الحاسوب والتحكم بها فسوف نحتاج الى البرمجة عند مستوى وحدة المعالجة لان برامج اللغا عالية المستوى مستقلة عن الالة machine independent ولا تستطيع العمل عند هذا المستوى وبالتالي سنحتاج الى استخدام لغة التجميع لكتابة برامج للتحكم باجهزة الدخل / الخرج. توجد حالات اخرى ايضا تحدث فيها شروط استثنائية اثناء الحساب مثل الحصول على نتيجة كبيرة جدا او صغيرة جدا يصعب تخزينها في مسجل ال CPU وفي مثل هذه الحالات يتخذ فعل تصحيحي للتغلب على المشكلة فقط باستخدام برنامج لغة التجميع ولذلك تعتبر لغة التجميع اساسية لكتابة البرامج التي تعالج المشاكل البارزة عند مستوى بنية وحدة المعالجة CPU.

متى نستخدم لغة التجميع؟
تمت الاشارة في المقطع السابق الى ان برامج لغة التجميع تستخدم للتحكم بالاجهزة الموصولة مع ال CPU ولمعالجة الشروط الاستثنائية التي تحدث عند مستوى مسجلات الوحدة CPU. وتستخدم لغة التجميع ايضا الى جانب هذه الحالات عند اعتبار الفعالية بانها الحالة الافضل فعلى سبيل المثال ينبغي اعطاء امر للتحكم بطائرة ضمن وقت محدد بعج انجاز بعض الحسابات وفي مثل هذه الحالة يجب تنفيذ برنامج التحكم خلال فترة قصيرة قابلة للتنبؤ ومحددة مسبقا ولذلك يكتب البرنامج عادة بلغة التجميع.
تستخدم لغة التجميع لانه الى جانب الفعالية ان يتم الحصول على تخمين جيد للزمن اللازم بواسطة برنامج لغة التجميع (حيث ان لكل تعليمة او –مختصر- في لغة التجميع زمن خاص بالتنفيذ حسب عدد الدورات وسيتم شرح هذه النقطة لاحقا).

اما الحالة الثالثة التي تعتبر فيها لغة التجميع هامة فهي عندما يكون التطبيق ملموس الكلفة وهناك عدد كبير من الانظمة التي تحتوي بداخلها على برنامج هذا التطبيق المخفي، مثل نظام التحكم والمراقبة المعتمد على معالج صغري للحركة الالية automobiles, او المتحكم المستخدم في آلات الغسيل وغيرها, وكلها تنتمي الى هذا الصنف. في مثل هذه الحالات تكتب البرامج بشفرة التجميع للتاكيد على ان برنامج شفرة الالة المترجم سوف لن يحجز اكثر من سعة الذاكرة الصغيرة ROM الموجودة في النظام.

الاجزاء الرئيسية للغة التجميع:
تتالف تعليمة لغة التجميع في شكلها الابسط من شفرة لغة التشغيل الممثلة بمختصر mnemonics متبوع بلائحة من المعاملات operands حيث ان المعنى من كلمة المختصر هو المساعدة على التذكر حيث انه من السهل تذكر المختصر mov بدلا من الشفرة الثنائية 10110000 التي هي شفرة الالة لهذا المختصر. كمثال على تعليمة بلغة التجميع:

كودmnemonic dest, src ; comments goes here

تستخدم الفاصلة المنقوطة هنا لفصل تعليمات لغة التجميع عن التعليقات comments المدرجة اذ ينصح دوما باستخدام التعليقات مع كل تعليمة في لغة التجميع لشرح الوظيفة التي تؤديها تلك التعليمة وهذا العمل هام بصورة خاصة في لغة التجميع باعتبار ان التعليمات موجزة ومختصرة.

نجد من المثال السابق ان تعليمة لغة التجميع تتالف من المختصر ومن المعاملات كما ذكرنا سابقا. يحدد المختصر التعليمة المراد تنفيذها مثل add, mov, jx, mul الخ, بينما تتالف المعاملات من قسمين:

dest وهو اختصار ل destination اي الوجهة وهو المكان الذي سيتم توجيه القسم الثاني اليه.
src وهو اختصار ل source اي المصدر حيث يتم نقل المعطيات في لغة التجميع بترتيب عكسي من ال source ->destination.

الان ناتي للتوسع, حيث يتالف المعامل من عدة انواع.. فهو اما ان يكون:
- قيمة ثابتة تعرف بالمعامل الفوري immediate value مثل القيمة 10 مثلا.
متحول variable مثل sum يمثل اسما رمزيا لموقع في الذاكرة حيث تخزن قيمة هذا المتحول.
- اسم name لاحد مسجلات الوحدة مثل ax
- عنوان مطلق absolute address لموقع ذاكرة مثل [04Bh0h] – لاحظ ان القيمة العددية تكون ممثلة بالنظام الست عشري.

يتالف برنامج لغة التجميع من جزأين رئيسيين الاول يقدم التوجيهات directives للمجمع لتعيين مكان في الذاكرة من اجل المتحولات المراد استخدامها والقيم المراد تخزينها والفراغ المراد تحديده للمكدس stack الخ.
بينما يشكل الجزء الثاني التعليمات القابلة للتنفيذ executable instructions في برنامج لغة التجميع.
فيما يلي جزء صغير من برنامج بلغة التجميع (16 بت) الذي يقوم بطباعة محرف في نافذة ال DOS:

كود.data ; beginning of data segment
x db 0 ; define 1 byte x. set x = 0
.code ; beginning of code segment
main proc ; beginning of main procedure
add x, 4 ; add 4 to x (hex addition)
mov dl, x ; move results to DL register
mov ah, 2 ; DOS service, write char to output
int 21h ; call interrupt
mov ah, 4Ch ; DOS service, end & return to DOS
int 21h ; call interrupt
main endp ; end of procedure

الى هنا ناتي الى ختام هذا المقال حول لغة التجميع.
ساقوم بمتابعة هذه المواضيع ان وجدت تفاعلا من الاعضاء والا فانها ستنتظر الى وقت قريب

مراجعة للمقاطعات المستخدمة في هذا المقال:
كودINT 21 - DOS 1+ - WRITE CHARACTER TO STANDARD OUTPUT
AH = 02h
DL = character to write

Return: AL = last character output (despite the official docs which state
nothing is returned) (at least DOS 2.1-7.0)
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو http://awfm.boardlog.com
محترف
مبرمج رائع
مبرمج رائع
avatar

عدد الرسائل : 144
العمر : 31
تاريخ التسجيل : 22/07/2008

بطاقة الشخصية
المدير العام / عبدالهادي الحداد:

مُساهمةموضوع: رد: الدرس الثاني مقدمة عن لغة التجميع   الأحد أغسطس 24, 2008 2:11 pm

مشكووووووووووووووور







الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
ذوق اليمن
عضو فعال


عدد الرسائل : 103
العمر : 32
تاريخ التسجيل : 10/07/2008

بطاقة الشخصية
المدير العام / عبدالهادي الحداد:

مُساهمةموضوع: رد: الدرس الثاني مقدمة عن لغة التجميع   الخميس أغسطس 28, 2008 6:55 am

مشكووووووووووور
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
النسر البرمجي

avatar

عدد الرسائل : 10
تاريخ التسجيل : 27/10/2008

مُساهمةموضوع: رد: الدرس الثاني مقدمة عن لغة التجميع   الثلاثاء فبراير 17, 2009 11:42 am

مشكوووووووووووووووووووووووووووووووووور اخوي على موضوعك المميز
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
النود

avatar

عدد الرسائل : 3
تاريخ التسجيل : 27/10/2008

مُساهمةموضوع: رد: الدرس الثاني مقدمة عن لغة التجميع   الأربعاء فبراير 25, 2009 2:02 pm

تسلم يدك أخي











الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
 
الدرس الثاني مقدمة عن لغة التجميع
استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
النافذة العربية للبرمجة :: قسم لغات برمجة التطبيقات :: منتدى مبرمجي لغة الآلة (التجميع) Assembly-
انتقل الى: