PDA

عرض كامل الموضوع : assembly



Brave Heart
11-04-2004, 10:41 AM
السلام عليكم.

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

الى ماذا تهدف هذه الدروس :
1. دراسة تعليمات معالجات العائلة X86 وبنيتها البرمجية والعتادية مع أستعراضها بالكامل
2. تعلم لغة الأسمبلي من تعليمات وموجاهات ومكروات وبرامج الفرعية ... الخ
3. طرق برمجة وتعلم كيفية برمجة برامج بمستوى النظام وأدوات التظام ودراسة لبعض الخورزميات المهمه
4. تعلم كيفية التعامل مع العتاد بالأسمبلي
5. تعلم كيفية أستخدام الأسمبلي من اللغات العليا وتكاملها معها
6. كيفية التعامل مع كل من المصرفين MASM و TASM بكامل عوملهما وتوجيهتمها
7. كتابة برامج COM
8. تعلم خورازميات تحميل وتنفيذ برامج EXE و COM
9. تعلم بناء برامج مقيمة في الذاكرة TSR
10. تعلم أستخدام دوال ومقاطعات كل من ال BIOS وال DOS للقيام بعمليات معينة مثل التعامل مع الملفات أو الرسم على الشاشة أو الطباعة ... الخ مع جدولة أكبر عدد ممكن من هذه الدوال والمقاطعات
11. تعلم أستخدام مقاطعات أجهزة الهادوير وبرمجتها مثل لوحة المفاتيح والفأره
12. تراكب البرامج Overlay في الذاكرة
13. تعلم طرق ادارة الذاكرة وايجابيات وسلبيات كل منها
14. تعلم تصميم نظام تشغيل بسيط بلغة الأسمبلي
15. تعلم تصميم لغة برمجة بسيطة بلغة الأسمبلي
16. التعامل مع ملفات LST و REF
17. تعلم خدع برمجية قوية مع دراسة لتعليمات ومقاطعات غير موثقة من قبل نظام التشغيل أو المعالج
18. تحليل ودراسة لبرامج مفتوحة المصدر كتبت بواسطة مبرمجين محترفين

ماهي الأسمبلي :
في قديم الزمان أيام بدايات الكمبيوتر كانت برمجة الكمبيوتر تتم بواسطة لغة الأله Machine Language أختصاراً ML ( لغة الآله هي اللغه التي تفهمها الآله مباشرة دون الحاجة الى تفسير وهي تخزن بصورة ثنائبة [ تركيبة من الأصفار والوحايد] في الذاكرة على شكل تعليمات ووسائط تأخذ كل واحد منها عادة مقدار 8بت=ا بايت ) وكان هذا النوع من البرمجة صعب جداً عندها طور المبرمجون أول لغة برمجة وهذه اللغه فكرتها بسيطة جداً حيث أنه بدل أن تكتب رموز الآله يتم كتابة كلمات مختصره تدل على نوع العمليه مثال ( MOV,ADD,CMP ) ثم ببرنامج بسيط يتم تحويل هذه الشفرة الى لغة الآله بأستخدام تخطيط واحد-الى-واحد أي أن كل سطر أو عبارة في الأسمبلي تحول الى تعليمة واحدة مقابله في لغة الآله (مثال بدل كتابة 011000000000101 يتم كتابة mov al,5 ) يعرف البرنامج الذي يقوم بعملية التحويل بالأسمبلر Assembler ، علماً بأن هناك عدة أنواع من الأسمبلر كل نوع يختص بتقنية معينة وبعائلة معينه من المعالجات
ونحن هنا بصدد تعلم البرمجة بالأسمبلي للمعالجات المبنية على تقنية IBM-PC والمنتجة من شركة أنتل وهي العائلة 86×80 ويرمز لها أختصاراً X86 وهي تضم :
( 8086 / 8088 / 80186 / 80286 ) لمعالجات ال 16 بت و ( 80386 / 80486 / 80586=بنتنيوم1 / 80686=بنتنيوم2 / 80786=بنتنيوم3 / 80886=بنتنيوم4 ) لمعالجات ال 32 بت وسوف أتطرق في دروس متقدمة الى المعالج أتنيوم 64 بت المبني بتقنية جديده كلياً لمن يرغب بمعرفة مسبقة لهذا المعالج الجديد كذلك سوف أتطرق بأذن الله الى الكروس أسمبلر وهي مجموعة برامج خاصة مصممه للتحويل من لغة أسمبلي لعائلة معالجات معينة الى عائله أخرى .


تعريف لغة الأسمبلي
الأسمبلي هي لغة برمجة تتكون من سلسلة من التعليمات المتتابعة كل تعليمة فيها تحول الى تعليمة مقابلة بلغة الآله .


تعريف الأسمبلر
الأسمبلر هو برنامج يقوم بتحويل التعليمات المكتوبة بلأسمبلي الى لغة الآله .



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

العلاقة بين الأسمبلي واللغات الأخرى :
تعتبر كل من لغة الآله و الأسمبلي لغتين منخفضتي المستوى Low-Level Language أختصاراً LLL لأنها تكتب تعليمه تعليمه ( بعض الناس يعتبر لغة السي لغة منخفضة المستوى ، وهذا الكلام أرجح الى الخطأ منه الى الصواب ) بينما تعتبر باقي اللغات High-Level Language أختصاراً HLL وفي هذه اللغات تختفي تقنية تخطيط واحد-الى-واحد وتفسر التعليمة الواحدة الى عدد كبير من تعيلمات لغة الآله

تطبيقات لغة الأسمبلي :

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

من الصعب أن تلاقي برامج كبيرة مكتوبة كاملة بلغة الأسمبلي لأن كتابتها صعب والأهم من ذلك تطويرها وصيانتها أصعب بكثير ، بدل ذلك يقوم المبرمجين ببرمجة مقاطع مبرمجة برمجة مثلى بلغة الأسمبلي لأستخدمها في تنفيذ أسرع أو الوصول الى العتاد عن طريقها وباقي البرنامج بواسطة لغة عالية المستوى .

يفض المبرمجين لغة السي++ كلغة قياسية للبرمجة بلغة عليا لأن لها قدرة عالية وقوية جداً وموجهة الهدف مع القدرة على كتابة مقاطع السي فيها وهي لغة أقل أنخفاضاً وأكثر مرونة مع أستخدام الأسمبلي كعنصر مهم في الوصول الى العتاد وبرمجة الجزئيات المحتاجة للسرعة .

لا يستخدم المبرمجون شفرة الأسمبلي وسط شفرة لغة عالية المستوى عادة وأنما يستخدمونها عن طريق واجه على شكل دالة أو كائن وتحتوي هذه الدالة أو هذا الكائن على شفرة الأسمبلي المطلوبة ، وقد تستخدم روتيناً فرعياً أو دالة في لغة عالية المستوى وأنت لاتعلم بأنك باستدعاء هذه الدالة أو الروتين الفرعي قد أستدعيت شفرة مكتوبة بلغة الأسمبلي .

لغة الآله :

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

لفد حافظت شركة أنتل على التوافقية في العائلة X86 أبتداء من المعالج 8086 وصولاً الى بانتنيوم 4=80886 ولكن الحفاظ على التوافقية يفرض قيود على تصميم المعالج وأستخدام تقنيات قديمة ، ومؤخراً قررت شركة أنتل ايقاف عائلة المعالح X86 عند بانتنيوم4 وقامت بأنشاء معالج جديد (غير متوافق مع العائلة X86 ) مبني على تقنية ال64 بت وهو المعالج اتانيوم الجديد .

مثال على لغة الآله :

التعليمية 1011000000000101 هي تعليمة بلغة الآله ومعناها أنقل الرقم 5 الى المسجل ah يقابلها بلغة الأسمبلي mov ah,5 ال 8 بت الأولى من التعليمة تشكل شفرة التعليمة OP-code=operation code وهي تعني نقل قيمة بطول 8 بت الى المسجل AL ، الجزء الثاني من ال16 بت ال8بت الأخرى تشكل الرقم 5 ثنائياً


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


العد الثنائي :
يتم تمثيل الشفرات والبيانات في ذاكرة الكمبيوتر كتواليف من الشحنات الكهربائية تأخذ قيمتين الأولى وهي وجود الشحنة ويرمز لها ب ON أو صحيح TRUE أو ‘1’ والأخرى وهي غياب الشحنه ويركز لها ب OFF أو خطأ FALSE أو ‘0’ ، ووجود الشحنة يكون عادة بين 4.5 الى 5.5 فولت ( المعالجات الحديثه بين 2.5 الى 3.5 فولت ) وغياب الشحنة يكون بين +0.5 فولت و -0.5فولت .

وحدات الذاكره الأساسيه في الذاكره والوحدات التي سنتعامل معها كثيراً هي :




يرجى تنزيل الملف المرفق, لأنه منسق و لا أستطيع تنسيقه و كتابته هنا.




الأسكي كود ASCII:

يتم في الحاسوب وبقية توحيد أستخدام الرموز أستخدام شفرة الآسكي كود (حالياً يعمل على تبني شفرة ال unicode وهي تسمح بتعدد اللغات في مستند واحد حيث يتم تمثيل كل حرف بأستخدام كلمة واحده=2بايت) كلمة ASCII هي أختصار ل :
American National Standard Code For Information Interchange
ويتم أستخدام هذا الكود الموحد لتسهيل تناقل البيانات ويمثل كل رمز فيه بعدد ثنائي بطول 1بايت=8بت=256أحتمال .
إضغط هنا لمشاهدة الجدول آسكي

طريقة كتابة الأرقام في الأسمبلر :

لكتابة عدد ثنائي يوضع في آخر الرمز (b) لدلالة على أنه باينري مثال : Binary=11010010B أما العدد العشري فلايحتاج الى أضافة وأما العدد لأساس 8 فيكتب مع المرمز (Q) في نهايته Octal=1276Q أو الرمز (O) في نهايته Octal=1276O أما العدد السداسي عشر فيكتب بوضع H في نهايته hexadecimal=0AB9CDH مع مراعاة وضع 0 اذا كان العدد يبدأ بحرف كما المثال .

يجب أن تعرف الفرق بين تخزين الرقم كرقم أو تخزينه كنص فتخزين الرقم 201 مثلاً كرقم سسيأخذ بايت واحد وهو جاهز للقيام بعمليات رياضية ومنطقيه عليه أما تخزينه كنص فسيأخذ ثلاثة بايت في البايت الأول سيخزن الرقم الخاص بالأسكي كود للرمز '2' وكما قلت يخزن كرقم يدل على الرمز أما البايت الثاني فسيخزن رقم الآسكي كود للرمز '0' أما البايت الثالث فيأخذ القيمه الخاصة بالرمز '1' في الآسكي كود أي أن الرقم خزن بطريقة "102" وليس 102 وهذه الطريقة ليست جاهز للجمع أو الطرح ولكنها ممتاز للطباعه على الشاشه ويمكن تحويل النص الى رقم والعكس .

الأعداد ذي الأشاره :
يتم تخزين الأعداد ذي الأشاره كالتالي :
العدد موجب أذا كانت البت الأخيره صفر وقيمة الرقم هي باقي البتات أي لو أخذنا رقماً من بايت واحد فأن البت رقم 7 (الثامنه - الترقيم يبدأ من الصفر ) يجب أن تكون صفراً ليكون العدد موجب أما البتات من 0 الى 6 ( السبعه الأولى ) فتشكل قيمة الرقم
أما أذا كان العدد سالب فأن البت الأخيرة تساوي واحد أما قيمة الرقم فتساوي سالب المكمل الثنائي للعدد أي لو أخذنا رقم مخزن في واحد بايت مثال = 11110110 بما أن البت السابعه=1 فأن الرقم سالب / نأخذ الآن المكمل الثنائي للعدد وهو 00001010 / القيمة تساوي -00001010 أي سالب عشرة .


تعليمات وأوامر الأسمبلي :
تتكون التعليمه الواحدة في الأسمبلي من تمثيل بسيط بالأحرف الأنجليزيه يقابله بالأرقام تعليمة لغة آله ، تتكون كل تعليمة من ممايلي : أولاُ جزء الأمر وهو أمر يدل على نوع العملية المطلوبة مثل ADD (للجمع) ، الجزء الثاني هو الوسائط علماً بأن بعض التعليمات لايأخذ وسائط والجزء الآخر وسيطة واحدة فقط والبعض الآخر أكثر من ذلك ، تحدد هذه الوسائط الشئ الذي سيعمل عليه الأمر ،
فالأمر ADD لوحده عقيم لايدل على شئ لكن الأمر ADD AX,5 يدل على جمع الرقم 5 مع القيمة الموجودة في المسجل AX ويوضح المثال التالي بعض الأوامر

clc ; فقط أمر بدون وسائط
dec ax ; وسيطة واحدة فقط
mov cx,dx ; وسيطتين

لاحظ أن أي نص في شفرة الأسمبلي يأتي بعد الفاصلة المنقوطة هو مجرد تعليق


الوسائط ممكن تكون عدة أنواع :
1. معلومة فورية (مباشرة) (أي ثابته) مثال : 10 / 30 / 'a'
2. مسجل (سوف يتم شرح المسجلات بالتفصيل في الدروس القادمه ) مثال : AX / EAX / BL
3. موقع ذاكره (يتم تحديده عن طريق العنوان) مثال : [200] / [bx] / [100]
4.متغير (وهو نفس السابق لكن بدل أن تحفظ أو تحسب العنوان يدوياً يقوم الأسمبلر بأستبدال المتغير برقم يدل على عنوانه ) مثال : count / VAR1 / INTVAL / STR1

مدخل الى الديبغر Debugge :
ها قد وصلنا الى واحد من أقوى البرامج المبيته في النظام فبواسطة اليبغ تستطيع عمل أشياء عجيبه وغريبه ، حسناً شغل الدوس وعند محث الأوامر أطبع debug ثم أنتر وستظهر لك علامه '-' ليل على أستعداد الديبغر على أستقبال أوامرك .

c:\windows\debug


mov ax,2 ; نقل العدد 2 كمعلومة مباشرة الى المسجل أي-أكس
mov bx,3 ; نقل العدد 3 كمعلومة مباشرة الى المسجل بي-اكس
add ax,bx ; جمع أي-اكي مع بي-اكس مع وضع الجواب في أي-اكس / أي-اكس=أي-أكس + بي-أكس

كيف تقوم بأذخال هذا الكود :
1. عند المحث '-' أدخل a100 أي أننا سنبدأ نكتب الكود من العنوان 100 ثم أضغط أنتر بالطبع
2. الآن أدخل كل تعليميه ثم أضغط أنتر ومع نهاية التعليمية الأخيرة أضغط أنتر مرتين

[img:]http://fadisarsak.8m.com/1_3_2.gif[/img:]

الأن قم بأدخال الرمز R ثم أنتر لترى حالة المسجلات
لاحظ أن المسجل AX يساوي صفر وسترى أيضاَ ظهور التعليميه MOV ax,0002 وهي التعليميه التي عليها الدور في التنفيذ وليس المعلومة المنفذه ، الآن قم بطباعة الرمز T ثم أنتر لتنفيذ التعليميه التي عليها الدور هنا هي MOV AX,0002 سترى الآن أن المسجل AX أصبح يساوي 2 وهذا مانتوقعه بالضبط وسترى أيضاً التعليميع التي عليها دور التنفيذ وهي MOV BX,0003 أدخل الرمز T ثم أنتر لتنفيذها لترى أن المسجل BX أصبح يساوي 3 وسترى أيضاً التعليميه التي عليها الدور في التنفيذ وهي ADD AX,BX قم بأدخال الرمز T لتنفيذها ولاحظ كيف أن المسجل AX أصبحت قيمته مجموع العددين 2+3 وهو خمسة بينما بقى المسجل BX يساوي 3 .

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

:) أرجو أن بنال الدر أعجابكم و تفضلوا بقبول الإحترام من بريفو :)