/Into the Low Level: Getting Serious (0x07)

Into the Low Level: Getting Serious (0x07)

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

 

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

في لغة التجميع عموما يتكون الكود من الامر والمعامل (Instruction,Operand) الامر هو مايبدا بالتنفيذ..اما المعامل فهو القيم التي يُنفذ عليها العمليات او التى تعتمد عليها تنفيذ العمليه، ففي  int 80h على سبيل المثال، يعتمد الامر int علي قيمة المعامل فإذا كانت 80 فهو ينفذ استدعاء نظام لينوكس. اذا كانت 13 فسوف ينفذ مايسمي ب قاطع بيوس (BIOS Interrupt) اما اذا كانت 21 فهو استدعاء نظام فى الدوس، و 19 فهو ينفذ مايمسي بتحميل البرنامج التمهيدي (Bootstrap load). والعديد من القيم الاخرى.
اما فى عمليه او امر مثل MOV فلا يعتمد الامر على المعامل لانه فقد ينفذ العمليه المطلوبه منه. مثل MOV eax,27F2h هو فقط ينقل القيمه الثانيه داخل الهدف الاول ولايهتم اي كان الهدف او اي كانت القيمه الا اذا حدث خطأ بالطبع.

العملية MOV :
هناك ستة اشكال لتنفيذ تلك العمليه هم.

  • MOV eax,89h  وهنا المصدر بيانات واضحه وتسمى بالبيانات الفورية
  • MOV eax,ebx  هنا المصدر والهدف ريجسترات مساحة كل منهما 32 بيت
  • MOV ax,dx  هنا المصدر والهدف ريجسترات مساحة كل منهما 16 بيت
  • MOV ah,dh  هنا المصدر والهدف ريجسترات مساحة كل منهما 8 بيت
  • MOV [eax],ebx هنا المصدر الريجستر مساحتة 32 بيت والهدف عنوان الذاكرة الى مساحته 32 بيت الى فى الريجستر eax
  • MOV eax,[ebx] هنا العكس تماما فالمصدر هو العنوان الذي يحتويه الريجستر ebx اما الهدف فهو الريجستر eax

فلنجرب تلك البيانات الفورية..

اذا نفذت الكود السابق فى الديبجر ونظرت فى قيمة الريجسترات بعد الخطوة الاوله فستجد ان القيمة انتقلت الى الريجستر eax، اما بعد العملية الثانيه فستجد ان كود الاسكي الخاص بالحروف المكتوبة انتقل الى الريجستر ebx. ولكنها انتقلت بشكل عكسي لان فيمة اول بايت هي قيمة اول حرف، وفى حين ان اول حرف يحتل الجانب الايسر فى النص فان اول بيت يحتل الجانب الايمن فى الريجستر وذلك مايمسى بعنونه الريجسترات.
اما عملية نقل البيانات من ريجستر الى الاخر تتم علي اساس قواعد، فيجب ان يكون الريجستر المصدر والهدف متساويان الطول.
فعلي سبيل المثال MOV ebx,bx  غير قانوني وعن التجميع سوف يصادفك خطأ بهذا الشكل ” error: invalid combination of opcode and operands”
اما على سبيل المثال MOV eax,ecx او MOV cx,dx او MOV dl,ah وماعلى تلك الشاكلة يعتبروا عمليات قانونيه.
عملية نقل البيانات من عنوان فى الذاكرة الى رجستر او العكس يجب ان يكون فيها طول الريجستر 32 بيت. ويجب ان يكون العنوان فى نطاق البرنامج حتي لايقودك ذلك الى خطا.
وذلك البرنامج يعتبر مثال على تلك العمليه

و اثناء عملية الديبج والتحقق من القيم نجد القيم كالصورة التالية
 نجد الريجستر eax يحتوي علي قيم الاسكي الخاصة بالنص. اما الريجستر ebx يحتوي على عنوانهم فى الذاكرة. وذلك النوع من البيانات يسمي بيانات الذاكرة
سنستكمل المقالة القادمة بإذن الله