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

هل من مهتم بالأسمبلر 32 بايت

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

لقد سبق وقمت بعدة محاولات لإيجاد من يهتم ببرمجة الوندوز بالأسمبلر .

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

إلى اللقاء.

#2

السلام عليكم

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

#3

بسم الله الرحمن الرحيم

السلام على من اتبع الهدى ، وبعد :

يسرني أن أكون تلميذاً في مدرستكم فهلا بدأنا

وشكراً

#4

السلام عليكم

مرحبا اخوي chik ..

انا معك من الأن .. وانتظر منك الدروس ..

لكن انا جديد على هذي اللغة .. والأن بدأت ادرسها على الدوس

لكن عندي خلفية عن لغة سي + + جيده ..

ابوسعود ..

#5

السلام عليكم

وبعد:

الاخ الفاضل chik لا ارى اى فائده من تعلم 16 بت اسمبلى, فاغلبية ال instructions و ال interrupts لا تعمل على اى من ال 32 بت operating systems, لذالك احبذ التركيز على ال console لتعلم البرامج البسيطه المشابهه لل DOS و من ثم تعلم ال API لبرمجة Windows .

ارجو ايضاً من جميع الزوار التفاعل مع الدروس و المواضيع التى تطرح, حتي لا نشعر اننا نخاطب انفسنا.

هذا والسلام

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

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

#6

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

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

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

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

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

ويمكن الإخوان الإطلالة على الموضوع القديم الذي كنت طرحته في هذا المنتدى في الرابط التالي : /index.php?showtopic=33253

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

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

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

إلى اللقاء.

#7

السلام عليكم

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

ولكن يمكن القول انه يوما ما سوف تتلاشى هذه البرمجة وتحل مكانها الاسمبلي 32 بت هذا في حالة اذا انخفضت اسعار المعالجات بحيث تسمح باستبدال المعالجات 8085 و 8088 و8086 . وعائلات MICROCONTROLER

#8

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

أولا أريد أن أشكر الأخ AFEEF على اهتمامه وأتمنى أن نرى دروسه قريبا .

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

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

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

#9

السلام عليكم

الحاله الوحيده التي نحتاج فيها لل 16 بت اسمبلى هى كتابة ال boot sector اما الباقى فيمكن كتابته على ال 32 بت اسمبلى, وكما ذكرت اخى chik فدرس ال 16 بت مازال موجود لمن اراده.

ثانياً ال 64 بت بروسسور فى الطريق وهى لا تدعم ال 32 بت فضلاً عن دعمها لل 16 بت, فدعم ال 32 بت سيكون على مستوى ال operating system.

اما بالنسبه للمعاجاة القديمه امثال 8086 او 8085 فاعتقد امها اصبحت نادره, ك bulit in Processor و غير موجده ك اجهزة كمبيوتر, حتى ان ال 386 و 486 تكاد مكون معدومه.

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

اما بالنسبه للدرس فاقترح ان نستخدم بعض المكتبات الجاهزه امثال ctrdll.dl و wsprint و كذالك RasASM ك IDE اساسى, حتى تكون البدايه سهله و خاصة للذين لديهم خبره فى برمجة ال سى او ال سى بلس بلس.

والسلام

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

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

#10

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

كما ذكرت سابقا أن ل 16 بت أهميته الخاصة رغم قدمه . فكمثال آخر حين نبرمج VXD - ولا سيما الخاصة بأنضمة 95-98 - فرغم أننا نبرمج في 32 بت ولكن الطريقة المتبعة هي نفسها في 16 بت ولا سيما حين نريد أن نقوم ببرمجة Interruptions الخاصة ب 16بت.

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

وأريد أن أقول للأخ أحمد أنني لا أفضل استعمال Radasm في البداية - وهذا لا يعني أنني أقول أنه ليس جيدا فهو برنامج ممتاز ويسهل كثيرا الأمور - ولكن كما في جميع الحالات فالأمور السهلة قد تخفي أو تحجب عنا بعض الأمور التي قد نقوم بها بدون فهمها. فحين تتضح الرِِؤيا ونفهم ما نقوم به فلا مانع من أن نستعمل Radasm أو غيره حتى نربح الوقت وأضن أن البداية تكون في التعلم أكثر من ربح الوقت أو تسهيل الأمور. هذا مجرد رأي وإذا أراد الإخوان استعماله فلا أرى مانعا على ذلك. ورأيي هذا ناتج عن تجربة في س++ .فمثلا الفجوال س++ يعطي واجهة وأدوات تسهل البرمجة وكثير ممن يستعملون هذه الأدوات تنقصهم بعض المفاهيم الأساسية.

إلى اللقاء.

#11

السلام عليكم

انا لا اقصد إستخدام ال RadASM ك Visual Tool و إنما ك Editor . ارفق صوره توضح ذالك.

post-79-1082998327_thumb.gif

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

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

#12

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

حياك الله أخي أحمد .

لا أرى مانعا أن نستعمل Radasm وأقول أن كل واحد يستعمل Editor الذي يريده ويجيد التعامل معه .

إلى اللقاء.

#13

السلام على الجميع,

سنبدأ بإدن الله هدا الدرس بإعطاء لمحة كيف نكتب الكود ل Masm32 وكيف نستعمل هدا الأخير. لتجنب بعض الأخطاء التي قد تنتج عن عدم وجود ملفات Masm32 سأعطي في كل مرة المسار الكامل له وأفترض هنا أننا ثبتناه في C:\Masm32 ويجب تغيير هدا المسار إدا تم التثبيت في مسار آخر وفي جميع الأسطر التي توجد فيها الإشارة لدلك.

لكي نكتب الكود ل Masm32 يمكن أن نستعمل أي Editor نريده ونسجل الملف في شكل .asm ويوجد عدة برامج Editor تخص الأسمبلر بشكل عام وكدلك برامج أخرى ومن بينها Qeditor وهو يأتي مع Masm32 ويمكن العثور عليه في المسار C:\Masm32 .هناك أيضا RadAsm وهدا يمتاز أيضا بواجهة في شكل VisualStudio لتسهيل البرمجة وإعطاء قالب جاهز للبرمجة وهناك أيضا VisualAssembler واللائحة طويلة . يمكن لأي أحد أن يستعمل Editor الدي يألفه ويريده فكل ما يهمنا في هده البداية هي كتابة الكود وفيما يخصني سأستعمل Notepad الدي يأتي مع الوندوز أو Qeditor الدي يأتي مع Masm32 حتى لا نبحث عن أشياء أخرى للدين لا يريدون البحث مرة أخرى .

في غالب الأحيان أو على الأقل في البداية , فكتابة البرامج سنقسمها إلى 3 أجزاء:

الجزء الأول : سنكتب هنا كل المعلومات التي تخص Masm32 وكدلك سنعلن هنا عن مختلف المكتبات التي سنستعملها في برنامجنا.

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

الجزء الثالث : هدا سيحتوي على الكود الدي سوف نكتبه .

وحين ننهي من كتابة الكود نسجله على شكل .asm وفي مثالنا سيكون First.asm .الآن عندنا الكود فيجب إذن بناء البرنامج ليصبح عندنا ملف جاهز للتشغيل. إذا ألقينا نظرة في مجلد Masm32 فنرى أنه يحتوي على جميع الأدوات اللازمة لهذا الغرض . في الأول سنستعمل ml.exe و link.exe سنستعمل الأول ل Assembling والثاني للبناء أو Linking . هذان البرنامجان يمكن أن نستدعيهما مع إعطائهما عدة بارامترات ويمكن التعرف على مختلف هذه البارامترات بكتابة ما يلي في نافذة دوس :

C:\masm32\bin\ml / ?

ونفس الشيء بالنسبة ل link ولتوقيف النافذة بعد إبراز صفحة يمكن أن نزيد |more حتى نتمكن من إبراز المعطيات صفحة بصفحة.

في الأول سنستعمل هدان البرنامجان في حالتهما السهلة لبناء البرنامج وسنرى من بعد كيف نبني ملفات Resource وكيف نبني برامج من نوع Dll أو VXD أو غيرها.

إذا افترضنا أن ملف الكود هو First.asm فلتجميع البرنامج نكتب ما يلي :

C:\MASM32\BIN\Ml.exe /c /coff First.asm

كما ذكرت سابقا لقد أعطيت هنا المسار الكامل ل MASM32 ويمكنك تغيير هدا المسار حسب ما عندكم أو وضعه داخل خانة Path وهنا سنستعهمل البارامترات /c /coff الأول /c ويعني أننا نريد من ml.exe أن يقوم بعملية Assembling بدون Linking والثاني أنه سيعطينا ملف Object تحت هيءة أو Format من نوع coff إذا كنا لا نعرف ما يتعلق بما يسمى PE Header لا يهمنا هذا الأمر ونأخذه كما هو.

إذا سارت الأمور كما ينبغي ولم تكن هناك أخطاء فسنحصل على ملف First.obj الدي سيستعمله Link لبناء البرنامج وهنا نقوم بما يلي :

C:\MASM32\BIN\Link.exe /SUBSYSTEM:CONSOLE First.obj

هنا سنستعمل البرارامتر /SUBSYSTEM:CONSOLE الذي يعني أننا نريد برنامج من نوع كونسول وهذا سيكون مثالنا الأول هذا ويمكن ان نستعمل أيضا SUBSYSTEM:WINDOWS لبناء برامج خاصة بالوندوز كما سنرى لاحقا.

مرة أخرى إذا تم كل شيء على ما يرام سيكون عندنا ملف First.exe جاهز للتشغيل.

في غالب الأحيان نصنع ملف من نوع .bat نضع فيه كل المعطيات حتى تسهل عملية بناء البرامج. وفي الملف المرفق تجدون هذا الملف تحت اسم make.bat وسأعطي هنا محتواه وسنستعمله لاحقا في بناء برامجنا :

if exist First.obj del First.obj إذا كان الملف المذكور موجود نحذفه

if exist First.exe del First.exe نفس الشيء كما سبق

C:\MASM32\BIN\Ml.exe /c /coff First.asm نجمع البرنامج ب ml

if errorlevel 1 goto errasm إذا كان هناك خطء نذب للخط الذي يبرز لنا كتابة الخطء

C:\MASM32\BIN\Link.exe /SUBSYSTEM:CONSOLE First.obj استعمال Link

if errorlevel 1 goto errlink ظهور الخطء إذا كان أي خطئ

echo *********************************************** ظهور كل شيء تمام

echo ***********************************************

echo PROGRAM CREATED SUCCESSFULY

echo ***********************************************

echo ***********************************************

goto Fin

:errasm سطر خطء في الأسمبلر

echo ##############################################

echo Error with Assembler

echo ##############################################

goto Fin

:errlink سطر خطء في اللنك

echo ##############################################

echo Error with Linker

echo ##############################################

:Fin النهاية

يمكن أن نستعمل هذا الملف لبناية برامجنا من نوع كونسول وفي كل مرة نغير فقط اسم الملف باستعمال مثلا ميزة Find-Replace ويمكن أيضا أن نغير Console ب Windows في الحالات الأخرى.

سنبدا الآن بحول الله بكتابة أول برنامج من نوع كونسول يظهر لنا الرسالة Hello Word ويبقى البرنامج ينتظر منا إدخال جملة أو سطر ويطبع من جديد ما قمنا بإدخاله ليغادر بعد ذلك.

سأكتب كل جزء كما ذكرت من قبل ونناقشه :

.386	; 1
.model flat, stdcall;2
option casemap:none;3
include C:\masm32\include\kernel32.inc;4
include C:\masm32\include\masm32.inc;5

includelib C:\masm32\lib\kernel32.lib;6
includelib C:\masm32\lib\masm32.lib	;7

1- نعلن هنا عن نوع الكود الخاص بالبروسسور الذي نريده .يمكن استعمال 386 ليكون عندنا كود شغال للجميع فلو مثلا أعطينا 486 ففي بعض الحالات وحسب الكود يمكن للأسمبلر أن يعطينا الكود الذي سيعمل في 486 وما فوق ولكن لن يشتغل في 386 .

2- هنا يمكن أن نعلن عن بعض المعطيات مثل الذاكرة flat ونوع استدعاء والرجوع من الدوال وغيرها. ويمكن مشاهدة مختلف المعطيات في الملف Masm32.hlp .

3- كيف سنتعامل مع Characters

4- 5- نعلن عن المكتبات التي سنستعملها في برنامجنا .هنا استعملنا اثنين وسنرى من بعد لمذا هذا الإختيار.

6-7- نعلن عن المكتبات Bin اللازمة

هذا كل ما سنحتاجه في هذا الجزء الأول من برنامجنا.وفيما يخص الجزء الثاني الخاص بالمعطيات فهم كما يلي :

.data	;1
buff  db 200 DUP(0);2
hello  db    "Hello Word From CHIK; Enter your message",10,13,0;3
mess  db    "You entered : ",0;4

1- نعلن عن الجزء الخاص بالمعطيات وهو سينتهي بمجرد ما يبدأ جزء آخر

2- نحجز جزء من الذاكرة نسميها buff وهي عبارة عن 200 بايت وكل بايت نضع فيه قيمة 0

3- نحجز ذاكرة أخرى نسميها hello وسنضع فيها الرسالة التي نريد إبرازها وهي متبوعة ب 10 و 13 وهي الخاصة ب return و Line Feed وكما تلاحظون كل كتابة تنتهي ب 0

4- نفس الشيء كما سبق

وهنا db تعني define byte أو حجز ذاكرة من نوع بايت ويمكن أن نحجز العدد الذي نريد. وهناك أيضا dw أو Define Word لحجز ذاكرة من نوع وورد أو dd لحجز Double Word أو dq وغيرها.

بالنسبة لجزء الكود سنكتبه كما يلي :

.code;1
start:;2
    invoke StdOut,addr hello	;3
    invoke StdIn,addr buff,100;4
    invoke StdOut,addr mess	;5
    invoke StdOut,addr buff	;6
      invoke ExitProcess,0	;7
end start	;8

1- نعلن عن الجزء الخاص بالكود وهو في نفس الوقت نهاية الجزء السابق.

2- Label أو شعار سنستعمله كنقطة لبداية برنامجنا ويمكن أن نستعمل أي كلمة بشرط أن تكون نفسها في النهاية

3- نستدعي الدالة StdOut والتي تتكلف بكتابة الجملة التي نعطيها إياها. وهذه الدالة معلنة في الملف Masm32.inc ولهذا الغرض قمنا باستدعاء هذا الملف في الجزء الأول

4- نستدعي الدالة StdIn وهي تقوم بالعكس أي قراءة ما سندخله لتضعه في المكان الذي نعطيها وبالطبع بتحديد طول ما نريد

5- 6- نفس اشيء كما سبق

6- نستدعي الدالة ExitProcess لننهي برنامجنا وهذه API موجودة في Kernel32.dll ولهذا قمنا باستدعاء الملف المناسب لها في الجزء الأول

7- نعلن عن نهاية البرنامج.

وفي شكل عام حين نريد استدعاء دالة نستعمل الماكرو invoke . إذا افترضنا أنه عندنا دالة تستقبل 3 بارمترات مثل :

RetValue ApiFunc(param1,param2,param3)

ففي الأسمبلر سنستدعيها كما يلي :

Invoke ApiFunc,param1,param2,param3

Mov RetValue,eax

ولنعلم أن البارامتر الذي نتلقاه بعد استعمال الدالة يتواجد دائما في الرجستر eax .وفي الحقيقة فإن الماكرو invoke هي تقوم كما يلي :

Push param3

Push param2

Push param1

Call ApiFunc

Mov RetValue,eax

في الملف المرفق ستجدون كل الملفات اللازمة لهذا البرنامج :First.asm First.exe make.bat

في البرنامج القادم سنرى كيف يمكن كتابة نفس البرنامج ولكن هذه المرة بدون استدعاء الدوال StdOut أو StdIn وسنستعمل فقط الدوال API الموجودة في Kernel32 .والذين يعرفون هذا باستعمال س أو س++ يمكنهم البدء في البرمجة لأنه كما تلاحظون تشابه كبير بين هذين النوعين .

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

نتمنى لنا المزيد من العلم والمعرفة وإلى اللقاء.

First.zip

#14

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

اولا اود ان اشكرك على هذا الدرس الجميل. ثم لي مداخلة بالنسبة لثلاثة امور

الامر الاول هو: الرجاء ان تشرح option casemap:none اكثر لانك لم تشرحها بصورة واضحة

الامر الثاني هو :ما هي عدد البارامترات التي يمكن ان تأخذها الدالة stdout واذا كان الجواب اكثر من واحد فكيف نفصل بين البارامترات

الامر الثالث: كيف يمكن لمستخدم جديد ان يعرف ما هي الدوال التي يمكنه ان يستخدمها واين هذه الدوال موجودة وصيغة كتابتها واستخدامها

وشكرا لك

#15

السلام عليكم

بارك الله فيك اخونا chik على هذى الدرس الشيق.

الاخ عفيف : option casemap:none توقف عملية ال casemaping بمعنى انها تطلب من الكمبيلر التفريق بين الحروف الصغيره و الكبيره, مثال على ذالك VAR لاتسوى var. اي انك إذا لم تضع هذا السطر يصبح لافرق بين VAR و var.

عدد ال Parameter بالنسبه ل Stdout فهو pointer واحد, اما بالنسبة لل stdio فهو 2 Parametr الاول هو عباره عن pointer لمكان التخزين, اما الثانى فهو لحجم ال buffer.

تستطيع الإطلاع على الملف masm32.inc لمشاهدة عدد ال Parameter لكل function.

اما بالنسبه للدوال فهى فى الغالب من نوع DWORD وهى عباره عن عنوان للمكان الذى يوجد فيه ال DATA.

والسلام

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

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

#16

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

أشكر كل من ساهم ويساهم في إثراء هذا المنتدى.

الأخ afeef سأحاول الرد على أسئلتك وإذا كان هناك توضيحات أخرى أتمنى أن تكون لدي الإستطاعة للرد .

1- فيما يخص casemap فعلا لم أعطيها الشرح الكامل وأعتذر لأن حسب رأيي لا أهتم بها كثيرا وأضع دائما وفي جميع برامجي none وفي هذه الحالة تبقى التعريفات التي أكتبها وسط البرنامج كما كنبتها بالمحافضة على UpperCase أو LowerCASE وحين نستعمل NONE فهو كما أننا نستعمل البرامتر Cp / في البرنامج ml الذي يمكن أن تنظر إلى هذه البارامترات باستعمال ml /? .وقد نستعمل القيم all أو NOTPUBLIC دائما في casemap .ففي الحالة الأولى جميع ستتحول إلى UpperCase وفي الحالة الأخرى نحافظ على ما قمنا به ولكن هذه المرة في البرامج الخارجية إن صح هذا التعبير.

2- الدالة StdOut تأخذ بارامتر واحد وهو عنوان الكتابة أو الرسالة التي نريد أن نكتبها على الشاشة.وسنرى في المثال اللاحق كيف نبرمج هذا بدون هذه الدوال أو إن صح القول كيف يمكن أن نبرمج هذه المكتبة أو كيف تشتغل.

3- في هذا الأمر لا أدري كيف أجاوبك. فهذه الأمور على ما أضن تأتي بالتجربة.ولكن نعرف أن برمجة الوندوز تبرمج بواسطة الدوال API ولهذا يمكن أن نعثر كتابا يتكلم على هذه الدوال وهي كثيرة ولا يمكن التعرف أو تذكرها كاملة ولذا يستحب أن يكون عندنا مرجعا إليها وكما يستحب أن تكون عندنا MSDN فهي تحتوي على جميع API وكيفية استدعاؤها وما ترجع لنا.وإن كانت هذه تعطي طريقة برمجية في اتجاه س++ لكن ترجمتها إلى الأسمبل شيء سهل جدا كما ذكرت سابقا. وكذلك إذا كنا نعرف برمجة الوندوز ب API بأية لغة أخرى فهذا أيضا يسهل معرفة هذه الدوال.وأنا شخصيا أستعمل MSDN .

أتمنى أني قد توفقت في الإجابة عن أسئلتك وإلى اللقاء إذا كان فيه تساؤلات أو آراء أخرى

#17

ممتاز جدا ,, سأتابع معكم انا أيضا قدر المستطاع ,,

وبالمناسبة تم أخيرا اصلاح مشكلة الصور ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#18

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

أشكر الأخ HGB على الإهتمام وعلى معلوماته .

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

إلى اللقاء.

#19

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

الى الاخوة الكرام تحية طيبة وبعد:

ان الامور تسير بشكل سليم ولكن حتى الان لم اشاهد اوامر لغة التجميع (لغة اسمبلي)

فلماذا تسمى هذه اللغة بلغة masm32 .

من الافضل تسميتها لغة ال 32 بت

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

وشكرا

#20

السلام عليكم

الاخ عفيف, الصبر جميل ما قام به الاخ chik هو برمجة اسمبلى بطريقه مبسطه, فى واقع الامر .

invoke StdOut,addr hello;3

ماهى الى macro يقوم الكمبيلر بترجمتها الى:

mov eax,offset hello
push eax
call StdOut

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

ارجو ان اكون قد وضحت شئ من الغموض.

والسلام

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

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

#21

السلام عليكم

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

وشكرا

#22

السلام عليكم

رد مختصر : لا الحجم هو نفسه, والكود ايضاً, لا فرق على الإطلاق.

قم بعملية Disassembly وستري النتيجه.

والسلام

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

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

#23

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

كما قال الأخ أحمد فإن الأمر invoke ليست إلا ماكرو تقوم بما ذكره الأخ.

وهذه هي ميزة Masm32 أنه يعتمد في الكثير على ماكرو وهي تسهل البرمجة كثيرا للمبتدئين ولا سيما للمتخوفين من البرمجة بالأسمبلر. وإذا كنا نريد البرمجة بأوامر الأسمبلر القحة فهذا غير ممنوع وكما سنرى ذلك إن شاء الله في أمثلتنا السابقة وعلى سبيل المثال يمكن مثلا أن نستعمل if . وهي تستعمل كما نستعملها في لغات أخرى مثل الباسيك أو س وإذا كنا لا نرغب أن نستعمل هذه التسهيلات فيمكن أن نبرمجها باستعمال cmp jz ... أو غيرها فحين نبني البرنامج فإن الكمبايلر سيحول التعليمة الجديدة أو الماكرو if . إلى تعليمات أسمبلر مثل ما ذكر .ولنعلم أن هناك العديد مثل هذه الحالات .وأنا أتفهم تساؤل الأخ afeef لأنه كان لدي نفس التساؤل في الأول .ففي بداية الأمر نحس أننا لا نبرمج بالأسمبلر ونعود إلى الأشياء التي ألفناها ولكن بعد مرور الوقت نلاحظ أيضا أن هذه المسائل الجديدة توفر لنا بعض السهولة في البرمجة كما تسهل قراءة الكود الذي نكتبه وأيضا تمكننا من ربح الوقت.

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

أتمنى التوفيق للجميع وإلى اللقاء.

#24

تمرين :

كما قلت مسبقا يمكن أن نبرمج ما برمجناه في السابق بدون استعمال الدوال StdOut أو StdIn . نعلم أن كل أجهزة الكمبيوتر مثل الشاشة والكايبورد تعتبر مثل مجرد ملفات لها هندلاتها الخاصة بها - Handle - فإذا عرفنا الهانل لأي جهاز يمكن أن نستعمل هذا الأخير لنقرأ أو نكتب حسب الجهاز باستعمال الدوال API ٌ التالية : ReadFile أو WriteFile وهذه تبرمج كما يلي حسب ما جيء في MSDN :

BOOL WriteFile(
  HANDLE hFile,                    // handle to file to write to
  LPCVOID lpBuffer,                // pointer to data to write to file
  DWORD nNumberOfBytesToWrite,     // number of bytes to write
  LPDWORD lpNumberOfBytesWritten,  // pointer to number of bytes written
  LPOVERLAPPED lpOverlapped        // pointer to structure for overlapped I/O
);

BOOL ReadFile(
  HANDLE hFile,                // handle of file to read
  LPVOID lpBuffer,             // pointer to buffer that receives data
  DWORD nNumberOfBytesToRead,  // number of bytes to read
  LPDWORD lpNumberOfBytesRead, // pointer to number of bytes read
  LPOVERLAPPED lpOverlapped    // pointer to structure for data
);

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

HANDLE GetStdHandle(
  DWORD nStdHandle   // input, output, or error device
);

وهنا nStdHandle مجرد رقم يميز إن كنا نريد هانل للكتابة STD_OUTPUT_HANDLE = -11 أو هاندل للقراءة STD_INPUT_HANDLE=-10 . والبارامتر الأخير في الدالتين الأوليتين Loverlapped لن نأخذه بعين الإعتبار في مثالنا هذا ونعطيه قيمة صفر .

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

كل الدوال المذكورة موجودة في Kernel32.dll فيمكن إذن استعمال الملفات Kernel32.inc و Kernel32.lib حتى نتمكن من استعمالهما.

سأعطي هنا الكود لهذا ب س++ حتى ربما تسهل الكتابة بالأسملر.

#include <windows.h>

char* txt="Hello Word From CHIK ";
	DWORD dd; 

void main()
{

	HANDLE hand=GetStdHandle(STD_OUTPUT_HANDLE);
	WriteFile(hand,txt,21,&dd,NULL);

}

ولنا لقاء إن شاء الله لمناقشة الآراء والردود.

إلى اللقاء.

#25

السلام عليكم

حتى نسهل السئله على الحبه :

عادة ال function إما له return value او ليس له return value , ال return value يكون دائماً من نوع DWORD و تجده فى register EAX.

مثال على ذالك :

HANDLE hand=GetStdHandle(STD_OUTPUT_HANDLE);

والتى تصبح بالاسمنلى

invoke GetStdHandle, STD_OUTPUT_HANDEL
mov hand,eax

ومن هذا يتضح لنا ان HANDEL ما هى الى DWORD, وال return value نحفظها فى متغير hand .

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

ارجو ان اكون قد وضحت الامور ولم اعقدها اكثر

والسلام

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

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

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

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