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

Assembly 32 سؤال

مغلق
بدأه مروان عمر في 31 أغسطس 2005 · 7 رد · 2,470 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

إخوانى الأفاضل .... و جدت فى هذا الموقع www.win32asm.cjb.net شرح للأمثلة الواردة مع masm32 و بالإضافة لموضوع الأخ أحمد غريب - تعلم البرمجة من الأساس .... الآن بداخلى تساؤلات ... هل الغرض من assembly32 إنشاء نوافذ و عمل برامج قد يعمل أفضل منها فى ال VB, السى++ ....!!!! هل الفكرة كلها تحوم حول إستدعاء المكتبات و غيره .... ما هى أسرار اللغة و تطبيقاتها التى لا تضاهى ... هل الأسيمبلى 32 صممت لتقرب من high level فقط !!!!

السؤال الآخر : يبدو لى أنه كى أتقن هذه اللغة أن أدرس جميع المكتبات و الثوابت و الدوال الموجودين داخل هذه المكتبات حتى أستخدمها و أفهم برامجها... هل يوجد مصدر ندرس منه هذه المكتبات .... بارك الله فيكم

#2

السلام عليكم و رحمة الله و بركاته

أخي مروان عمر

الموقع الذي ذكرته هو أحسن ما يمكن أن تجد من أمثلة لتبدء برمجة ويندوز بلغة التجميع

و الفكرة كلها أنك تفهم جيدا كيف يعمل ويندوز و كيف تتعامل معه وتصنع برامج معجزة في صغر الحجم و سرعة التنفيذ

هل الأسيمبلى 32 صممت لتقرب من high level فقط ؟

صممت لأن الكثير يضن أنها لغة قد مر عليها الدهر و إستعمالها مستحيل

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

لذلك ظهرت Win32asm

والله أعلم

d4baa0.gif
#3

اخي الكريم ارى من كلامك بانك متردد في تعلم هذه اللغة وانك لم تفهم حتى الان ما الغاية الاساسية منها اضافة الى

ان هناك تصورات غير صحيحة تجاه هذه اللغة..

بالنسبة لاستفساراتك سوف اقوم بالاجابة عنها بشكل عام وبشكل مجموعة كالاسئلة كي نفهم الغرض من لغة الاسمبلي..

حقائق برمجية / حقائق مهمة

- ما هي لغة التجميع؟

تصمم وحدة المعالجة المركزية CPU لتنفيذ مجموعة صغيرة من التعليمات تدعى بتعليمات لغة الالة

machine lang وكل تعليمة في هذه اللغة تحدد العملية الواجب اجراؤها على بعض المعاملات

operands فمثلا, تتم احدى العمليات النموذجية لجمع معاملين حيث تشفر العمليات كسلسلة من البتات التي

يمكن تفسيرها من قبل ال CPU. تخزن المعاملات بشكل طبيعي في الذاكرة ويحدد العنوان الذي يخزن المعامل عنده ضمن

تعليمة الالة. فمثلا, تمثل السلسلة 0000010100001010 تعليمة نموذجية بلغة الالة, فيها تكون البتات (الخانات)

الاكثر اهمية most significient bits (تكون هي البتات الى اليسار) تمثل شفرة الالة operation

code بينما يمثل العنوان بالبتات الثمانية الاقل اهمية.

على هذا الاساس فان كل التعليمات هي عبارة عن تسلسل من البتات التي يمكن فهمها وتفسيرها بواسطة جملة من

الدارات الموجودة في ال CPU.

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

مختصرات mnemonics لتمثيل شفرات العمليات ومجموعة رموز symboles

لتمثيل عناوين الذاكرة بالاضافة الى المسجلات في ال CPU.

تكتب تعليمة الالة السابقة مثلا بواسطة هذه المختصر التالي:

mov ax, val

وتسمى هذه التعليمة بتعليمة لغة المجمع.

ان كل تعليمة بلغة التجميع هي تمثيل مقابل لتعليمة بلغة الالة بمعنى ان كل تعليمة في لغة التجميع ستترجم الى

تعليمات محددة في لغة الالة وبالتالي فان اي تعليمة تستطيع الوحدة CPU تنفيذها ستكون مكتوبة وفق تعليمة

مقابلة لها بلغة التجميع.

يجب ذكر ان لغة التجميع تعتمد حسب طبيعتها على الالة المستخدمة بمعنى ان برنامج لغة التجميع

المكتوب من اجل حواسيب IBM يمكن تنفيذه فقط على حواسيب متوافقة مع IBM ولا يمكن تنفيذه على حواسيب Apple

يترجم برنامج لغة التجميع الى برنامج لغة الالة بواسطة برنامج اخر يدعى المجمع assembler

وتصمم المجمعات برمجيا لتلائم معظم الحواسيب الشائعة مثل حواسيب IBM والحواسيب المتوافقة معها والتي تزودنا بها

شركات شهيرة مثل Microsoft و Borland.

- ما العلاقة بين لغة التجميع واللغات عالية المستوى؟

ان اللغات عالية المستوى مثل Pascal, C هي لغات مستقلة عن الالة

فالشفرة المصدرية المكتوبة بلغة C مثلا يمكن تنفيذها على اي حاسوب يتوفر فيه مترجم C و[color=purple

]بما ان لغة C مستقلة فان تفاصيل البنية الحاسوبية الخاصة تكون مخفية عن مبرمج لغة C لانها غير مرتبطة بهذه

البنية. لذلك فان برامج C لا تستطيع مباشرة ان تعالج محتويات مسجلات CPU لمعالج محدد.

صممت برامج اللغة عالية المستوى ايضا لتكون مختصرة وقابلة للقراءة فتعليمة c

= a+b تترجم بواسطة مترجم compiler الى عدة تعليمات من لغة الالة. لذلك فان برنامج اي

لغة عالية المستوى هو مجموعة من التعليمات اقل بكثير اذا ما قابلناها ببرامج لغة التجميع.

تعتبر البرامج المكتوبة بلغات عالية المستوى اقل فعالية عند تحويلها الى لغة الالة بالمقارنة مع

البرامج المكتوبة بلغة التجميع لان اللغات عالية المستوى هي لغات مستقلة عن الالة (كما

ذكرت سابقا) ومصممة بالدرجة الاولى لمساعدة المبرمجين على الفهم بدلا من تحسين فعالية الالة. فمثلا [color=

green]البرنامج المكتوب بلغة ++C لاظهار رسالة Hello World! سيحتاج عند تحويله

الى شفرة الالة الى 8000 بايت تقريبا بينما اذا كتب [color=

green]بلغة التجميع فانه سيحتاج الى حوالي 600 بايت تقريبا, على هذا الاساس تعتبر برامج لغة التجميع

اكثر فعالية من برامج اي لغة عالية المستوى بمعنى ان برامج لغة التجميع المكتوبة للعديد من

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

ناتج عن حقيقة ان مبرمج لغة التجميع يجب ان يكون لديه تصور عميق لوحدة المعالجة المركزية التي يريد استخدامها

.

تتميز برامج لغة التجميع بطولها وبالصعوبة الزائدة في اكتشاف الاخطاء وتصحيحها بدلا من

تطويرها كما انه من الصعب ايضا ادخال ميزات جديدة على برامج موجودة بلغة التجميع بمعنى ان هناك صعوبة

واضحة في تطوير برامج لغة التجميع والمحافظة عليها والاحتفاظ بها.

الان بعد ان ازحت بعض الغموض عن هذه اللغة والغيت بعض اشارات الاستفهام التي تظهر عند التساؤل عن ماهيتها

ساجيب عن بعض الاسئلة التي طرحتها..

- هل الغرض من assembly32 إنشاء نوافذ و عمل برامج قد يعمل أفضل منها فى ال VB, السى++ ....!!!!؟

نعم ولا! كما في اية لغة برمجة عالية المستوى كـ C مثلا فان بداياتها كانت تطبيقات 16bit وكانت البرامج المكتوبة

تظهر في نوافذ ما ندعوه بال DOS (النظام الاول الذي تبنته شركة Microsoft لحواسيبها) واستمر هذا الحال الى ان

ظهرت لغة ++C ومن بعدها جاءت ++VC لتضفي اللمسة الفنية على هذه اللغة سامحة باستخدام النوافذ والازرار الخ

الخ.. طبعا هذا كله تم بعد ان انتقل جيل انظمة التشغيل من 16bit الى 32bit.

بالتالي, فان لغة الاسمبلي 16bit هي بدايات لغة الاسمبلي ومن ثم تم تشكيل بيئة عمل 32bit في انظمة التشغيل فكان

من الواجب على هذه اللغة الانتقال للعمل تحت سقف اوسع مما توفر لها حينها.

اما ان يقال بان الغرض من لغة الاسمبلي التي تعمل بتطبيقات 32bit هو انشاء نوافذ فقط مثلا فهذا تصور خاطئ

تماما والسبب اسلفت ذكره.

- هل الأسيمبلى 32 صممت لتقرب من high level فقط !!!؟

الا تعلم بان لغة الاسمبلي هي اول لغة ظهرت بعد لغة الالة؟ وبالتالي فان لغات البرمجة عالية المستوى هي التي صممت

(لتوضيح) و (تسهيل) فهم البرمجة بلغة التجميع وتوسعت في شرح هذه الفكرة اعلاه.

- يبدو لى أنه كى أتقن هذه اللغة أن أدرس جميع المكتبات و الثوابت و الدوال الموجودين داخل هذه المكتبات حتى

أستخدمها و أفهم برامجها.

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

للحاسب وهذا الامر ما ميزها عن بقية اللغات لكن في نفس الوقت جعل نجمها يأفل مع الزمن نظرا لصعوبة البرمجة

الموسعة بها.. بالتالي, اتقان لغة الاسمبلي لا يعني بالضرورة احترافها كما في بقية اللغات لانه مهما تمعنت في الفهم

فانه لا بد ان يظهر لك سؤال في المستقبل عن كيفية عمل.. والذي قد لا تجد له اجابة واضحة بدون السؤال والمراجعة

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

فاود ان انبهك الى امر هام وهو ان جميع لغات البرمجة تشترك في طريقة استخدامها لتوابع المكتبات وتتميز لغة

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

التالي:

push	param1
push	param2
push	param3
call	Function

وتسمح بعض المجمعات باستخدام طريقة اخرى عن طريق الامر Invoke كما في masm32 مثلا:

invoke	Function, param1, param2, param3

بينما في لغات اخرى مثل C تتشعب طريقة استدعاء بعض الوظائف من مكتبات الربط كالوظيفة التالية التي تقوم بقراءة 10 بايتات من ملف معين وتقوم باسنادهم الى textbox:

; code taken from one of JAAS's tutorial
HWND mEdit;

BOOL Rfile(HWND mhWnd)
{
HANDLE hfile = (HANDLE)-1;
DWORD nbt = 0;
TCHAR buf[10];

hfile = CreateFile ("info.txt", GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);

if (hfile == (HANDLE)-1)
{
MessageBox (mhWnd, "ERR: CreateFile", "Error 01", MB_OK);
	return 1;
}

ZeroMemory (buf,10);

ReadFile (hfile, (LPVOID)buf, (DWORD)GetFileSize (hfile,NULL), &nbt, (LPOVERLAPPED)NULL);
SendMessage (mEdit, WM_SETTEXT , 0, (LPARAM)(LPCTSTR)buf);

	return 0;
}

والتي تكون بالشكل التالي في لغة التجميع:

.data
fname	db	"info.txt", 0
errMsg	db	"ERR: CreateFile", 0
errCap	db	"Error 01", 0
buf	equ	10 dup(0)
nbuf	db	0

.code
invoke	CreateFile, addr fname, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL
test	eax, eax
je	err
invoke	ReadFile, eax, addr buf, 00Ah, addr nbuf, NULL
invoke	SendMessage, mEdit, WM_SETTEXT, NULL, addr buf
jmp	done
err:
invoke	MessageBoxA, hWnd, addr errMsg, addr errCap, NULL, MB_OK
done:

اترك لك حرية تحديد اللغة التي تراها اسهل برايك بعد هذا الشرح.

بالنسبة للمصدر الذي تستطيع دراسة وظائف مكاتب الربط منه فافضل واحد هو مكتبة MSDN وان كنت لا تملكها يمكنك اعتماد المختصر (رغم انه قديم قليلا) من هذا الرابط: http://spiff.tripnet.se/~iczelion/files/win32api.zip

تم تعديل هذه المشاركة بواسطة Xacker في 31 أغسطس 2005 في 19:31

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

السلام عليكم

لغة التجميع شيئ وبرمجة الوندوز بإستخدام الapi شيئ اخر تماماً, كما ان مبرمج السى بلس بلس ليس من المفترض ان يعرف دوال الapi كذلك مبرمج الاسمبلى..

الاعتقاد السائد هو ان عمل نافذه بالسى بلس بلس اسهل من عمل نافذه بالاسمبلى ولكن هذا إعتقاد خاطئ, عمل نافذه لا يختلف بإختلاف اللغه لانه يعتمد إعتماد كلى على دوال يتم إستدعائها من خارج البرنامج..

لذلك تحويل برنامج وندوز من لغة مثل السى إلى لغة الاسمبلى مسئله سهله ولا تعدو ان تكون اكثر من مجرد ترجمه فوريه, الاختلاف هو فى كتابة الدوال التى لا علاقة لها بالمكتبات الخارجيه مثل كتابة داله تقوم بعمليات حسابيه او إستخدام الFPU لحساب الكسور الخ...

على فكره تستطيع ان تنشئ نوافذ ببرنامج resource editor وتدمجه معى برنامج اسمبلى تماماً مثل ما يفعل مبرمجى السى بلس بلس والـVB, قوة الاسمبلى تظهر عندما تريد ان تقوم بعمل حسابات معقده او برنامج رسم او لعبة تتطلب جرافيك معقد, فى هذه الحاله تعطيك اللغه إمكانيات لا تستطيع ان تجدها فى لغة اخرى ..

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

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

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

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

#5

أخى Delta Aziz : جزاك الله خيرا على ردك الواضح .

أخى Xacker : الرابط رائع و أسلوبك أروع .... أنا أنهيت كتاب step by step لل assembly 16 و أنا مازلت فى مرحلة التأسيس و غير متردد بالعكس .... ترددى ليس فى دراسة الأسيمبلى نفسه بل فى اختيار نوع الأسيمبلى16 أو 32

ما لفت نظرى هو أن تطبيقات assembly 16 كثير منها يتعلق بالهاردوير و enconding and decoding و التعامل بشكل مباشر مع الcpu و memory

و كان إستفسارى عن assembly32 لماذا أراه متخصص فى برامج الوندوز لكن إجابتك وضحت لى الأمر .... جزاك الله خيرا.

الأخ أحمد غريب: ... أنا عندى خلفية عن السى++ و أيضا بعض لغات الهاردوير نفسه مثل VHDL و قررت أن الأسيمبلى هى ما أريده لما تتيح من تحكم كما ذكرت و ما كتبته عن assembly 32 كان نتيجة إنطباع أولى ليس أكثر

و معذرة لو أسئلتى بدت غبية بعض الشيئ لكن أنا فى نقطة لم أفهمها

هل من يعرف asm16 يمكن أن يستمر فيها بدون الحاجة لمعرفة ال asm32 أم أن أنه سيضطر للإنتقال يوما و بارك الله فيكم

تم تعديل هذه المشاركة بواسطة مروان عمر في 31 أغسطس 2005 في 22:58

#6
مروان عمر كتب:
هل من يعرف asm16 يمكن أن يستمر فيها بدون الحاجة لمعرفة ال asm32 أم أن أنه سيضطر للإنتقال يوما و بارك الله فيكم

العفو اخي الكريم

طبعا, اتقان البرمجة ببيئة 16 بت ليس لها علاقة ببيئة 32 بت لكن الن تضطر للانتقال يوما ما الى برمجة تطبيقات ذات واجهات مرئية ام انك من محبي ال DOS ؟ ;)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#7
اقتباس
اتقان البرمجة ببيئة 16 بت ليس لها علاقة ببيئة 32 بت لكن الن تضطر للانتقال يوما ما الى برمجة تطبيقات ذات واجهات مرئية ام انك من محبي ال DOS

اعذروني يا شباب فانا قفل مصدئ في الاسمبلي

هل افهم من هذا الرد اني استطيع البدء مباشرة من الوندوز دون الرجوع الى الدوز

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#8

نعم اخي romanof يمكنك ذلك فكما ورد في ردود اخرى بيئة 32 بت تعتمد اعتمادا كليا على استخدام وظائف مستوردة من مكاتب الربط الديناميكية مثل GetDlgItemTextA / SendMessage / GetCommandLine الخ..

بالتالي بما ان بيئة 16 بت تعتمد على خدمات البيوس واشعة المقاطعات للتنفيذ فلن يكون هناك تعارض بين فهم اللغتين ابدا. يكفي برايي فهم مبدئي لتركيبة ملف الـ COM لانها مبسطة من الـ EXE وخلاص.

بالتوفيق

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

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

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