tito501 مدير المنتدى
عدد المساهمات : 354 نقاط : 1047 تاريخ التسجيل : 28/03/2010 الموقع : egypttiger1.mama9.com
الاضافات البيانات:
| موضوع: دروس في الاسمبلي الثلاثاء يونيو 15, 2010 11:20 pm | |
| السلام عليكم دروس في لغة الاسمبلي لكي تصبح محترف مجموعة كتب وامثلة
- في البداية لنقم بتوضيح بعض الامور المتعلقة بالاسمبلي, فالاسمبلي من اقدم اللغات التي عرفها مجال البرمجة فهي تلي لغة الالة machine language في صعوبتها لكن في نفس الوقت تعد اسهل في التعامل من اجل التخاطب مع الحاسب, بكافة اجزائه.
فالناحية الاولى التي يتم ذكرها لمن يريد تعلم الاسمبلي هو مسالة التخاطب مع الاجهزة الملحقة بالحاسب.. من ميزات الاسمبلي: 1- السرعة في الاداة نظرا لان المجمع يقوم بتحويلها مباشرة الى لغة الالة. 2- الوضوح عند التنقيح حيث يمكن القول عن الشفرة المكتوبة بها بانها تتبع نظام What you write is what you get, اي ما تكتب تحصل عليه, ليس هناك اجرائيات تضاف من قبل المجمع كما في لغات اخرى مثل C او دلفي حيث يحمل اي تطبيق من عشرين سطر مئات وربما الالاف الاسطر البرمجية المقابلة في الاسمبلي وحدها فما بالك بمثل هذا على الكود المكتوب بلغة الالة. 3- قدرتها على الوصول الى كافة اجزاء الحاسب دون اي عائق امامها خصوصا فيما يتعلق بمسالة كتابة محركات drivers مثل محركات VxD او Sys .. التي يكون من المعقد جدا كتابتها في لغات مثل C مثلا لو لم تكن لديك الخبرة الكافية في التعامل مع العتاد البرمجي.. 4- "المحمولية" او portability, فبامكان تطبيق الاسمبلي ان يعمل على اي نظام Windows دون اي اختلاف, المسالة فقط تتعلق بالمعالج المكتوب له التطبيق, فتطبيقات الاسمبلي التي تم التصريح عنها انها مكتوبة لمعالجات 386 مثلا سيكون بامكانها استخدام التعليمات الخاصة بمعالج 286 وماقبله بالاضافة الى تعليمات 386 لكن ليس بامكانها استخدام تعليمات اضيفت الى المعالج 486 (حتى لو كان الجهاز يحوي على هذا المعالج.. هذا الامر غير متعلق بتجهيزة جهاز الحاسب بالاصل لكنه متعلق بالناقلية التي سيتمتع بها هذا البرنامج) وبما انه في يومنا هذا لم تعد تجد تجهيزات حاسوبية مدارة على معالجات اقدم من P3 فاذن يمكن فورا ان تقوم بالتصريح عن انك تريد ان تستخدم تعليمات المعالج 586 دون خوف.
اذن نخلص الى القول بان لغة الاسمبلي لغة قوية جدا تسمح لك بالسيطرة على كافة اجزاء الحاسب ناهيك عن سرعة تنفيذ التطبيق المكتوب بها الامر الذي يجعل اتقانها مسالة حتمية في حالة البرامج التي تحوي على حلقات كثيرة, مثل هذه البرامج تعاني من بطء التنفيذ واحيانا تتطلب تجهيزات معينة كذاكرة كافية او سرعة معالج معينة.. بينما تطبيق الاسمبلي فتجد متطلباته محدودة فليس هناك معالج لا يعمل عليه تطبيق الاسمبلي حتى القديمة جدا منها التي ربما البعض لم يرها وسمع عنها في الاراشيف القديمة..
هذا من ناحية, الناحية الاخرى التي يجب ان نتطرق لها قبل الدخول في بعض التفصيلات هي النواحي السلبية من الاسمبلي, فكما لكل امر هناك جوانب ايجابية وجوانب سلبية.
بما ان لغة الاسمبلي لغة تحتاج الى مستوى خبرة معينة قبل البدء فيها تجد الكثيرين يعكفون عنها نظرا لانها تتطلب مستوى معين من الفهم فيما يتعلق ببعض امور الدارات الالكترونية (هذا لو اردت اتقانها من الصفر تماما) ومسائل التخاطب بين العتاد البرمجي والاجهزة الملحقة وكيفية جلب وتنفيذ التعليمات ضمن المعالج وبعض التفصيلات المتعلقة بتناقل البيانات عبر الكبلات الموسعة وما الى هذا.. هذا الامر يجعل عملية الدخول في الاسمبلي غير مباشر, فانت تجد نفسك تدرس الكترونيات "نظرية" اكثر منه برمجة في البداية لكن ثق بان هذا الامر يعتبر ضروري ليس لتصبح مبرمج اسمبلي, لكن اقله لتكون على دراية كيف يعمل برنامجك وكيف يتم التعامل معه من قبل النظام فيما يخص الذاكرة او البيانات وما الى هذا.
ناحية اخرى وهي تتعلق بالصيفة المكتوبة لتعليمات الاسمبلي.. فعلى الرغم من تبسيطها لتكون بمثابة اختصارات لكلمات انكليزية معروفة تدل على معنى التعليمة الا ان "شكل" الكود المكتوب بلغة الاسمبلي قد يجعل المرء يخشى ان يبدأ بها, فمثلا تعليمة نقل البيانات mov, تعليمة الانتقال من عنوان لاخر jxx (xx تستبدل بحروف معينة تتبع تعليمة النقل هل هي شرطية اي مرتبطة بوقوع شرط معين ام غير شرطية مباشرة), تعليمة المقارنة cmp.. لاحظ كيف ان جميع هذه التعليمات تعبر عن كلمات انكليزية معروفة MOVE, JUMP, COMPARE, الخ المسالة الوحيدة التي يجب الاهتمام بها فيما يتعلق بالتعليمات فضلا عن استخدامها هو الشروط المتعلقة باستخدام بعض التعليمات..
على سبيل المثال تعليمة النقل mov, لنفرض اني اريد ان انقل قيمة من عنوان في الذاكرة الى اخر, ليس من الممكن في هذه الحالة ان استخدم التعليمة بالشكل:
كود: mov destination, sourceالشكل السليم لهذا الامر هو ان اقوم بوضع عنوان المصدر source في احد المسجلات registers من ثم اقوم بالنقل.. بالشكل التالي:
كود: lea register, source ; load effective address of "source" as data into "register" mov destination, [register]; move data addressed by "register" to "destination"فاذن الموضوع ليس بالصعوبة المتصورة اذ بالامكان معرفة كل هذه الامور من خلال الاطلاع على ملف Intel opcodes المختصر الذي يوضح استخدام كل تعليمة بالاضافة الى سرد للتفاصيل المتعلقة فيها كشروط الاستخدام (من مسجل لموقع ذاكرة, من موقع ذاكرة لمسجل, من مسجل لمسجل ..) وبعض المعلومات المتعلقة بعدد البايتات الذي تحجزه (لو كنا مهتمين بمسالة حجم الملف النهائي) بالاضافة الى عدد دورات المعالج clocks (امور لا تلاحظها بالعين المجردة لكنها تظهر واضحة على التطبيقات الضخمة فالبرامج المكتوبة بلغات عالية المستوى تعاني من بعض البطئ المتعلق بالمعالجة مما يؤثر على فعالية التطبيق بينما لا تعاني تطبيقات الاسمبلي من هذا الامر على الاطلاق ان شاء الله بشرط الاستخدام الامثل للتعليمات وعدم الاكثار من عمليات مكررة او غير ضرورية كان بالامكان اختصارها ببعض سطور)
هذا اكثر ما قد يعيب الاسمبلي بصراحة هذا لو كان بالامكان تصنيف هذه الملاحظات على انها عيوب فهي مسائل يمكن تلافيها من خلال الاطلاع الذي يمكن اعتباره من باب الالمام بالشئ وليس دراسة جدية تتطلب تركيز 100% لكن تبقى مسالة الدراسة الجدية هي الافضل لمن كان محبا لتعلم هذه اللغة. - بيئات البرمجة بالاسمبلي, 16, 32 و 64بت:
- الى هنا نكون قد انهينا بعض الافكار المتعلقة بالاسمبلي والتي تجعل الجدد متخوفين منها, ناتي الان الى ذكر الجزء المتعلق ببيئات الاسمبلي وهي الى الان ثلاثة: 16بت - 32بت - 64بت بحق السماء ماذا يعني 16 او 32بت "anyway"!؟ ناتي هنا الى بعض المسائل المتعلقة بالعنونة وكيفية معالجتها من قبل المعالج processor, من المعروف ان المعالجات القديمة لم تكن تملك سرعات عالية كما هي عليه اليوم, لن ندخل في التفاصيل لكن فيما يتعلق بمسالة معالجة البيانات فان المعالجات تلك كانت تقوم على عنونة بايتن فقط (كل بايت = 8 بت فاذن 2 بايت = 16بت). مسالة عنونة 2 بايت فقط تعني انه لنقل سلسلة من المحارف من مكان لاخر فان المعالج كان يحتاج الى عدد دورات اكبر, لناخذ المثال التالي مثلا.. نلاحظ كيف انه مع تطور المعالج اخذت الدورات تقل (واحيانا تزيد في بعض العمليات وفقا لتركيب المعالج نفسه)
هذا من الناحية الداخلية لعمل المعالج, اما من الناحية البرمجية المتعلقة بالعامل البشري فكان من الممل بصراحة ان تقوم بنقل سلسلة بايتات ما من مكان في الذاكرة لاخر, فانت تضطر الى كتابة بضع اسطر فقط لتقوم بنقل 8 بايتات.. او تقوم بكتابة بضع اسطر مرتبطة بشرط متعلق بوضع الرايات flags لنقل سلسلة طويلة حيث يصبح خيار الحلقات امر غير مرغوب فيه على الاطلاق.
لذا مع ظهور 32بت ومؤخرا 64بت اصبح بامكان مبرمجي الاسمبلي تنفس الصعداء لانه صار بالامكان لهم نقل البيانات بصورة اسهل.. فما بالك بنقل 8بايتات مرة واحدة مع 64بت كانت تحتاج من قبل الى 4 دورات لحلقة ما مع 16بت او 2 مع 32بت!
من الاختلافات ايضا هو ان تطبيقات 16بت تكون محصورة بنظام DOS اي انها سوف تقوم باستخدام المقاطعات البرمجية Interrupts ليتم تنفيذها, في حين تطبيقات 32بت و 64بت سوف تكون ذات طابع مرئي GUI اي انها ستحوي على نوافذ ورسائل حوار ويتم استخدام الدوال البرمجية API الامر الذي يسهل حياة المبرمج
الاختلاف الاخر هو في كيفية تنفيذ الاوامر ومدى اختلاف التعليمات.. نظريا لن تجد اختلاف كبير في التعليمات بين 16 او 32بت, تم اضافة القليل من التعليمات التي قد لا تستخدمها بشكل اعتيادي.. اما فيما يتعلق بـ 64بت فهناك العديد من الاختلافات الجوهرية التي تجعل مسالة الانتقال اليه مسالة تحتاج الى تعامل جيد مع ما سبقه من لغات لتكون الاختلافات قليلة وصريحة.
هذا هو مفهوم 16, 32 او 64بت
- البرمجيات المستخدمة في كتابة تطبيقات الاسمبلي: - الان ناتي الى البرمجيات المستخدمة لكتابة تطبيقات الاسمبلي, وهي برنامج واحد يسمى "مجمع" Assembler, هذا المجمع يقسم داخليا الى تطبيقين, Assembler + Linker - وقد تم شرح دورة حياة برنامج الاسمبلي من قبل في مقال باسم "عملية التجميع وتنفيذ البرنامج" في سلسلة الاسمبلي التي يمكن ايجادها في الارشيف.
فيما يخص الاسمبلر فالشائع استخدامه هو Masm, لكن هناك مجمعات اخرى رائدة مثل Nasm, Tasm, Goasm, الخ والتي تمتلك كل منها ميزات وحسنات من الصعب علي ذكرها لعدم استخدامي جميعها.
ايضا هناك برمجيات مخصصة لاضفاء بعض الحيوية على المجمعات + تزويد المبرمج ببعض الامور المتقدمة التي بامكانه الاستفاده منها في كتابة تطبيقه كتزويده بمحرر للملفات Resource اضافة الى قوائم واشرطة مرئية تحوي على تطبيقات فردية مساعدة (هنا بالطبع نتكلم عن التطبيقات المرئية)
يجدر الاشارة هنا الى ان Masm شائع الاستخدام على Windows وهو يعمل عليه فقط, بينما Nasm شائع الاستخدام على Linux وهو قادر على العمل على Windows ايضا
للحصول على كلا المجمعين يمكن التوجه الى صفحات موقعهم الخاص: Masm32 (الرقم يعني انه مخصص لـ 32بت [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] (252.8 كيلو بايت, 82 قراءة) | |
|