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

الأسمبلر 32 - بعض البرامج مع الكود

مغلق
بدأه chik في 11 يونيو 2004 · 41 رد · 5,771 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم,

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

في البداية سأعطي مثالا كنت قد أنجزته في محاولة للتعامل مع الشبكات وهو عن مثال بسيط لبرنامج من نوع Server و CLient فحين يتم الإتصال بينهما يمكن أن نتبادل الحديث في شكل Chat بين البرنامجين. يمكن تجربة هذين البرنامجين عن طريق كمبيوترين في الشبكة - بدون بروكسي - أو على كمبيوتر واحد.

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

كل برنامج يحتوي على ملف الكود بالأسمبلر ب Masm32 ملف ل Resource ملف صنعته بالفيجوال س++ وسجل تحت صنف res . حتى تسهل القضية وملف make.bat إذا أردنا بناء البرنامج من جديد وكذك ملف البرنامج مبني وجاهز للتشغيل.

في انتضار أي تساؤل أو اقتراح أقول لكم إلى اللقاء.

Client_Server.zip

#2

السلام عليكم,

دائما في إطار الشبكات والتي شغلتني منذ وقت أعطي هنا مثالا لبرنامج يكون على شكل ما يعرف ب LookUp . وفي هذا البرنامج يمكن أن نعطي عنوان الكمبيوتر الذي نريده مثل www.google.com والبرنامج سيعطينا رقم IP الخاص به . وكذل يمكن أن نقوم بالعكس مثلا نعطي رقم IP والبرنامج يعطينا اسم الكمبيوتر إذا تواجد هذا الأخير. وهنا يمكن أن نعطي مجالا من الأرقام . فلو نعطي مثلا الرقم 1.2.3.4 على سبيل المثال واخترنا خانة أكثر من رقم وأعطيناها 10 قسيحاول البرنامج على العثور على الأسماء لأرقام الإيبي التي تنتهي من 4 إلى 10 .

البرنامج هو بواجهة عربية حتى نرى أننا يمكننا أن نبرمج بالأسمبلر واجهات عربية.

ودائما أرحب بأي تساؤل أو اقتراح.

إلى اللقاء.

GetHost.zip

#3

السلام عليكم

برنامج ال client server به خلل اخى chik , السيرفر يقول connected والكلينت ينكر.

لا الكلينت يستطيع ان يرسل رساله, ولا السرفر .

كذالك برنامج الهست لايتقيد بالارقام التى اضعها بل يستمر فى البحث الى اجل غير مسمى.

بارك الله فيك على تنشيط المنتدي بعد ان كان فى نوم عميق.

والسلام

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

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

#4

السلام عليكم,

أهلا بالأخ أحمد وشكرا على الإهتمام.

كما قلت مسبقا البرنامج لا يشتغل إذا كنت تحت Proxy وحسب المعطيات التي ذكرت هذا يقع حين تكون في هذه الحالة أي تحت بروكسي. والبرنامج جربته وشغل في الحالات التالية :

- في كمبيوتر في المنزل وليس لدي النت هناك وشغل البرنامجين في آلة واحدة.

- في شبكة محلية

- على النت

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

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

هذا وإذا أمكن يمكن أن نطور هذه البرامج لتكون واسعة المفعول وتكون شاملة أكثر مما هي عليه.

إلى اللقاء.

#5

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

أشكر كل من الأخ أحمد غريب والأخ chik على مساعدتهم لي وادعوا الله أن يوفقهم لنشر العلم والانتفاع به

بعد فتره من التأخير لظروف الامتحانات عندي أعود ومعي تطبيق كنت قد نفذته مسبقا بلغة vc++ ولكن.

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

فالبرنامج نفسه بعد تنفيذه في ال vc++ كان مساحته 2 ميجا بايت واليكم المفاجئه:

بعد تنفيذ البرنامج بالأسمبلي مساحة البرنامج 5.5 كيلو بايت .

البرنامج هو phone dialer يشبه الى حد ما الخاص بالوندوز وهو يعمل على وندوز 98 ( ما قمت باختباره عليه حتى الان)

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

سارفق ملف مضغوط به البرنامج والكود مع ملاحظة أن البرنامج يعتبر المنفذ المتصل به المودم هو COM4 انظر Dialer.Inc المرفق

كل ما عليك هو تغيير قيمة المنفذ الى المنفذ المتصل به المودم الخاص بجهازك بعدها أعد بناء البرنامج مره ثانيه وبإزن الله سوف يعمل

وهذا حل مؤقت لحين اتمام البرنامج وعرضه كامل وينقصني فيه بعض الاشياء والتي سوف أستفسر عنها طبعا ولكن بعد ابداء تعليقكم على البرنامج من حيث الكود

اليكم البرنامج...

أخوكم أحمد من مصر

تم تعديل هذه المشاركة بواسطة chik في 13 يونيو 2004 في 19:12

#6

السلام عليكم

مع الاسف الملف لايحوى شى اخى احمد, ارجو ان تحاول مره اخرى.

مع الاسف مازال الخوف من الاسمبلى يسيطر على المبرمجين ظناُ منهم ان الاسمبلى لغه معقده , اتمنى فعلاً من كل مبرمج ان يحاول بصدق تعلم الاسمبلى ولو لمده شهر, وانا على يقين انه لن يندم على ذالك.

ولكم هى هات هى هات , من عنده الشجاعه لخوض هذه المعركه العلميه.

والسلام

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

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

#8

بمناسبة الموضوع ، إذا كان لدى برنامج client مصمم بلغة برمجه مثل فجوال بيسيك ، هل يمكن صنع server مه بإستخدام الأسمبلى ،، مع المشاركه فى نفس البروتوكول و نفس الدوال ؟؟

#9

نسيت ذكر الأتى أيضا

لابد أن يكون السيرفر الناتج لا يعتمد على أى ملف آخر على الإطلاق .

#10

نسيت ذكر الأتى أيضا

لابد أن يكون السيرفر الناتج لا يعتمد على أى ملف آخر على الإطلاق .

فإذا أمكن ذلك أرجو التفسير فى طريقة صنع ذلك .

#11

السلام عليكم

بالاسمبلى يمكنك عمل اى شئ اخى احمد, سؤالك بالنسبه للسرفر غير واضح, هل تقصد عمل السرفر بالاسمبلى والكلاينت ب vb?

فى هذه الحاله الجواب نعم, لقد قمت بعمل سرفر بالاسمبلى وزملى قام بعمل كلينت بال java والبرنامج يعمل على ما يرام.

وعادتاً برامج الاسمبلى تعتمد فقط على ال DLL الضرورى مثل kernel.dll و user.dll , بعكس vb التى تعتمد على dll و ocx غير موجده فى اغلب الاجهزه.

والسلام

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

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

#12

السلام عليكم

برنامج يقوم بالتحكم فى زر البدايه "Start" فكره قديمه كانت تراودنى فقمت بتطبيقها.

والسلام

Start.zip

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

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

#13

السلام عليكم

انصح الاخ asm4all بستخدام invoke بدال من push push call, ذالك يسهل الكثير ويجعل الكود واضح .

والسلام

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

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

#14

شكرا لك أخى أحمد ، أقوم بالفعل بتصميم برنامج يعتمد نفس المبدأ لكن بالفجوال بيسيك وما يضايقنى كون ال server سوف يعتمد على ملفات أخرى ، لذا سأقوم يتعديله بالكامل إلى أسمبلى أو( سى) حيث أننى لا أريد له واجهه نهائى (بمعنى لن أحتاج إلى windows.inc or windows.h) ، ستكون دوال وفقط ، سأقوم بذلك بإذن الل فى شهر أغسطس أى بعد تسليم المشروع للكليه الذى أعمل عليه الأن

وشكرا لك

#15

السلام عليكم

الاخ احمد عز اليك هذا الرابط والذى فيه درس مشروح عن كيفية عمل clinet و Server.

الدرس مشروح بلغة الاسمبلى و السى بلس بلس, يمكنك المقارنه بين الاثنين لتكتشف ان الاسميلى اسهل.

http://www.madwizard.org/view.php?page=tutorials.contents

والسلام

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

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

#16

السلام عليكم,

أشكر كل الإخوان على مشاركاتهم في هذا الموضوع والتي أتمنى أن تستمر .

لقد حملت اليوم الأمثلة الموضوعة وسأراها من بعد حتى أطلع على محتواها.

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

إلى اللقاء.

#17

السلام عليكم,

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

البرنامج قد يبدو مسليا ويشتغل كالتالي:

يجب وضع ملف DLL في نفس مجلد البرنامج أو في مجلد WinDir\System وحين نشغل البرنامج ننقر على Activate لنشغل الهوك فإذا تم الكل على ما يرام سيشتعل باتن Deactivate الذي يمكننا أن ننقر عليه في كل وقت لننتهي من عملية الهوك. وحين يكون الهوك شغالا ننقر باليمين على أي نافذة مفتوحة ونلاحظ أن برنامجنا سيعطينا هاندل هذه النافدة وكذلك اسم النافذة أو الكتابة الموجودة عليها إذا كان ذلك ممكن. بعد هذا يمكن أن نلعب بالأزرار التي على الشمال ونرسلها إلى هذه النافذة . فيمكن مثلا أن نجعل النافذة إما Enable أو Disable كما يمكن أن نخفي أو نظهر النافذة ويمكننا أيضا أن نوقف كل البروسسوس الذي يتحكم في النافذة. هذا ويمكن أن نزيد في هذه الأزرار لنضيف أشياءا أخرى. وينصح أن لا نفعل هذا على نافذتنا فلنفترض أننا أخفينا أو أطفأنا زر Send فسنكون سجنا أنفسنا لأننا لا يمكن أن نعيد الأشياء إلى ما كانت عليه.

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

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

قد يبدو البرنامج هكذا للتسلية ولكن إذا فكرنا فقد يصلح لعدة أسياء أترك كل واحد يكتشف ما يريد.

إلى اللقاء.

TheHook.zip

#18

السلام عليكم

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

للضرورة أحكام لذا أرجو أن تعذرني أخ chik في هذه الأسئلة:

لقد قمت بتنزيل البرامج التي وضعتها وجربتها وهي تشتغل تمام التمام

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

كما أرجو منك بعض التوضيحات عن المكتبات التي إستعملتها وأنا أقصد

windows.inc user32.inc… وما الفرق بينها وبين *.dll

هذا وأرجو منك أن تدلني عن بعض المواضيع التي يمكن أن تفيدني في

هذا المنتدى فكما أخبرتك أني غبت لفترة وأنا الآن أشعر أنه فاتني الكثير.

ولك جزيل الشكر.

#19

السلام عليكم,

الأخ JFRX : فيما يخص الكمبايلر فأنا أستعمل Masm32 لا تهم كثير النسخة والأخيرة هي 8.2 فإذا كنت ستحمله حمل هذه النسخة الأخيرة وهي في نفس الوقت تحتوي على أمثلة عديدة.

فيما يخص المكتبات التي أضفناها فكل من لديع علم عن البرمجة ب API فهذا لن يكون غريب عنه.والمكتبات كثيرة ونضيف ما سنحتاجه في برنامجنا . فمثلا المكتبة windows.inc هي تحتوي على أساسيات الوندوز فنجد فيها على سبيل المثال كل أنواع المتغيرات الخاصة بالوندوز وأيضا الستراكت وإلى غير ذلك. وهذه غالبا ما نضيفها دائما إلى برنامجنا. والأخريات مثل user.inc تدل على المعلومات التي نريدها في برنامجنا والتي تكون في مكتبة DLL للوندوز فهذه الأخيرة ستدل على مكتبة user.dll وإلى غيرها. فمثلا لو نفترض أن برنامجنا سنضع فيه سطرا ل MessageBox فبما أن هذه الأبي تكون في user32.dll ففي برنامجنا يجب أن نضيف user32.inc ونضيف أيضا المكتبة lib اللازمة لهذا وهي يكون لها نفس الإسم.

وسؤالك الآخر وهو على ما فهمت تريد الفرق بين كل هذا وملفات DLL . الفرق هو أن هذه الأخيرة تكون في نسختها النهائية . يعني نقول على شكل كود فقط وتكون في هذه الحالة جاهزة للإستعمال أو للإستدعاء ويجب أن نكون نعرف كل دالة في واسطتها كيف تشتغل بالتدقيق. أما في حالتها مثل inc أو lib تكون في هذا الشكل موجهة لتطوير البرامج حيث سنستعملها في شكل أسهل من استعمالها مباشرة فالملف inc على سبيل المثال سيمنحنا كل المتغيرات والدالات التي تكون وسط المكتبة.

هذا رد بعجالة وإذا كان فيه أي استفسار إضافي سيكون الإخوان رهن الإشارة إن شاء الله.

إلى اللقاء.

#21

كنت أود أن أسأل عن كيفية قرائة صوره من ملف *.bmp أو *.jpg مثلا وعرضها على الفورم دون تحميلها داخل كود البرنامج نفسه ؟ أي أقرأها من على الهارد بعد فتح البرنامج ؟ وشكرا

#22

السلام عليكم

اخونا الحبيب Asm4all البرنامج اكثر من رائع, الواجهه جميله واجمل شى انك لم تستخدم الوان, مع الاسف كثيرمن المبتدئين يستخدمون الوان يحسسك انو مهرجان مش برنامج كمبيوتر.

ايضاً ال bat file ممتاز لانه يمكن إستخدامه لاى برنامج .

لاحظت انك وضعت علامات إستفهام على بعض من الكود المرفق, على سبيل المثال.

 

  mov	eax,wParam 	 ; ?
  mov	edx,eax    ; ?
  shr	edx,16    ; ?
  and	eax,0FFFFh 	 ; واضح أنها لأخذال 16 بيت الاولى فقط

هذا الجزء هو من اساسيات برمجة الوندوز, لمعرفة ما تحويه wParam عليك بالرجوع الى win API فى هذه الحاله بالنسبة لى WM_COMMAND ستجد الاتى :

WM_COMMAND 
wParam
The high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero. 
The low-order word specifies the identifier of the menu item, control, or accelerator. 

lParam
Handle to the control sending the message if the message is from a control. Otherwise, this parameter is NULL.

كما تلاحظ فى هذا المثال wParam تحتوى على عاملين, العامل الاول موجود فى ال 16 بت الاولى ويحوى على نوع التحكم الذى ارسل الرساله, وال 16 الاخيره تحوى عنوان المرسل.

علامة الإستفهام التاليه كانت فى الكود التالى :

 
    push	hBrush
      call	DeleteObject; ?

وهذا الكود هو لتحرير الذاكره التى لن نحتاج اليها مستقبلاً فى برنامجنا, و فى هذه الحاله كنت قد إستخدمت brush لتلوين الخلفيه , ولم تعد فى حاجه اليها لذالك قمت بعملية delete لها.

ننتظر منك المزيد و إذا كان لديك او لدى اى احد من الاعضاء إستفسارات فنحن فى الخدمة إن شاء الله تعلى.

والسلام

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

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

#23

السلام عليكم

اقتباس
كنت أود أن أسأل عن كيفية قرائة صوره من ملف *.bmp أو *.jpg مثلا وعرضها على الفورم دون تحميلها داخل كود البرنامج نفسه ؟ أي أقرأها من على الهارد بعد فتح البرنامج ؟ وشكرا

منذ فتره كنت قد قدمت لعبه بسيطيه تستخدم *.bmp يمكنك النظر فى الكود لمعرفة كيف يمكنك التحكم فيها, إذا وكان لديك اى اسئله نساعدك إن شاء الله.

/index.ph...opic=39759&st=0

والسلام

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

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

#24

السلام عليكم,

لتحميل صورة مباشرة من القرص يمكن أن نستعمل الدالة LoadImage وهي لديها عدة بارامترات من بينها إذا كانت الصورة على القرص أو في الرسورس أو غير ذلك.

فكرتني في برنامج قمت به من قبل وهو قد نعتبره مثل برامج صور الشاشة ويلعب على الصورة سواءا في الشاشة أو الذاكرة وكيف يمكن أن نلعب بهذه الأشياء.

سأحاول وضعه هنا المرة القادمة إن شاء الله وأتمنى أن تستمر نقاشاتنا وكما أتمنى التوفيق لكل من سيجتاز أو اجتاز امتحاناته.

إلى اللقاء.

#25

السلام عليكم,

سأعطي هنا مثالا يقوم بقسم الشاشة على 2 ثم يقوم بدفع الجنب الأيمن يمينا واليسار يسارا ويبقى السواد في الوسط. وقد استعملت مجموعة من الدوال API ل GDI وهي المكتبة الخاصة بما يتعلق بالرسم. وبعض هذه الدوال هي :

GetDC حين نعطيها البارامتر 0 تعطينا إن صح القول الشاشة كلها وفي الحالات الأخرى تعطينا شاشة النافذة التي نعطيها.

GetDeviceCaps هذه لها عدة وضائف وهي تعطينا عدة تثبيتات وهنا استعملناها لتعطينا مثلا طول وعرض الشاشة حتى نتمكن من قسمها إلى 2.

CreateCompatibleDC هذه ستعطينا مثال شاشة ولكن تكون في الذاكرة . وهذه تستعمل غالبا للوضائف الداخلية. حيث يمكن أن نغير فيها ما نشاء بدون أن يلاحض التغيير وحين ننتهي نعرضها على الشاشة المرئية.

CreateSolidBrush هذه تعطي صباغة مملوءة وهنا اخترت لها الرقم 0 وهو صباغة سوداء وهذا الذي يضهر في الوسط.

BitBlt هذه تمكن من تحويل صورة أو جزء منها من شاشة إلى أخرى وهناك دالة أخرى في نفس الوضيفة ولم أستعملها هنا وهي StretchBlt الفرق بين هذه والأولى هي أن هذه الأخيرة تمكن من تكبير أو تصغير الصورة.

وطريقة البرنامج كالتالي.

في الأول نسجل الشاشة في الشاشة التي في الذاكرة وكمثال نفترض أن طول الشاشة أفقيا 200 بعد هذا نقسم الشاشة إلى 2 وفي كل مرة ننقص 10 من كل جانب .فمثلا في الأول سننقل من 100 إلى 190 يمين الشاشة وننقلها إلى 110 حتى 200 في الذاكرة وفي اليسار ننقل من 10 إلى 100 وننقلها في الذاكرة ابتداءا من 0 وبعد هذا نرجع الذاكرة إلى الشاشة المرئية وإذا قمنا بهذا بالتتالي في كل فترة سيضهر لنا كأن الأشياء تتحرك وكأن الشاشة تنقسم إلى 2 وتسير يمينا وشمالا. وقد نلعب بوقت الدوران حيث أن الدالة SetTimer,hwnd,1,100,0 هي التي تحدد الوقت في البارامتر الثالث فكلما صغرناه تزيد السرعة وكما يمكن أن نلعب في العدد الذي نريد تحويله فقد اخترت هنا 10 على سبيل المثال.

هذا وإذا كان أي تساؤل أو استفسار سنكون إن شاء الله تحت الخدمة.

إلى اللقاء.

Screen_Asm.zip

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

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