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

تحويل كود الى hexadecimal

مغلق
بدأه metbna في 20 أكتوبر 2005 · 20 رد · 4,607 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ارجوا المساعده كيف استطيع تحويل جزء من برنامج كــــ function او سطر من برنامج الى هيكساديسمل

لا اريد تحويل البرنامج كامل فقط جزء حتى استخدمه اذا كان هناك برامج لاتبخلوا علينا فيها

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 20 أكتوبر 2005 في 15:07

مـــــــــــــــــــــــــــــــــــــــــــــــ كـــــــــــــــــــــل احترامي ــــــــــــــــــــــــــــــــــــــع
#2

هذا موضوع كتبه الاخ jaas فيه اداة تقوم بهذا العمل:

/index.php?showtopic=60151

طبعا هو هنا حول كم سطر اسمبلي الى hexadecimal, اذا كنت تريد تحول سطور من السي, فستحتاج اولا الى تحويل هذه السطور الى assembly, معظم الكومبايلرات فيها switch يسمح لك بذلك.

في gcc مثلا, يمكن استخدام -S حسب ما أظن

#3

الأداه لا تتعامل مع الكود طبعا وانما تتعامل مع الملف التنفيذي , فلا يهم اللغه المكتوب بها ولا يهم حتى اذا كان برنامج أو صوره او ملف نصي

يمكنك يا اخي عمل هذه القصه في البرنامج الذي تريد استخراج الداله منه بطريقه بها لفه شويه :D

1 - كود البرنامج الأصلي كما هو , تضيف اليه داله جديده وظيفتها القرائه من عنوان معين في الذاكره والكتابه في ملف بالصيغه التي تريدها ( بيناري أو هيكس أو ديسيمل) الى أن تصل الى التعليمه القيمه 0x0C3وهي ما يقابل التعليمه ret , أي امر العوده من الداله

فمن اين نبدأ ؟

نبدأ من عنوان الداله التي نريد استخراجها

طبعا توجد مشكله , أنه يمكن تضمن الداله نفسها للقيمه 0x0C3 كبيانات مثلا , وهنا فالداله ستنتهي عند هذه النقطه

ولكن يمكنك تلافي هذا باعادة قيمه معينه من دالتك الأصليه وطبعا هذه القيمه ستكون بجوار الأمر ret وبهذا عندما يقابلك الأمر ret (أقصد قيمته طبعا) تقوم باختبار البيانات التي تسبقه فاذا كانت تساوي للقيمه التي حددتها لترجع من الداله فهي فعلا نهاية الداله , والا فهذه خدعه :D وهي عباره عن حرف من البيانات وليست أمر ret

أرجوا أن يكون الكلام واضح :wacko:

#4
اقتباس
الأداه لا تتعامل مع الكود طبعا وانما تتعامل مع الملف التنفيذي , فلا يهم اللغه المكتوب بها ولا يهم حتى اذا كان برنامج أو صوره او ملف نصي

هههه .. زين .. انا أصلا لم اجربها!

طريقتك ايضا فكرة جيدة .. بالنسبة لوجود 0x0c3 كبيانات, هذه اعتقد صعبة ان توجد في الـ code segment الا كـ immediate operand و في هذه الحالة اعتقد انها ستكون جزء من رقم أكبر .. يعني يمكن النظر فقط الى اول بايت او باتين من كل 32 بت او 64 بت (اعتقد حجم الاوامر في intel هو 32 بت؟) مش متأكد.

اعتقد ايضا ادوات الـ command line debuggers ممكن تنفع في هذه الحالة .. اتذكر مرة كنت اتعامل مع gdb و كان فيه طريقة لاظهار الاوامر الحالية بصيغة اسمبلي او بصيغة لغة الآلة. بس ما عندي فكرة ماذا كان الامر المستخدم :P

بس في هذه الحالة يستطيع الشخص ان ينظر بنفسه الى الأوامر, و سيعرف متى ينتهي الكود المطلوب.

#5

طبعا لو استخدم برامج تانيه من أجل تحديد نقط نهاية الداله يكون افضل , ولو استخدم محرر هيكس يبقى ريح دماغه من ده كله , يحدد مكان الداله , وبعدها ينسخ الهيكس وخلصت :lol:

انا قلت أجربها على السريع كده

// test.cpp
#include <stdio.h>
int ahmed() {
 int a, b, c;
 a = 2;
 b = 3;
 c = a + b;
 return c;
}
void main() {
 unsigned char far * ptr = (unsigned char far *) &ahmed;
 printf("\"");
 do {
   printf("\\x%x", (unsigned char far) *(ptr));
 } while ((unsigned char far) *(ptr++) != 0x0C3);
 printf("\"");
}

هنا حيطبعلك الهيكس الخاص بالداله

ahmed()

جربت تغير في الدله يعني تضيف مثلا القيمه 0x0C3 في أي عمليه حسابيه , واختبر الكود حتلاقي الداله وقفت عندها مثل ما قلت , عدل البرنامج بطريقتك واستخدمها لاستخراج أي داله

جرب الأمر

test > ahmed.txt

في سطر الأوامر

مش عارف ليه ديما باحتاج أحرر مشاركاتي :blink:

تم تعديل هذه المشاركة بواسطة Asm4all في 20 أكتوبر 2005 في 19:22

#7
hasan_aljudy كتب:
جميل جدا :)

"\xb8\x2\x0\x0\x0\xb9\x3\x0\x0\x0\x8d\x14\x8\x89\xd0\xc3"

:wacko: :wacko:

مش تقولنا شكل الجديد للداله علشان نعرف وقع فين ونسي اد ايه من الداله ؟

MOV  AX, 0002; B80200
ADD   [BX+SI], AL; 0000
MOV  CX, 0003; B90300
ADD   [BX+SI], AL; 0000
LEA   DX, [SI]; 8D14
OR    [BX+DI+C3D0], Cl ; 0889D0C3

البرنامج ده شكله عامل حادثه :blink:

خرج البرنامج بدون تعديل كان بالشكل ده

"\x55\x8b\xec\x83\xec\x6\xc7\x46\xfe\x2\x0\xc7\x46\xfc\x3\x0\x8b\x46\xfe\x3\x46\xfc\x89\x46\xfa\x8b\x46\xfa\xeb\x0\x8b\xe5\x5d\xc3"

يعني

PUSH  BP
MOV    BP, SP ; لحفظ مكان العوده من الداله
SUB    SP, 0006; int a, b, c;
MOV   WORD PTR [BP - 2], 0002; a = 2;
MOV   WORD PTR [BP - 4], 0003; b = 3;
MOV   AX, [BP - 2]
ADD    AX, [BP - 4]
MOV   WORD PTR [BP - 6], AX; c = a + b;
MOV   AX , [BP - 6]
JMP   $+2; مش مهمه - المفروض تتشال في تقليص الكود
MOV  SP, BP; نستعيد عنوان العوده مره ثانيه وطبعا نترك المتغيرات التي تم حجزها في الداله
POP  BP
RET  ; مربط الفرس

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

#8

هذا باستخدام Digital Mars C++ Compiler

اعتقد اي كومبايلر عنده optimizer ذكي, يستطيع نظريا على الأقل اختصار الدالة الى:

c = 5;

كما ان الديباجة لن تحتاجها اذا لم تكن ستستخدم الـ stack

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 21 أكتوبر 2005 في 04:35

#9

الاخ Asm4all & hasan_aljudy

شكرا لردكم على الموضوع

فكره البرنامج رائعه ولكن لا ادري لماذا لا يشتغل الكود فيه اخطاء استعملت visual c++6 و magic Uinx c

على فكرة نظام التشغيل عندي وندوز وليس لينكس B)

مـــــــــــــــــــــــــــــــــــــــــــــــ كـــــــــــــــــــــل احترامي ــــــــــــــــــــــــــــــــــــــع
#10
hasan_aljudy كتب:
هذا باستخدام  Digital Mars C++ Compiler

اعتقد اي كومبايلر عنده optimizer ذكي, يستطيع نظريا على الأقل اختصار الدالة الى:

c = 5;

كما ان الديباجة لن تحتاجها اذا لم تكن ستستخدم الـ stack

مبدئيا موضوع الـ Optimaization لا أعتقد انه ممكن يوصل لدرجة اختصار متغيرين واختصار عملية حسابيه مره واحده كده

ثم ان أي داله يتم استدعائها طالما تحتوي على متغيرات داخليه تحتاج لهذه الدباجه بغض النظر عن نوع المترجم , لأن هذا اسلوب عمل ثابت تقريبا في كل أنظمة التشغيل أو على الأقل اللي اعرفهم :D

عموما أنا شغلت البرنامج مع Turbo C++ 16 Bit , أجربه ان شاء الله مع الفيجوال سي , احتمال تكون المشكله في التعامل مع الذاكره بشكل مباشر في نظام 32 بيت لأنه محدود لحماية التطبيقات

#11

هههه .. شفت الكود بالـ windbg

enter   0xc,0x0
mov     eax,0x2
mov     ecx,0x3
lea     edx,[eax+ecx]
leave
#12
hasan_aljudy كتب:
هههه .. شفت الكود بالـ windbg

enter   0xc,0x0
mov     eax,0x2
mov     ecx,0x3
lea     edx,[eax+ecx]
leave

فخمتوا الحكايه , انت شغال 32 بيت , ااااااااااه :D

الكود في OllyDbg

MOV  EAX, 2; المتغير الأول 
MOV  ECX, 3; المتغير الثاني
LEA   EDX, DWORD PTR DS:[EAX+ECX]; المتغير الثالث يساوي مجموع المتغير الأول والثاني
MOV  EAX, EDX; لارجاع قيمة المتغير الثالث
RET

فعلا لم يحتاج للدباجه لأنه لم يحجز متغيرات , عوض عنها بالسجلات الخاصه بالمعالج

المترجم ده محترم :D , اسمه ايه يا حسن ؟ :P

#13

اشو الـ cdb (او الـ windbg) بس كتب هذا السطر:

lea     edx,[eax+ecx]

بينما الـ ollydebug تبعك كتبها:

LEA   EDX, DWORD PTR DS:[EAX+ECX]
MOV  EAX, EDX

و هو يبدو لي أقرب للصحيح .. لانه ينقل القيمة الى eax! بينما كود الـ cdb لا يظهر منها كيف انتقل الرقم الى eax!!

زين, الا يمكن اصلا اختصارها أكثر:

lea eax, [eax+ecx]

؟!

عموما, الكومبايلر هو ++Digital Mars C/C و كاتبه هو مؤلف لغة D و هذا الكوبمايلر هو ايضا اول كومبايلر يقوم بترجمة السي بلص بلص الى لغة الالة مباشرة(دون تحويلها الى لغة الـ C) و لكن مشكلته انه (حسب ما اعتقد) لا يتوافق كثيرا من الـ standards او على الأقل يحتوي الكثير من الاشياء الغير قياسية.

http://www.digitalmars.com

أعتقد ان اهم ما يميزه هو السرعة و الـ optimization

#14
hasan_aljudy كتب:
زين, الا يمكن اصلا اختصارها أكثر:

lea eax, [eax+ecx]

؟!

في هذه الحاله يكون الكود الخاص بالسي

a += b;
return a;

يعني ناتج الجمع يتم وضعه في a بدلا من متغير جديد , للعلم المترجم مازال ملتزم بالبرنامج , فهو لم يفهم نية المبرمج بينما يختصر الذهاب والعوده من والى الذاكره باستخدام سجلات المعالج , والبرنامج حدد ثلاث متغيرات وحدد اسلوب العمل , والمترجم عوض عن البرنامج باقل كود ممكن يمثله , فعلا مترجم رائع بمعنى الكلمه :)

hasan_aljudy كتب:
عموما, الكومبايلر هو ++Digital Mars C/C و كاتبه هو مؤلف لغة D و هذا الكوبمايلر هو ايضا اول كومبايلر يقوم بترجمة السي بلص بلص الى لغة الالة مباشرة(دون تحويلها الى لغة الـ C) و لكن مشكلته انه (حسب ما اعتقد) لا يتوافق كثيرا من الـ standards او على الأقل يحتوي الكثير من الاشياء الغير قياسية.

http://www.digitalmars.com

أعتقد ان اهم ما يميزه هو السرعة و الـ optimization

بصراحه كنت منتظر مترجم من الاثنين , ++Digital Mars C/C و gcc , الأول لأنك أشرت اليه أكثر من مره من قبل والثاني لأني منتظر أسمع اسمه في حاجه ملموسه :D

تعرف ايه مشكلتي الوحيده مع هذا النوع من المترجمات !!؟ عدم توافر IDE كامله لتسهيل اخراج الكود , يعني بدل ما أفضل رايح جاي من المحرر لسطر الأوامر ثم الى المحرر عودة الى سطر الأوامر , وكل ده علشان نسيت ; أو ( أو } , عوضا عن موضوع الـ Debug يعني لاخراج برنامج منتهي وسليم محتاج افتح واقفل أكثر من برنامج لأكثر من مره , يعني ضياع وقت انا في غنى عنه

لو عندك IDE كامله ونخلص يبقى عملت فينا معروف :D

#15

اذا كنت تقصد السي او السي بلص بلص, هناك IDE لهذا الكومبايلر لكن اظنه غير مجاني .. كما اني اعتقد انه متواضع نوعا ما!

افضل شي في هذه الحالة ان تستخدم VS للتطوير و التحقق من الاخطاء الخ .. بعدين اخر شي تستخدم dmc لانتاج كود سريع :P

اما اذا كنت تقصد الـ D .. فللأسف لا يوجد شي متكامل ..

هناك ide اسمه akide و آخر اسمه elephant .. و هناك ايضا plugin لـ eclipse و لكن كلهم لا يوفروا غير الية بسيطة لادارة مشروع مكون من عدة ملفات .. و لكن لا يوجد اي دعم للـ debuggin بعد!

#16

سؤال دام الموضوع تشعب حول الـــــoptimization اذا كتبت برنامج بواسطه 6++visual c او #c او c.NET

وحولته الى assembly language وعملت compile بواسطه لغه اسمبلي هل يصغر حجم الكود ويصبح شبيه بـــــmasm32 أو nasm42

مـــــــــــــــــــــــــــــــــــــــــــــــ كـــــــــــــــــــــل احترامي ــــــــــــــــــــــــــــــــــــــع
#17

انا معاك في الفيجوال سي 6 انك تحصل على كود أسمبلي (لم أجرب) , لكن سي شارب أو دوت نيت عموما ؟؟؟؟ لا أعتقد - دول نسيوا الكلام ده من زمان دول أصلا مش بيترجموه للباينري

عموما حتى لو بعد الحصول على كود الأسمبلي من المترجم - فيجوال سي طبعا - فتجميعه بالأسمبلر لا يفرق عن ترجمة الكود بالسي مباشرة باستخدام مترجم السي

والعله في هذا أن المترجم هو من قام بعمل التقليص في الكود و يقوم بالفعل بترجمة هذا الكود الى لغة الآله أي أنه يقوم بمهمة المجمع

لكنه لم يصل الى نفس طريقة التقليص التي يصل اليها مبرمج الأسمبلر لأنه يعرف وقت استخدام متغير ووقت استخدام سجلات المعالج فلا يحتاج الى حجز متغير يمكن الاستعاضه عنه بسجل مباشرة ولا يقوم بنقل بيانات من سجل لآخر طالما لا يحتاج هذا كما انه يختصر كثير في عمليات القفذ من نقطه الى اخرى في البرنامج والتي تستخدمها المترجمات بكثره في جمل الشرط والدوارات و غيره

ولكن يمكن باستخدام مترجم ذكي مثل ما طرحه حسن , مع مبرمج يجيد اختيار الجمل البرمجيه المختصره ويعرف الفرق بينها في الترجمه , يستطيع أن يقترب جدا من كود مكتوب بالأسمبلي

Code for Speed - Coding

لكن لو تعرف طريقه تجيب بيها كود أسمبلي من السي شارب مثلا , يبقى جمعه بالأسمبلر وشوف الفرق وقولنا

#18

ها ها ها ها ها ها ها ها ها :D :D

يا asm4all . طلع الفجول سي اذكى من دجتال مارس!!!

"\xb8\x5\x0\x0\x0\xc3"

تعرف ازاي كتبها؟ مش حتصدق!!

mov         eax,5 
ret

بس طبعا هذا في الـ Release .. لو كمبلتها كـ debug فسيكون الناتج مخيفا جدا :lol:

"\xe9\xd2\x9\x0\x0\xe9\xdd\x5b\x0\x0\xe9\xf8\xe3\x0\x0\xe9\xe1\x18\x1\x0\xe9\x9e
\x53\x0\x0\xe9\x69\x9d\x0\x0\xe9\x74\x77\x0\x0\xe9\x6f\x8b\x0\x0\xe9\x3a\xe2\x0\
x0\xe9\x55\x70\x0\x0\xe9\x80\xb6\x0\x0\xe9\x1b\x8\x1\x0\xe9\x56\xe3\x0\x0\xe9\xf
d\x18\x1\x0\xe9\x9c\xcb\x0\x0\xe9\x27\x5c\x0\x0\xe9\x52\xe4\x0\x0\xe9\x2d\xeb\x0
\x0\xe9\x78\x52\x0\x0\xe9\xcd\x18\x1\x0\xe9\x2e\x19\x1\x0\xe9\x8d\x18\x1\x0\xe9\
xf4\xf\x0\x0\xe9\xc5\x18\x1\x0\xe9\xfa\x8a\x0\x0\xe9\x85\x28\x0\x0\xe9\xa0\x92\x
0\x0\xe9\x3b\xac\x0\x0\xe9\x66\xb\x1\x0\xe9\xd1\x16\x1\x0\xe9\xcc\xe2\x0\x0\xe9\
x17\x57\x0\x0\xe9\x82\x19\x1\x0\xe9\xcd\x17\x1\x0\xe9\xb8\xf0\x0\x0\xe9\xb3\xf6\
x0\x0\xe9\x5e\x29\x0\x0\xe9\xa9\x73\x0\x0\xe9\xa4\x10\x0\x0\xe9\x9f\xec\x0\x0\xe
9\x24\x19\x1\x0\xe9\x35\x3e\x0\x0\xe9\x30\x10\x0\x0\xe9\xab\x8a\x0\x0\xe9\x66\xf
4\x0\x0\xe9\x41\x3e\x0\x0\xe9\x30\x19\x1\x0\xe9\xd1\x18\x1\x0\xe9\xb2\xab\x0\x0\
xe9\xfd\x18\x1\x0\xe9\xa8\xf\x0\x0\xe9\x93\xd4\x0\x0\xe9\xde\xe1\x0\x0\xe9\x59\x
82\x0\x0\xe9\x94\x2b\x0\x0\xe9\x4f\x55\x0\x0\xe9\x4a\x18\x1\x0\xe9\x95\x80\x0\x0
\xe9\xb6\x54\x0\x0\xe9\x49\x54\x0\x0\xe9\xb8\x17\x1\x0\xe9\xf1\xba\x0\x0\xe9\x4c
\x80\x0\x0\xe9\xd7\xa\x0\x0\xe9\xd2\xd5\x0\x0\xe9\xfd\x8f\x0\x0\xe9\x8\xcd\x0\x0
\xe9\x53\x74\x0\x0\xe9\xce\xf0\x0\x0\xe9\xc9\xe7\x0\x0\xe9\x44\xe4\x0\x0\xe9\xbf
\x94\x0\x0\xe9\x7a\x3d\x0\x0\xe9\x6b\x17\x1\x0\xe9\x20\xbb\x0\x0\xe9\x5b\x87\x0\
x0\xe9\x5e\x18\x1\x0\xe9\xe1\x3e\x0\x0\xe9\xdc\x56\x0\x0\xe9\x77\x88\x0\x0\xe9\x
e2\x5e\x0\x0\xe9\xdd\x59\x0\x0\xe9\x78\xd\x1\x0\xe9\x63\xf3\x0\x0\xe9\x2e\xea\x0
\x0\xe9\x29\x10\x1\x0\xe9\x64\x94\x0\x0\xe9\x9f\x25\x0\x0\xe9\xfa\x88\x0\x0\xe9\
x4b\x17\x1\x0\xe9\x0\x7f\x0\x0\xe9\x7b\x52\x0\x0\xe9\x46\x3a\x0\x0\xe9\x81\x95\x
0\x0\xe9\x5c\x9\x0\x0\xe9\xe7\x6b\x0\x0\xe9\x82\x8e\x0\x0\xe9\x1d\x76\x0\x0\xe9\
x84\x17\x1\x0\xe9\x3\x9\x0\x0\xe9\x80\x17\x1\x0\xe9\xd9\x75\x0\x0\xe9\x24\x39\x0
\x0\xe9\xdb\x16\x1\x0\xe9\xca\x16\x1\x0\xe9\x45\x84\x0\x0\xe9\xd8\x16\x1\x0\xe9\
xe1\x17\x1\x0\xe9\x76\xc8\x0\x0\xe9\xdb\x16\x1\x0\xe9\xd8\x17\x1\x0\xe9\x17\xef\
x0\x0\xe9\x80\x17\x1\x0\xe9\x8d\x4f\x0\x0\xe9\x78\xea\x0\x0\xe9\x53\xe2\x0\x0\xe
9\xfe\x72\x0\x0\xe9\x59\xa\x1\x0\xe9\xa4\x65\x0\x0\xe9\xef\x3e\x0\x0\xe9\xb8\x17
\x1\x0\xe9\xc5\x5e\x0\x0\xe9\xcc\x52\x0\x0\xe9\x5b\xd\x1\x0\xe9\x4e\x16\x1\x0\xe
9\x51\x9e\x0\x0\xe9\x4c\x0\x1\x0\xe9\x57\x11\x0\x0\xe9\x62\xb4\x0\x0\xe9\x7\x17\
x1\x0\xe9\x58\xe8\x0\x0\xe9\xc7\x16\x1\x0\xe9\xe\x6b\x0\x0\xe9\xe9\xa8\x0\x0\xe9
\x64\x58\x0\x0\xe9\x8f\x7\x1\x0\xe9\xb4\x16\x1\x0\xe9\xc5\xda\x0\x0\xe9\xe0\x59\
x0\x0\xe9\xf3\x16\x1\x0\xe9\x16\xe\x0\x0\xe9\x11\x72\x0\x0\xe9\x8c\x7e\x0\x0\xe9
\x37\x16\x1\x0\xe9\x98\x16\x1\x0\xe9\xbd\x9\x0\x0\xe9\x2a\x17\x1\x0\xe9\x1c\x53\
x0\x0\xe9\x4e\x13\x1\x0\xe9\x97\x16\x1\x0\xe9\x94\xfc\x0\x0\xe9\x4f\x24\x0\x0\xe
9\xaa\xe6\x0\x0\xe9\xe5\x7c\x0\x0\xe9\xd0\x25\x0\x0\xe9\x9b\xdf\x0\x0\xe9\x56\x7
c\x0\x0\xe9\xbd\x16\x1\x0\xe9\x7c\xe5\x0\x0\xe9\x47\xf5\x0\x0\xe9\xa8\x16\x1\x0\
xe9\xcd\x6c\x0\x0\xe9\xb8\x97\x0\x0\xe9\xc3"

و الاسمبلي هو (تعرف طريقة الـ VC++ في عرض الاسمبلي, صح؟ يحط الكود الأصلي, و تحته ما يقابله من الاسمبلي)

// test.cpp
#include <stdio.h>
int ahmed() {
00411A40  push        ebp  
00411A41  mov         ebp,esp 
00411A43  sub         esp,0E4h 
00411A49  push        ebx  
00411A4A  push        esi  
00411A4B  push        edi  
00411A4C  lea         edi,[ebp-0E4h] 
00411A52  mov         ecx,39h 
00411A57  mov         eax,0CCCCCCCCh 
00411A5C  rep stos    dword ptr [edi] 
int a, b, c;
a = 2;
00411A5E  mov         dword ptr [a],2 
b = 3;
00411A65  mov         dword ptr ,3 
c = a + b;
00411A6C  mov         eax,dword ptr [a] 
00411A6F  add         eax,dword ptr  
00411A72  mov         dword ptr [c],eax 
return c;
00411A75  mov         eax,dword ptr [c] 
}
00411A78  pop         edi  
00411A79  pop         esi  
00411A7A  pop         ebx  
00411A7B  mov         esp,ebp 
00411A7D  pop         ebp  
00411A7E  ret
#19

فعلا طلع كده :wacko:

ده اسمه تهريييج :angry: , هم حاطين واحد في المترجم يشوف البرنامج وظيفته ايه ويبدل فيه حسب راحته ؟

يعني ابه يتجاهل رأي المبرمج في استخدام ثلاث متغيرات في هذه العمليه الحسابيه المعقده , يعني ايه هو الكمبيوتر بيفهم أحسن مني علشان يضعلي 5 من غير ما يحسب 3+2 ؟ :angry:

#20

الoptimization فى السى بلس بلس رهيييب وتعلم الاسمبلى ليس لاجل كتابة برامج كاملة بالاسمبلى ولكن ليتمكن المبرمج من كتابة برامج قرية على مترجمات اخرى مثل السى بلس بلس اوالدلفى.. قد تحتاج فى بعض الاحيان إلى عمل تعديل على كود الاسمبلى الناتج من كمبايلر السى بلس بلس وخاصة إذا كنت تريد ان تستخدم الـFPU يعنى عمليات حسابية بإستخدم الكسور او الاعداد الصحيحة..

فى بعض الاحيان يستطيع الكمبايلر بالقيام بعملية optimization لا تخطر على بال المبرمج العادى, مثلاً مثل التخلص من بعض الebp وتقليص عدد الدوال التى تحفظ فى الstack, بالطبع كل هذا يتوقف على مهارة المبرمج وإمكانياته على اختيار انسب اسليب البرمجة وذلك من خلال فهم ما يحدث خفل الكواليس..

على سبيل المثال لا الحصر. تعريف المتغيرات داخل الدالة يتسبب فى حجز مكان على الstack وإذا قام المبرمج بتعريف متغير من نوع array بحجم كبير داخل الدالة ثم قام بعملية recursion سيتسبب ذلك فى حجز مكان كبير جداً على الstack من ما قد يؤدى إلا stack overflow وتحطم البرنامج, الكمبايلر لن يستطيع فى هذه الحالة بالقيام بعملية optimzation...

مبرمج الاسمبلي لن يستطيع كتابة كود افضل من الكود الذى يحصل عليه من كمبايلر مثل السى بلس بلس إلا إذا كان مبرمج ماهر ولدية خبرة فى كيفية التعامل معى الذاكرة, وافضل طريقة للتعلم هى كتابة الكود فى كمبايلر السى بلس بلس ثم تحويل الشفرة إلى اسمبلى ....

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#21

من ضمن نوادر الoptimization في الvc compiler أنك لو قمت بعمل كود مشابه لهذا

for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
for(int k=0; k<10; k++)
cout<<"ay 7aga"<<endl;

و هو كود لا يقوم باي شئ مهم حقيقة و لكن ستندهش ان تجد الcompiler قد دمج الثلاث loops في loop واحدة من 1 الى 1000 مقلوبة اي كأنه يقول لك

for(int i=1000; i>0; i--)
cout<<"ay 7aga"<<endl;

Sr. Software Development Engineer
Hulu, LLC
My Blogs

هذا الموضوع مغلق.

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