لغة Assembly 

من انا؟

يوسف بشاوري, طالب مهتم في مجال الامن السيبراني وخصوصا مجال الهندسة العكسية وتحليل البرمجيات الخبيثة وكل ما يخص الــ Blue Team.



ماهي لغة اسمبلي؟


 لغة اسمبلي هي لغة low-level يمكن للبشر قراءتها وفهمها وأيضا يمكن للمعالج ان يترجم هذه الاسطر البرمجية المكتوبة بلغة اسمبلي الى machine code بحيث يستطيع فهمها وتنفيذها، أيضا لغة اسمبلي تسمح بالوصول المباشر الى الهاردوير وإمكانية التعديل المباشر على الذاكرة العشوائية والـregisters.


 تتنوع لغة اسمبلي وتختلف بحسب معمارية الكومبيوتر (instruction set architecture) , وتنقسم المعمارية الى 4 أنواع رئيسية، وهي:

1- RISC (Reduced Instruction-Set Computer)

DSP (Digital Signal Processor) -2

CISC: Complex Instruction Set Computer -3

VLIW: Very Long Instruction Word -4


الشرح الموجود هو لــــCISC على x64



ماهي أنواع البيانات في لغة اسمبلي؟


Byte : يتكون من 8 بت (البت(bit) هو 0 أو 1) ودائما القيمة موجبة

  • اصغر قيمة هي 0 .᥏ᤆ

  • اكبر قيمة هي 255.

  • الحرف الواحد عبارة عن 1 بايت, مثلا    A’=1 Byte’.


    أيضا يوجد لدينا الـSByte وهو عبارة عن 8 بت لكن قد تكون سالبة او موجبة.

    • صغر قيمة للــSByte هي 128-.

    • اكبر قيمة للـSByte هي 127.


WORD : وهو عبارة عن 16 بت وبالتي تساوي 2 بايت وايضا تكون موجبة.

  • اكبر قيمة للــWORD هي 65535.

  • ايضا يوجد لدينا Signed WORD وتختصر SWORD وتكون 16 بت وايضا تكون سالبة او موجبة .

  • أصغر قيمة سالبة للــSWORD هي 32768- واكبر قيمة هي 32767+



DWORD : وهي اختصار للــDouble WORD وتكون بمساحة 32 بت اي 4 byte, ويتراوح مداها من 0 الى 4,294,967,295



QWORD : وهي اختصار لـQuad WORD وتكون بمساحة 64 بت اي ما يعــادل  Bytes 8 ويتراوح المدى للـunsigned الى 18,446,744,073,703,709,551,615




ماهي الريجسترات (Registers)؟

᥏ᤆهي وحدات تخزينية توجد في الـCPU وتكون مساحتها صغيرة جدا وتخزن bits, وتعتمد مساحتها التخزينية على معمارية المعالج سواء 32bit او 64bit , بحيث انه في 64bit تكون مساحة الريجستر الواحد 64 bits , تمتاز الريجسترات بأنها داخل المعالج, فيسهل الوصول لها بسرعة فائقة على عكس الذاكرة العشوائية RAM. 

انواع الريجسترات:

1- ريجسترات الاستخدام العام (general purpose registers) :

عددها 16 وتستخدم عادة لأغلب الأغراض بحيث تعتمد على حسب المبرمج او المطور, لكن بعض هذه الريجسترات لها استخدامات متعارف عليها.

الريجسترات التي تكون 64 بت , تبدأ بحرف ال”r” مثل RAX والريجسترات التي تكون 32 بت, تبدأ بالحرف “e” مثل EAX. والريجستر RAX و EAX ليست ريجسترين مختلفة , بل هي نفس الريجستر ولكن EAX لها علاقة بالــ lower 32 bits

rax (Accumulator Register) : يستخدم للعمليات الحسابية و تخزين قيمة الــreturn للفنكشن.


rbx(Base Register) : ويسنخدم كمؤشر (pointer) على بيانات معينة.


rcx(Counter Register) : يستخدم في الـloops كــCounter.


rdx(Data Register) : يستعمل في العمليات الحسابية وعمليات الادخال والاخراج (I/O).


 rbp(Base Pointer Register) : يستعمل كمؤشر (pointer) على بداية الستاك (Stack).


rsp(Stack Pointer Register) : ويستخدم كمؤشر لقمة الستاك.


rdi (Destination Index Register) : يستعمل كمؤشر على مواقع في الـData Section في الذاكرة , وايضا يستعمل لحفظ اول argument عند استدعاء دالة.


rsi (Source index register) : يعمل نفس ما يفعله الـrdi لكن على source وليس destination , وايضا يستعمل لحفظ ثاني argument عند استدعاء دالة.


r8,r9,r10,r11,r12,r13,r14,r15 : هذه الريجسترات تستعمل لأغراض عدة, مثل حفظ الـarguments او تستعمل كمؤشر على البيانات او حفظ قيم تستخدم لوقت طويل اثناء الـfunction calls.


هذه الاستعمالات هي استعمالات متعارف عليها ويمكن للمبرمج تغيير وظيفة كل ريجستر حسب الحاجة. فهي في الاخير ريجسترات للاستعمال العام.


يمكن تقسيم الريجستر للوصول الى جزء معين فيه, بدون تغيير الاجزاء الباقية ( تغيير الـ lower 8 bits فقط) ولكن سوف تختلف تسمية الريجستر بهذا الشكل:

Join