مشاهدة النسخة كاملة : برنامج الاسمبلي
abbadi
04-07-2004, 08:43 AM
اناعلى استعداد حل كافة الاسئلة في لغة الاسمبلي ان شاء الله
عاى من يؤيد حل لاي برنامج بلغة الاسمبلي او ++c
عليه كتابة السؤال الي الجواب انشاء الله في غضون 3ايام ان شاء الله:p
Fahad
04-07-2004, 09:08 AM
السلام عليكم ..
ارحب بك اخي abbadi في المنتدى وان شاء الله نرى منك دائما مشاركات متميزه ..
وارجو منك ان لا تبتعد كثيرا عنا لانه من المؤكد اننا سنحتاج الى خبرتك في لغة الاسمبلي والسي وخاصة في منتدى الالكترونيات في ما يتعلق ببرمجة الميكروبروسسور
انا بالنسبه للأعضاء الطلاب فربما يأتي عرضك متأخرا قليلا .. لانه جاء بعد نهاية الفصل الدراسي ..:D
:can:
abbadi
05-07-2004, 06:47 AM
السلام عليكم :
انا الطالب عبدالله عبادي من فلسطين
ادرس برمجة الحاسبات في جامعة النجاح الوطنية
ولي اهتمامات الكترونية(متواضعة)
بالنسبة للطلاب
يمكنني مساعدتهم في الفصل الصيفي
ويمكنني مساعدتكم في برمجة المعالجات الدقيقة انشاء الله
:cool:
اهلا وسهلا بك أخي الكريم ..
لدي اقتراح بسيط ..
لما لا تبدأ في شرح مبسط عن لغة الاسمبلي او كما يسميها البعض (لغة التجميع) وأمثلة بسيطة عنها .. فلربما يكون ذلك بداية طيبة للذين لسيت لديهم فكرة عن هذه اللغة ؟! :)
Razan
05-07-2004, 08:25 AM
كاتب الرسالة الأصلية : رؤى
اهلا وسهلا بك أخي الكريم ..
لدي اقتراح بسيط ..
لما لا تبدأ في شرح مبسط عن لغة الاسمبلي او كما يسميها البعض (لغة التجميع) وأمثلة بسيطة عنها .. فلربما يكون ذلك بداية طيبة للذين لسيت لديهم فكرة عن هذه اللغة ؟! :)
وأنا أيضا أساندك الرأي ...
تحياتي و بالتوفيق :)
abbadi
07-07-2004, 06:41 AM
السلام عليكم
اسف على التاخير
لكنني كنت مشغولا
في اعداد مدخل الى لعة الاسمبلي
ارجو ان يحووز على رضاكم:
تعلمنا من الكتب ومن السادة الدكاترة ان البرنامج هو سلسلة من
التعليمات تعطى للحاسب ليقوم بعمل معين . ايضا تعلمنا ان الدوائر
الالكترونية للحاسب تنفذ عدد محدود من التعليمات مثل جمع عددين او طرحهما
او التأكد ان ناتج عملية هو صفر او نقل بيانات من جزء في الذاكرة
الى اخر . طبعا هذه التعليمات التي يتعامل معها الحاسب مباشرة تسمى
لغة الالة Machine Language . طبعا تعليمات هنا عبارة عن 0 و 1
الواحد يعتبر شحنة كهرباء والصفر ايضا شحنة كهرباء لكن الفرق
بينهما مقدار الشحنة على ما اعتقد ان الواحد عبارة 4.5 فولت
والصفر عبارة عن 2.5 فولت طبعا كل هذا بداخل الدوائر الكهربية
للحاسب . تتميز هذه اللغة بأنها سريعة وقوية حيث تتعامل مع جميع
اجزاء الحاسب مباشرة دون وسيط ولكن يعيبها انها صعبة ومعقدة وتحتاج
زمن اطول في كتابة البرامج بها . طبعا لو كان في خطأ في البرنامج تعالى
نبحث مع بعض وسط الوحايد والاصفار نشوف اي صفر باشا او واحد بيه
عنده الخطأ يدينا ويديكم طول العمر ان شاء الله .
لذلك ظهرت لنا لغة التجميع فبدلا من ان نكتب الوحايد والاصفار
استبدل ذلك بمجموعة من التعليمات مثل MOV او ADD راجع المثال التالي
ولاحظ الفرق :
كود:
لغة عالية المستوى
PRINT "A"
كود:
لغة التجميع
MOV dx , 41h
MOV ah , 2
int 21h
كود:
لغة الالة بالنظام الثنائي
101110100100000100000000
1011010000000010
1100110100100001
شئ اخر معظم الحاسبات الحديثة تتألف من مستويين او اكثر
ايضا توجد الات بستة مستويات . == ماذا يعني هذه الكلام ؟
المستوى الاول Digital logic
وهذا المستوى يشمل الترانزستورات والبوابات المنطقية والدوائر الالكترونية .
المستوى الثاني Micro architecture
في هذا المستوى نجد اجزاء الحاسب الالي مثل المسجلات التي تعتبر
وحدات ذاكرة سريعة ومؤقتة داخل وحدة المعالجة المركزية
ووحدة الحساب والمنطق التي تنفذ العمليات الحسابية البسيطة .
بالاضافة مسارات البيانات التي تتدفق من خلاله المعلومات بين
المسجلات ووحدة الحساب والمنطق . للعلم ان في بعض الالات يتحكم في مسار
تنفيذ البرامج برنامج يسمى Micro program ويقوم بعمل وحدة التحكم
في معالجات اخرى .
المستوى الثالث Instruction Set Architecture
يختص هذا المستوى بالاوامر التي يمكن ان ينفذها الحاسب وتختلف هذه الاوامر
من حاسب لاخر .
المستوى الرابع Operating system machine
هذا المستوى يعتبر مهجن لان معظم التعليمات الموجودة في المستوى السابق موجودة
في هنا ايضا . بالاضافة الى مجموعة من التعليمات الجديدة تقوم بتنظيم الذاكرات
المختلفة وطريقة التعامل معها . التعليمات والميزات الجديدة تنفذ بواسطة مفسر
يعمل على المستوى الثالث اما التعليمات المتشابهة مع تعليمات المستوى الثالث
فتنفذ مباشرة بواسطة Micro program او CU وحدة التحكم هذا يعني ان اي جزء
من تعليمات المستوى الرابع تنفذ بواسطة micro program والباقي ينفذ بواسطة
الحاسب الالي .
المستوى الخامس Assembly language
المستويات السابقة لا يتعامل معها المبرمج مباشرة وانما هى لتشغيل المفسرات
والمترجمات وتجهيز الحاسب للتعامل مع المستويات العليا . هذه المترجمات والمفسرات
تكتب بواسطة مبرمجي نظم او من هم يقوموا بكتابة نظم التشغبل .
المستوى الخامس وما فوقه هي للبرامج التطبيقية وحلول المسائل ايضا لغات الالة
للمستويات 1 و 2 و 3 تكون رقمية اي ان البرامج المكتوبة عبارة عن سلسة من الارقام .
بدء من المستوى الرابع اللغات تكتب بصورة نصية . المستوى الخامس هو لغة التجميع
التي هى عبارة عن تمثيل رمزي للغة الالة وهذا المستوى يسمح للمبرمجين بكتابة برامج المستويات 2 و 3 و 4 في شكل رموز او نصوص البرامج المكتوبة بلغة التجميع يتم تحويلها الى المستويات 2 و 3 او 4 البرنامج الذي يقوم بالتحويل من لغة التجميع الى لغة الالة يسمى Assembler .
المستوى السادس
يتكون من لغات تستخدم للبرامج التطبيقية او كما تسمى لغات المستوى العالي
مثل C++ و Basic و JAVA البرامج المكتوبة بهذه اللغات تحول الى المستوى الرابع
او الخامس بواسطة محولات تسمى مترجمات Compilers احيانا يكون هناك مفسرات في هذا المستوى Interpreters لاغراض معينة .
ماذا يعني كل مل سبق ان صممت الحاسبات كسلسلة من المستويات كل مستوى مبني
على سابقاته كل مستوى يتميز بالعمليات التي ينفذها والكائنات التي يتعامل
معها .. بتصميم الحاسبات بهذا التنظيم والتدرج يكون بإستطاعتنا تقليل
التعقيدات واخفاء التفاصيل الدقيقة .
يعني بالعربي الواحد يعرف حدوده فين وتبع اي مستوى علشان الواحد بيخلف على
البريستيج بتاعه بدل ما الواحد روح على مستوى يرد عليه انت رايح فين يااستاذ
يبقى الواحد في اللحظة دي يروح ....
بسيطة ان شاء الله .....
بصراحة الواحد محتار يبدأ معاكم في اللغة مباشرة ولا نتناول بعض المعلومات عن
الحاسب والمعالجات مع العلم انني اعتبرها مهمة جدا هذه المعلومات .
عموما سوف ابدأ في تعليمات اللغة وبين الحين والاخر سوف نناقش موضوع يتعلق
بالحاسب والمعالجات او ممكن تساعدوني حضاراتكم في ذلك ...
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
قبل الدخول والغوص في تعليمات اللغة تعالوا نناقش
التنظيم البرمجي للمعالج 8086 وهو المعالج الذي بنى عليه جميع معالجات شركة انتل بمعنىاي تعليمة خاصة بهذا المعالج تصلح لاي معالج اعلى منه من شركة انتل
اول شئ لابد التكلم عنه هو المسجلات .
المسجلات كما ذكرنا من قبل وهي وحدات ذاكرة سريعة ومؤقتة داخل وحدة المعالجة المركزية . حيث يتم تخزين البيانات داخل المعالج في المسجلات .
ويتم تقسيم المسجلات الى :
مسجلات بيانات :
ويتم فيها التعامل مع البيانات من حيث التخزين واجراء العمليات الحسابية والمنطقية .
مسجلات عناوين :
ويتم فيها تخزين العناوين المختلفة .
مسجلات الحالة :
وهو يحتوي على حالة المعالج بعد تنفيذ امر محدد .
يحتوي المعالج على 14 مسجل وسوف اقوم بشرح اسماء ووظيفة كل مسجل .
=== مسجلات البيانات ===
===AX , BX , CX , DX ===
يتم استخدام هذه المسجلات الاربعة في التعامل مع البيانات داخل المعالج
ويمكن للمبرمج التعامل مباشرة مع هذه المسجلات .
بالرغم من ان المعالج يستطيع ان يتعامل مع بيانات الذاكرة الا ان التعامل
مع المسجلات يكون اسرع بكثير من التعامل مع الذاكرة بالتالي نفضل دائما
التعامل مع المسجلات لسرعتها وهذا سبب زيادة عدد المسجلات في المعالجات الحديثة .
** جميع المسجلات السابقة بحجم 16 BITS .
** يمكن التعامل مع كل من هذه المسجلات على انه وحدة واحدة بحجم 16 BITS
او على وحدتين كل وحدة بسعة بسعة 8 BITS ااحداهما العليا HIGH والثانية
المنخفضة LOW .
** مثلا يمكن التعامل مع المسجل AX على انه مسجل 16 BITS او التعامل
مع النصف العلوي AH على انه مسجل 8 BITS او المنخفض AL بحجم 8 BITS .
بالمثل مع المسجلات BX - CX - DX .
بالتالي يصبح لدينا 8 مسجلات من النوع 8 BITS او 4 من النوع 16 BITS .
تعرف المسجلات الاربعة السابقة بأنها ذات استخدامات عامة بحيث يمكن استخدامها
في اي استخدامات عامة الا ان لكل مسجل استخداما خاصا .
## المسجل AX
يعتبر المسجل AX هو المسجل المفضل للاستخدام في عمليات الحساب والمنطق ونقل البيانات والتعامل مع الذاكرة وعمليات الادخال والاخراج . واستخدامه يولد برامج اقصر ويزيد من كفاءة البرنامج . عموما يتم التعامل مع المسجل AX على انه اهم المسجلات الموجودة في المعالج .
المسجل BX
يستخدم هذا المسجل في عنونة الذاكرة حيث تتطلب بعض العمليات التعامل مع الذاكرة بمؤشر محدد ويتم تغيير قيمة المؤشر لاجراء عملية مسح لجزء محدد من الذاكرة .
المسجل CX
يتم استخدام المسجل CX كعداد للتحكم بعدد مرات تكرار مجموعة محددة
من التعليمات ... كذلك يتم استخدامه في تكرار عملية دوران مسجل لعدد
محدد من المرات .
المسجل DX
يتم استخدامه في عمليات الضرب والقسمة كذلك يتم استخدامه كمؤشر لعمليات الادخال
و الاخراج .
لاشك ان المسجلات من اهم المواضيع في لغة التجميع قمت بتوضيح النوع الاول من المسجلات
النوع الثاني وهو مسجلات المقاطع تحتاج الى شرح طويل الوجبة السابقة اعتقد انها دسمة بعض الشئ لذا سوف اتركم حتي تتم عملية الهضم ونلتقى في درس اخر .
لكن رجائي ياريت التركيز في كلمة كلمة تذكر فهذه اللغة كل معلومة تفيد جدا جدا
معها .
يتبع..........
في الختام اود معرفة ارائكم في الدروس لان ذلك يهمني جدا ...
abbadi
شكرا لك على هذا الموضوع الغني والذي أضاف لمعلوماتي الكثير
ملاحظاتي ..
حاليا .. لا تذكر .. سوى رجاء خاص بأن تذكر المصطلحات بالعربية والانجليزية متى ما أمكن ذلك
وان شاء الله لي عودة مع هذا الموضوع والذي يبدو انه ممتع ..
قبل ان نبدأ
هل بالامكان ان تزودنا بالمفسر لهذه اللغة ..
وايضا سؤال ثاني .. ما هو اسم برنامج Editor الذي يستخدم لكتابة البرنامج ؟؟
واذا بالامكان تزودنا به ايضا ..
علي الشريف
10-07-2004, 12:29 AM
السلام عليكم ورحمة الله وبركاته
جزاك الله كل خير واتمني ان تواصل الشرح واتمني لك التوفيق
abbadi
10-07-2004, 10:13 AM
اسف على التاخير
هذاهو الدرس الاول (بعد المقدمة السابقة)
قبل ان ابداء يجب ان تعرف معلومة و هي ان هناك اكثر من Compilers لهذه اللغة و من اشهرها هم MASM ، TASM و تختلف طريقة كتابة الكود قليلاً في كل منهما .
فلنبدا ب TASM .
------------- البرنامج الاول ---------------
[شفرة]
ideal
p286n
model tiny
codeseg
org 100h
jmp start
start:
mov ax, 4c00h
int 21h
end
[/شفرة]
قم بكتابة الكود السابق في Notepad ثم قم بتسميته
a1.asm
او اي اسم أخر .
---------- شرح البرنامج --------
ideal : تعني اننا نستخدم TASM لا سواه .
p286n : تعني اننا نستخدم معالج من النوع 80286 و هذا يعني اننا سوف نقوم بتشغيل البرنامج على جهاز PC عادي .
model tiny : تعني اننا نريد الناتج على طريقة COM .
codeseg : تعني اننا سوف نبدا من هنا في البرنامج .
org 100h : تعني اننا سوف نستخدم طريقة COM عادية ( سوف اشرحها في ما بعد )
jmp start : اوامر ال COM لا بد ان تبداء بالامر jmp و نضع المتغيرات بين jmp و البداية .
السطرين التاليين : لا تدعهم في بالك الإن لان وضعتهم فقط لتجريب البرنامج .
end : و تعني النهاية للبرنامج .
----------------------------------------------
بعد الانتهاء من تخزين الملف يجب ان يكون لديك ملفين البرنامج و هم
TASM
TLINK
يمكنك انزالهم من عدة اماكن و هذا وصلة للتنزيل الملف.
http://www.bahraininet.net/C4ARAB/1.zip
استخدم برنامج
في الدوز اذهب الى الملف الموجودة الملفات به ثم قم بما يلي :-
TASM a1.asm
TLINK a1.OBJ
و سوف يكون الناتج a1.exe و لا تتوقع خروج OUTPUT لاني وضعة اساسيات البرنامج و سوف اشرح طريق اظهاره لاحقاً .
------------------------ لمعلوماتك --------------------------
لو اردة كتابة الكود نفسه ب MASM فسوف يكون كتالي
.286
.model tiny
.code
org 100h
entry:
jmp start
; your data and subroutine here
start:
mov ax, 4c00h
int 21h
end entry
----------------------------
و الجميل في لغة الاسمبلي هو صغر حجم البرنامج و عدم الحاجة الى اي برنامج ملف اضافي لتشغيل البرنامج .
abbadi
12-07-2004, 06:44 AM
الدرس التاني:
بسم الله الرحمن الرحيم
مدخل عام إلى لغة التجميع:
معالج أي حاسب لا يفهم أية لغة، لا الباسكال ولا السي ولا الجافا، ولا حتى التجميع في حد ذاته، إنما يفهم شيئا واحدا، هو لغة الآلة. إنها قائمة من ثمانية أعداد تسمى البتات bits، وتكون مقدمة في النظام الست عشري، على شاكلة "B0h 12h". ومنه يمكننا القول أن التجميع هو إصدار يتوافق مع فهم البشر للغة الآلة.
المثال السابق يعطينا "mov al, 12h"، ومعناها نسخ القيمة 12h في السجل AL. ستفهم معنى ذلك بعد قراءتك لهذه السلسلة إن شاء الله!
كما يمكنك ملاحظته، إنها اللغة البرمجية الأكثر قربا إلى المعالج (إلا في حالة قدرتك على البرمجة بلغة الآلة نفسها).
سؤال قد يتبادر إلى ذهنك: فيم تستعمل؟ الأهمية الأولى تتمثل في السرعة، حيث أنها اللغة التي بفضلها يمكننا تحقيق البرامج الأكثر سرعة، وخاصة في ميدان الرسومات.
ثانيا، يمكنك الوصول إلى مقاطعات الدوس (interruptions)، والتي تسمح بالوصول المباشر إلى العتاد، كالفأرة أو الشاشة أو حتى بطاقة الفيديو. لأن المترجم (compiler) لا يعمل إلا على ترجمة البرنامج المكتوب بلغة يفهمها الإنسان إلى لغة التجميع، وهذه العملية يمكن القيام بها يدويا بعد تدريب طويل في هذا الميدان. كما يتيح لنا التجميع إمكانية معرفة ما يتوفر عليه ملفنا الثنائي (ملف تنفيذي .exe أو .com في بيئة مايكروسفت).
بعض المتمرسين في البرمجة وخاصة القراصنة، لا يستخدمون إلا التجميع في برامجهم، والسبب هو إنجاز برامج سريعة وصغيرة، وفي نفس الوقت تحقيق مرادهم من خلال قرصنة البرامج أو ببرمجة ما يرفضه المترجم كالفيروسات.
المختصون في البرمجة لا ينصحون أبدا بأن يقوم المبرمج بإنجاز برنامجه 100% بلغة التجميع، لأن الكود سيفقد مرونته وتكثر أخطاءه، مما يفقد السيطرة على برنامج يتكون من آلاف الأسطر، على اعتبار أن كل تعليمة تقع في سطر واحد. وإنما ينصح باستخدام التجميع لتحسين أداء بعض الدوال أو الإجراءات في لغة البرمجة التي تعتمدها (السي، الباسكال ...)، والتي تحتاج لسرعة قصوى، سواء لدوال تطلب لمرات عديدة، أو تلك المسؤولة عن القيام بوظائف معينة، كرسم خط، أو نسخ قطاع كامل من الذاكرة...الخ.
معجم التجميع:
المصرف: هو برنامج يقوم بتحويل كود مصدري (ملف نصي، أما للتجميع، فالملف يكون ذو توسع .asm) إلى كود الآلة، يعني إنشاء ملف ثنائي (ملف ذو توسع -امتداد- .obj أو .exe أو .com).
الست عشري (Hexadecimal): في نظام العد المتداول بين الناس، نستعمل الأرقام العربية، والمحصورة بين 0 والـ 9، إذن ما مجموعه 10 أرقام، والرقم الأكبر هو 9 (10-1). نقول إذن عن هذا النظام أنه نظام عشري decimal. فالعدد 451 يمكننا تفكيكه على شكل:
( 4×100) + (5×10) + (1×1)= 4×10 2 + 5×10 1 + 1×10 0.
النظام الست عشري ينتهي عند 16، والسبب الذي دفع إلى ذلك هو تمثيل النظام الثنائي بأقل عدد ممكن من الأرقام. فكما نعلم جميعا، فالنظام الثنائي يتكون من رقمين فقط، وهما الـ 0 والـ 1، ولتكوين أي رقم آخر، فإننا نكتب متوالية من الأصفار والوحدات على شاكلة 01101001 وهذا الرقم يمثل 105 في نظام عدنا الذي نستعمله يوميا، ولكن لتمثيل أعداد كبيرة نحتاج إلى أصفار ووحدات كثيرة، مما يسبب العديد من الأخطاء ويضيع الوقت، ويعقد الفهم، لهذا جاء دور النظام الست عشري ليحل الإشكال، ويعوض كل أربعة أرقام ثنائية برقم ست عشري واحد.
01101001 = 1001 و 0110 = 9 و 6 = 69 في النظام الست عشري.
النظام الست عشري يبدأ من الـ 0 وينتهي عند الـ 15، ولكن الأرقام الستة الأخيرة (من 10 إلى 15) تتكون من وحدتين، وهذا ما سيخلط الأمور، لهذا تم تعويضها بحروف، كما يشير الجدول الآتي إلى ذلك:
النظام الست عشري
النظام الثماني
النظام الثنائي
النظام العشري
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
10
11
0
1
10
11
100
101
110
111
1000
1001
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
12
13
14
15
16
17
1010
1011
1100
1101
1110
1111
10
11
12
13
14
15
ملاحظة: يشار للرقم في النظام الست عشري بعدة رموز:
ففي لغة السي نشير إلى الرقم بالسابقة 0x، أما في لغة الباسكال، فيسبق الرقم رمز الدولار، وفي لغة التجميع يشار إلى الرقم أنه ست عشري من خلال اللاحقة h
Ox14 في لغة السي = $14 في لغة الباسكال = 14h في لغة التجميع.
ملاحظة: لغويا، العدد هو الكتابة الحرفية للرقم، والرقم هو الكتابة الرمزية للعدد.
البايت (Byte): البايت هو متوالية من ثمانية بتات (8 bits)، فإذا كان البايت مرمّزا (signed) فإنه يمكنه أخذ قيمة محصورة بين –128 و +127 (128= 2 8-1 = 2 7 ، و127= 2 (8-1)-1)، إذن تحتل القيم المحصورة 7 بتات فقط، والبت الأخير يستخدم للإشارة (السلب أو الإيجاب)، إما إذا كان البايت غير مرمّز فإنه بإمكانه أخذ قيمة محصورة بين 0 و 255، أي 256 حالة = (2^8).
الكلمة (Word): بما أن البايت يشغل 8 بتات، فإن الكلمة تشغل 16 بتا، وبالتالي يمكن القول أن الكلمة تحوي 2 بايت.
إذا كانت الكلمة مرمزة، فإنها قادرة على احتواء قيمة محصورة بين –32768 أي (2 15)، و 32767 أي (2 15 - 1)، أما إذا كانت غير مرمزة، فالقيمة المحتواة تكون محصورة بين 0 و65535 (2 16 -1).
الكلمة المضاعفة (Double Word أو DWord): وتشغل الكلمة من هذا النوع قيم ذات 4 بايت. إذن إذا كانت مرمزة، فإنها تكون بين –2147483648 أي (2 31)، و +2147483647 (2 31 –1)، أما إذا كانت غير مرمزة، فبإمكانها حصر قيمة تتراوح بين 0 و 4294967295.
السجل (Register): هو فراغ ذاكري موجود بصفة فيزيائية في قلب المعالج (Processor)، والذي تحفظ فيه القيم أثناء معالجتها. في البداية كانت السجلات تعمل على ثمانية بتات (بايت واحد)، وكانت تسمى آنذاك ?L (حيث يمكن للرمز " ?" أن يكون A أو B أو C أو D)، ثم تطورت السجلات إلى 16 بت (كلمة)، وصارت مسماة بـ ?X، الشيء العجيب في هذا، هو أننا لو قمنا بتغيير قيمة ?L فإننا نكون بذلك قد غيرنا الجزء المنخفض من السجل ?X. بمعنى آخر، ?X مكون من بايت ومن ?L (ويقال أيضا من جزء مرتفع وجزء منخفض). ثم بعد وصول معالجات 386، تم الانتقال إلى سجلات 32 بت، وصارت بالتالي تسمى بـ E ?X، وهنا إذا ما قمنا بتغيير قيمة ?L أو ?X فإننا نكون بذلك قد قمنا بتغيير الجزء E ?X.
السجلات القاعدية هي السجلات AX، BX، CX و DX، وهي سجلات ذات 16 بت (= 2 بايت)، وأجزاءها المنخفضة (Low) هي AL، BL، CL و DL أما أجزاءها المرتفعة (High) فهي AH، BH، CH و DH.
إذا كان AX معدوما (null)، فهذا يعني أن AL =0 و AH =0 أيضا. وإذا ما قمنا بغيير قيمة AX فإننا نغير قيمتي AH و AL معا، أما لو قمنا بتغيير قيمة AL فهذا يعني أن قيمة AX تغيرت أما قيمة AH فمازالت كما هي. (الرسم السابق يوضح الصورة أكثر).
لنلاحظ هذا المثال:
al = 15
ah = 10
=> ax = al + ah*256 = 15 + 10*256 = 2575
لمزيد من التفاصيل راجع قائمة السجلات في الدروس التالية.
القطاع والفرع (Segment & Offset): العناوين الذاكرية (مواقع البايتات على صفائح الذاكرة) معرفة بسجّلين، القطاع (الجزء المرتفع من العنوان)، وبالفرع (الجزء المنخفض من العنوان). نشير أن العنوان يحدد بـ [Segment :[Offset (حيث أن النقطتين ":" هما الفاصل، في حين يعتبر المجالان "]" و "[" غير إجباريين). مثال: [DS :[DI
مع وصول الـ 386، تطورت الفروع إلى 32 بت، من أجل الوصول إلى أقصى الذاكرة (16 ميغا بايت)، وظهرت بذلك الفروع بالسابقة E، مثل (ESI, EDI, ESP, EBP)، هذا بالنسبة لسجلات 32 بت، ونفس الشيء كان مع سجلات 16 بت، حيث كانت الفروع SI, DI, SP, SB. لمزيد من التفاصيل، راجع قائمة السجلات في الدروس القادمة.
المقاطعة (Interruption): يمكن وصف المقاطعة على أنها برنامج صغير مخزّن في الذاكرة، ويتم طلبه عدة مرات لأداء مهمة محدّدة ، وبوثيرة متزايدة أو متناقصة. يوجد على الأكثر 256 مقاطعة، فالأولى منها مدمجة في البيوس (BIOS، وهو برنامج ينفذ عند تشغيل الحاسب، والذي يسيّر العتاد: القرص الصلب، الوصول إلى الذاكرة ...)، مثل مقاطعات بطاقة الفيديو ولوحة المفاتيح.
بعض المقاطعات يتم طلبها بوثيرة ثابتة: المقاطعة 1Ch مثلا والتي هي عدّاد يزيد في القيمة 18.6 مرة/ثانية (أي يضيف 1 للقيمة المعنية). البعض الآخر يتم طلبه فقط في حالة ما إذا أردناها: المقاطعة 09h الخاصة بلوحة المفاتيح، يتم طلبها في كل مرة يقوم المستخدم بالضغط على زر ما أو عند تحريره.
المكدس (Stack): في المكدس نقوم بإضافة القيم بفضل التعليمة PUSH، ونقوم بحذفها من خلال التعليمة POP. في قمّة المكدس نجد قيمة السجلE]BP]. ويمكننا بذلك معرفة ما هو موجود في الطابق X من خلال التعليمة "[mov AX, [Bp-4"، ولكن ليس لحذف هذه القيمة، لأننا لو قمنا بحذف قيمة من وسط المكدس، فإن هذه الأخيرة تتقهقر، وهذا ما يؤدي إلى توقف الحاسب عن العمل.
الراية (Flag): الرايات هي بتات موجودة بداخل المعالج. وسنفرد لقائمة الرايات مجالاً للحديث في الدروس القادمة.
Fahad
12-07-2004, 08:53 AM
شكرا لك اخي على هذا الشرح الرائع ..
واحب ان اضيف الفرق بين
MASM .. وهو برنامج من انتاج شركة مايكروسوفت
TASM .. من انتاج شركة بورلاند
ويمكنك اختبار البرمجة بواسطة تحميل هذا الملف والذي يحتوي على كلا النسختين MASM v 5.1 و TASM v 1.01
ملف لغة التجميع .. (http://www.electvillage.com/Prog/Assemple.zip)
:can:
Dreamer
12-07-2004, 01:35 PM
شكرا لك ويعطيك الله العافية وزادك الله علم
عندي سؤال؟ هل الاسمبلي تعمل مع جميع المعالجات وانظمة التشغيل ؟
abbadi
شكرا لك مرة اخرى ..
و لازلنا ننتظر المزيد.. :)
abbadi
أطلت علينا الغيبات .. ولازلنا ننتظر دروسك المشوقة
عسى المانع خيرا ان شاء الله :(
abbadi
27-07-2004, 06:32 AM
بسم الله الرحمن الرحيم
اسف جدا جدا على التاخير
لكن السبب هو امتحانات الفصل الصيفي
ومايوجد عندنا انترنت في البيت الان
هذا الموضوع بعنوان تعليمات الااسمبلي ويحتوي على درسين
الدرس الاول يحوي 16 تعليمة هي:
ADD – AND – CALL – CMP – CMPS – IN – IRET – JMP - J[case] – LEA – LDS - LES - LFS – LGS – LSS – LODS
وفي الدرس الثاني توجد 18 تعليمة هي:
MOV – MOVS - MOVZX - MUL – NOT – OR - OUT - PUSH – POP – REP – RET – SCAS – SHL – SHR – STOS – SUB – TEST - XOR
في كل تعليمة:
المجالين "}" و "{" يحددان البارامترات. والتي قد تكون سجّلا أو منطقة ذاكرية أو قيمة فورية (Immediacy)، وهي في الغالب عدد.
اللاحقة "[B أو W أو D]" في نهاية التعليمة تحدد أسلوب معالجة التعليمة.
"B" : تعني هذه اللاحقة أن التعليمة من نوع 8 بت (Byte)، وهذا ما يجعل استعمال السجل AL ضروريا.
"W" : تعني هذه اللاحقة أن التعليمة من نوع 16 بت (Word). استعمال السجل AX ضروري.
"D" : تعني هذه اللاحقة أن التعليمة من نوع 32 بت (DWord) . استعمال السجل EAX ضروري.
بسم الله نبدأ:
1- التعليمة ADD:
ADD {destination},{source} // ADD {الوجهة},{القناع}
تقوم هذه التعليمة بإضافة قيمة المصدر لقيمة الوجهة، وينجم عن هذه العملية تغيير في محتوى الرايات، ويتم تخصيص ناتج الجمع للمعامل الأول.
قد يكون أحد المعاملين سجلا، كما فد يكون المعامل الثاني مرجع ذاكري (متغير أو عنوان ذاكري) أو immediate (رقم مباشر).
add ax, bx // => ax=ax+bx // (reg, reg) كلا المعاملين سجّلا
add ax, 5 // => ax=ax+5 // (reg, imm) المعامل الثني هو عدد مباشر
add ax, var// => ax=ax+var // (reg, mem) المعامل الثني هو مرجع ذاكري add ax, [si] // => ax=ax+[si] // (reg, imm) المعامل الثني هو مرجع ذاكري
2- التعليمة AND:
AND {destination},{mask} // AND {الوجهة},{القناع}
لتبسيط هذه التعليمة، ووفقا جدول الحقيقة الذي سنطّلع عليه لاحقا، فإن الناتج صحيح (=1)، إذا كان كلا المعاملين صحيح، والناتج يكون خاطئا (=0) إذا كان أحد المعاملين خاطئا أو كلاهما.
وبمفهوم آخر أكثر وضوح، تقوم هذه التعليمة بجعل كل بت في الوجهة مساويا للصفر إذا كان القناع مساويا للصفر، في حين لا تغير بت الوجهة إذا كان القناع مساويا للواحد.
حسب لغات البرمجة المعروفة يمكننا تمثيل ذلك بـ:
Destination := Destination AND Mask ; // بلغة الباسكال
Destination &= Mask ; // بلغة السي
3- التعليمة CALL:
CALL {address}
تطلب الإجراء (procedure) أو الدالة (function) المتواجد في العنوان المحدد. فإذا سبقت التعليمة CALL عدة تعليمات من نوع PUSH، فهذا يعني أنها مجموعة من البارامترات تم تخزينها في المكدس (Stack). وفي هذه الحالة ، فإن الإجراء يبدأ بــ:
"push [e]bp ; mov [e]bp, [e]sp "
ويمكننا أيضا إيجاد قراءة للبارامترات على شكل:
" mov {Register}, [ebp – {Value}] "
وأخيرا لا يجب نسيان التعليمة "RET [{Value}]" في نهاية الإجراء.
4- التعليمة CMP:
CMP {a},{b}
تقوم هذه التعليمة بمقارنة المتغير a مع المتغير b. وبعدها نجد مباشرة قفزا مشروطا نحو فرع ذاكري آخر "jmp أو je أو jne ...، بصفة عامة j[case] {Offset}".
5- التعليمة CMPS:
CMPS [B/D/W]
هذه التعليمة تقارن كل بايت/كلمة/كلمة_مضاعفة من القطاع والفرع الذاكريين DS :ESI مع القطاع والفرع الذاكريين ES :EDI
6- التعليمة IN:
IN {destination},{port}
هذه التعليمة تقرأ قيمة ذات 8 بت على المنفذ {port}، وتخزنه في الوجهة {destination}. أما السجل الوحيد المسموح باستعماله في هذه العملية فهو السجل DX.
7- التعليمة IRET:
IRET {value}
هذه التعليمة تسمح بمغادرة المقاطعة، وتستعمل فقط للبرامج المستقرة في الذاكرة، مثل سائق (driver) الفأرة.
8- التعليمة JMP:
JMP {offset}
هذه التعليمة تمكن من القفز إلى العنوان الذاكري المحدد بالفرع {offset}.
9- التعليمة J[case]:
J[case] {offset}
إذا كانت الحالة [case] صحيحة، فإن التعليمة تنفّذ، وينتقل العمل بذلك إلى العنوان المحدد في الفرع {offset}. الحالة [case] هي شرط متعلق بالرايات (flags)، ويتم تنفيذ الشرط وفق قواعد المنطق المعروفة.
الحالات الممكنة لـ case، بعد أخذ " CMP {a},{b}" كمثال:
غير مؤشرة not signed:
JA : يتم القفز إذا كان أكبر، في مثالنا a > b، إذا كانت الراية (الدليل) CF=ZF=0JAE, JNB, JNC : إذا كان أكبر أو يساوي (a>=b)، إذا كان CF = 0
JB, JC : أصغر (a<b)، إذا كان CF=ZF=1
JBE : أصغر أو يساوي (a<=b)، إذا كان CF><OF و ZF=1.
مؤشرة signed:
JG : أكبر (a>b)، إذا كان SF=ZF=0
JGE : أكبر أو يساوي (a>=b)، إذا كان SF = OF
JL : أصغر (a<b)، إذا كان SF <> OF
JLE : أصغر أو يساوي (a<=b)، إذا كان SF<>OF و ZF=1.
متساوية:
JE, JZ : يساوي (a=b)، إذا كان ZF=1.
JNE, JNZ : يختلف عن (a <> b)، إذا كان ZF=0.
10- التعليمة LEA:
LEA {destination},{source}
يتم هنا كتابة عنوان المصدر {source} في الوجهة {destination}.
هذه التعليمة تكافئ:
MOV {destination},Offset{source}
11- التعليمة LDS:
LDS {destination},{address}
نسخ عنوان {address} من نوع 32 بت في السجّل DS، (الذي هو قطاعه)، وفي {destination} من نوع 16 بت، (التي هي فرعه).
12- التعليمة LES:
LES {destination},{address}
نسخ عنوان {address} من نوع 32 بت في السجّل ES، (الذي هو قطاعه)، وفي {destination} من نوع 16 بت، (التي هي فرعه).
13- التعليمة LFS:
LFS {destination},{address}
نسخ عنوان {address} من نوع 32 بت في السجّل FS، (الذي هو قطاعه)، وفي {destination} من نوع 16 بت، (التي هي فرعه).
14- التعليمة LGS:
LGS {destination},{address}
نسخ عنوان {address} من نوع 32 بت في السجّل GS، (الذي هو قطاعه)، وفي {destination} من نوع 16 بت، (التي هي فرعه).
15- التعليمة LSS:
LSS {destination},{address}
نسخ عنوان {address} من نوع 32 بت في السجّل SS، (الذي هو قطاعه)، وفي {destination} من نوع 16 بت، (التي هي فرعه).
16- التعليمة LODS:
LODS [B/D/W]
نسخ البايت/الكلمة/الكلمة_المضاعفة ES :EDI في السجل AL/AX/EAX.
* التعليمة العكسية لها هي: " STOS [B/D/W]".
منقول (مع الكثير من التعديل)
vBulletin® v3.8.6, Copyright ©2000-2013, TranZ by Almuhajir