الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال يتعلق بالـ OpCodes

بدأه C++er في 5 مايو 2011 · 2 رد · 1,332 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

داخل الملف التنفيذى بعد محتويات IMAGE_DOS_HEADER يقع DOS STUB، يقوم الـ Linker الخاص بميكروسوفت بإضافة الـ Stub التاليه :

0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68
69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F
74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20
6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00

الـ OpCodes السابقه تماثل الكود التالي:

PUSH CS
PUSH DS
MOV  DX, OFFSET msg

MOV  AH, 9h
INT  21h

MOV  AX, 4C01h
INT  21h

msg db 'This program cannot be run in DOS mode.', 0Dh, 0Dh, 0Ah, '$'

للعلم فإن الـ Stub السابقه مساحتها 64 بايت تماما و تبدأ مباشرة بعد IMAGE_DOS_HEADER عند الموقع 40h.

الذى شد انتباهي جزء من الـ OpCodes السابق و هو :

00 B4 09

القيمه B4 09 تقابل التعليمه MOV r8, imm8 و الـ OpCode هي B0+ rb و المسجل AH قيمته 4 لذا تنتج التعليمه B4 09 و تعني MOV AH, 9

السؤال هو: لماذا تم إضافة صفر قبل هذه الـ OpCode؟ و ماذا سيكون تأثيره؟؟

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 5 مايو 2011 في 01:06

مدونتي: C++ Tips and Tricks

#2

يبدو أن كل ما كنت احتاجه هو بضع ساعات من النوم، حيث اني عرفت الحل،

الصفر لا ينتمي لـ B4 09 و لكن ينتمي للـ OpCode التى قبلها و هي BA 0E 00 حيث التعليمه هي MOV r16, imm16 و حيث أن موقع النص يبعد 0E من بداية قسم الكود و لابد من كتابة الرقم على هيئة WORD لذا يصبح 000E و عند حفظها بالملف تصبح 0E 00.

و الله ولي التوفيق

1

مدونتي: C++ Tips and Tricks

#3

النوم >>>>عنصر مهم اثناء البرمجة

Gongratlations

GoodBye

مواضيع مشابهة