مقدمة
(اقرأْ - فككَ - نفذَ) هيَ دورةُ تنفيذٍ تعليمةِ ضمنَ المعالجِ في الحاسوبِ ، في سلسلةِ المواضيعِ هذهِ سنتعرفُ على كيفيةِ عملِ المعالجِ ونفهمهُ على مستوى قريبٍ جدا ، بالإضافةِ إلى تعلمِ لغةٍ الاسمبلي لمعالجِ الْ x 86 وفهمُ طريقةِ تعاملِ المعالجِ معَ البياناتِ ، بالإضافةِ إلى مقارنةِ كودِ لغةٍ الْ C معَ نظيره في لغةِ الآلةِ والأسمبلي ، ستصبحُ لديكَ بعد قراءةِ هذهِ السلسلةَ فكرةً أوسعَ عنْ طريقةِ عملِ المعالجِ وستفيدكْ في حياتكَ البرمجيةِ لاحقا - إنْ شاءَ اللهُ - تعالى .
لماذا؟
أولاً لأنني متمكنٌ نوعا ما منها ودرستها في الجامعةِ إضافةً إلى دراستي الشخصيةِ لها ، لغةٌ الاسمبلي وإنْ كانتْ تبدو صعبةً للوهلةِ الأولى إلا أنها سهلةٌ ومنطقيةٌ وبإمكانكَ القيامُ بالكثيرِ بجهدٍ قليلٍ ، وسنتعرفُ على هذا لاحقا ، أما الآنِ فهدفَ تعلمنا للمعالجِ هذا هوَ فهمُ كيفيةِ حصولِ العملياتِ الرياضيةِ ، وكيفَ تؤثرُ على هذهِ العملياتِ على صوغِ المترجماتِ كما في c
المحور الأساسي للموضوع: الحساب
التحدث يطول عن المعالج، فهو محور دراسة طويل إذ عليك أن تتعلم بنية المعالج وكيف يتم تحليل العمليات وفك شفرتها وتنفيذها، وسيأخذ الأمر وقتا طويلا لدراسته ناهيكم عن كتابته، لذلك سنكتفي بتعلم الأساسيات في المعالج، وهي عمليات الحساب والمنطق، ومعالجة البيانات وتخزينها، بعدها نتعمق بأمور أوسع.
طريفة: هذا القسم كُتب سابقاً هنا… (البت “Bit” و البايت “Byte”)
كنت أود التطرق إلى شرح واحدات قياس البيانات والاستزادة بها لكن هناك من سبقني بذلك واستحق عليها جائزة الكتابة من أسس لذلك بإمكانكم الرجوع إليها من هنا.
ببساطة البت هو قيمة ثنائية تأخذ قيمة رقمية 1 أو 0 فقط، و التي يقوم عليها منطق جميع الدارت الرقمية مهما كان هدفها، أما البايت هي واحدة قياس للبيانات و التي تتألف من 8 بت، هذه القيمة ثابتة لأكثر من 50 سنة على معظم- إن لم يكن جميع -المعالجات الموجودة في السوق لذلك لن أدخل في أي نقاش حول ما إذا كان البايت أصغر أو أكبر من ذلك.
لماذا نتكلم عن البايت و البت إذا؟ يجب أول أن نفهم طبيعة البيانات.
لنفهم بنية المعالج بشكل مبسط عموما
الحاسوب الرقمي يستعمل البوابات المنطقية (AND، OR، NOT) والبوابات المنطقية المركبة (XNOR، NOR، NAND، XOR).
تجميع هذه البوابات بشكل معين ينتج عنه:
- عناصر حساب (Arithmetic) (جامع، طارح، إلخ)
- عناصر تخزين ذاكرة (Memory) قلابات (Flip- flop)، لاتشات (Latches)، المسجلات (Registers)
- عناصر التحكم والنقل والتحليل المسؤولة عن نقل وتنفيذ التعليمات بالشكل الصحيح.
تجميع العناصر السابقة ضمن وحدات متخصصة ينتج عنها عناصر كثيرة يشملها أي معالج حديث نستخدمه اليوم ونذكر منها:
-
وحدة الحساب والمنطق (تقوم بالعمليات الحسابية والمنطقية في المعالج ولها دور كبير بعمل الحاسوب وسرعته)
-
العدادات والمسجلات ومفككا الشيفرة، بالإضافة إلى النواقل (Buses) كناقل البيانات وناقل العناوين.
تجميع هذه المجموعات تشكل أي معالج نستخدمه الآن وفي مراحل لاحقة سنتعرف على كيفية تعامل المعالج مع الطرفيات الأخرى.
لاحظ هنا أن المعالج بدأ من أمور بسيطة، عبر دارات بسيطة كالبوابات المنطقية بدأنا نصنع عنصر أخرى أكثر تعقيدا كالبوابات المركبة، ثم قمنا بتركيب هذه البوابات مع بعضها لتشكل عناصر تقوم بعمليات حسابية، ومن بعضها الآخر قمنا بتصنيع القلابات واللاتشات والمسجلات والتي ساعدت بصنع عناصر أكثر تركيبا وأهمية كالعدادات والذواكر الرقمية، والدائرة تدور حول ذلك…
البايت و الكلمة، محور البيانات ضمن المعالج
مهمة المعالج بشكل أساسي هي معالجة هذه البيانات، فقد نحتاج إلى عملية حسابية بين رقمين أو أكثر، قد نحتاج إلى إظهار نص على الشاشة، لذلك فعلينا إدخال هذه البيانات إلى المعالج ليقوم بدوره بالشكل المطلوب.
لنأخذ على سبيل المثال حساب رقمين: 2 + 4
نقوم بإدخال الرقمين إلى مسجلات المعالج (و هي ذواكر فائقة السرعة هدفها تخزين بيانات مؤقتة ليتم معالجتها) ثم نقوم بتنفيذ العملية ADD المسؤولة عن جمع هذان العددان على هذا الشكل
mov ax,4
mov bx,2
add ax,bx
ما يقوم به المعالج هنا هو أخذ الرقم 4 و إدخاله للمسجل AX بعدها يأخذ القيمة 4 و إدخالها للمسجل BX ثم يقوم تنفيذ عملية ADD.
ADD: تستدعي وحدة الحساب و المنطق و تقوم بحساب مجموع ax + bx ثم تأخذ الناتج و تضعه في ax مرة أخرى لحفظ القيمة
بشكل آخر، ما تقوم به وحدة الحساب و المنطق هو الآتي:
ALU
ax--> 0000 0000 0000 0100
bx--> +0000 0000 0000 0010
=-------------------------------------=
0000 0000 0000 0110 ---->ax
كما تلاحظون هنا فإننا نقوم بالعمليات داخل المعالج بنظام العد الثنائي الذي يفهمه المعالج، لكن لماذا أرى 16 خانة هنا؟
لأن المسجل AX و BX طولهما 16 بت، طول المسجل يحدد معيارية المعالج إذا كانت 16 أو 32 أو 64 بت و تسمى هذه “عرض الكلمة” (word width) و هكذا كانا من أيام المعالج 8086 حتى هذه اللحظة، لو نظرت بشكل أدق تجد أن هناك بايتان، يدعى الأول بايتا سفلياً و الآخر بايتاً علوياً:
0000 0000 0000 0000
---------^ high byte
-------------------^ low byte
السبب في تسميتنا لهذان البايتان في حالتنا هذه علوي و سفلي هو قدرتنا على فصل البايتات و التعامل معها بشكل منفصل فمثلاً لا نحتاج استخدام كامل المسجل في حالتنا 16 بت و نكتفي فقط 8 بت (وهو أصغر مسجل يمكن استخدامه في x86 دون الحاجة لعمليات إضافية مثل bitwise لاستنتاج قيمة ما; لذلك تجد أن المتغير من نوع bool يأخذ قيمة 0/true false 1 بت لكن رغم ذلك فإنه يحتاج إلى حجز ال8 بت كاملة في الذاكرة
المسجلات AX و BX (من أجل موضوع اليوم) بإمكانهم الانقسام إلى قسمين لكل مسجل (AH_AL, BH_BL)
تمكننا هذه من تسريع و الاستفادة من عمل المعالج و التقليل من عدد الدورات المطلوبة لإنجاز مهمة ما بكفاءة أعلى و سيصبح لديك القدرة على العمل مع 4 متغيرات في الوقت نفسه بدل 2 على هذا الشكل:
0000 0000 0000 0000
^-------^ ^-------^
High Byte reg. Low byte reg.
نهاية الموضوع الأول
إذاً تعلمنا في هذا الموضوع بشكل مختصر عن المعالج، ثم تعرفنا عن ماهية البايت و الكلمة في المعالج.
في الموضوع القادم سنتحدث عن العمليات الأساسية في المعالج باستخدام لغة الاسمبلي و نقوم بمقارنتها مع لغة c و السلام عليكم و رحمة الله.