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

درس مبسط جداً للاسمبلى

مغلق
بدأه احمد غريب في 12 أبريل 2004 · 13 رد · 5,258 مشاهدة · في المواضيع المميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

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

من ضمن الاشياء التى تظهر لنا ان سى اسهل من الاسمبلى هى وجود المكتبات الجاهزه مثل ال stdio, ولو طلبنا من احد مبرمجى ال سى عدم استخدام هذه المكتبات وطلبنا منه كتابة برنامج مثال Hello World لوجد المسئله شاقه.

ولكن لن نطلب منهم ذلك بل سنقوم نحن باءختلاس مكتبت ال stdio وإستخدامها.

والان نقارن حتى نرى الفرق......

   
#include <stdio.h>

main()
{
     printf ("Hello World!\n");
     return 0
 }

وهنا الاسمبلى..

 
.486
.model flat, stdcall

include <c:\masm32\include\crtdll.inc>
includelib <c:\masm32\lib\crtdll.lib>

.data
    szHW    db	"Hello World",13,10,0

.data?

.code
start:
     invoke	printf ,addr szHW
     ret 0
end start

الشرح:

كما ترون الفرق ليس كبير. اول سطرين فى الاسمبلى هى لتحديد نوع ال Prossesor و ال operating system. بمعنى ان هذا البرنامج لا يعمل على Prossesor اقل من 486. جميع برامج ال Windows95 فما بعد تحتاج الى model flat. سنقوم لاحقاُ فى شرحها بتوسع, كذالك stdcall .

include و includelib هما لإستخدام المكتبه stdio.h التى تستخدم فى سى.

إذا لم تفهم كل هذه الاشياء فلا تقلق المهم التركيز فى الاتى لانه اهم جزء..

الباقى مقسم الى 3 اجزاء.. .data , .data? و .code .

.data هى المتغيرات المعرفة مثل

MyInteger dw 100
MyByte    db 3
MyString  db "Hello World",0

.?data هى المتغيرات الغير المعرفة مثل

MyInteger DW ?
MyByte    db ?
MyString  db 20 dup (?)

.code هو بداية البرنامج و start: و end start هى بمثابت الاقواس.

والان مثال اخر

.486
.model flat, stdcall
option casemap:none

include <c:\masm32\include\crtdll.inc>
includelib <c:\masm32\lib\crtdll.lib>


.data
szMyString1  db	"What is your name : ",0
szMyString2     db	"Oh I like this name %s ",13,10,0 
szMyString3  db	"How old are you :",0
szMyString4  db  "Only %d years Old",0
.data?
szName db 50 dup (?)
szAge  db ?
.code
start:
	invoke	printf ,addr szMyString1 
	invoke gets,addr szName
	invoke	printf ,addr szMyString2,addr szName
	invoke	printf ,addr szMyString3
	invoke gets, addr szAge
	invoke atoi, addr szAge ;atoi converts string to integer, return value is in eax
	invoke	printf ,addr szMyString4,eax;eax contains the Age
	ret 0
end start

لمتابعت الدرس تحتاج الى compiler وتستطيع الحصول عليه من هذا الرابط:

http://spiff.tripnet.se/~iczelion/files/masm32v8.zip

وكذالك تحتاج ل ctrdll.lib و ctrdll.inc والذى تحصل عليه من هذا الرابط:

www.nada.kth.se/~su00-aab/crtdll.zip

بعد تنصيب ال compiler عليك بنسخ الفايل ctrdll.inc الى c:\>masm32\include و الفايل ctrdll.lib الى c:\>masm32\lib.

طريقة ال compile:

c:\>ml /c /coff filename.asm

بعد نجاح ال compile تستطيع القيام بال link على النحو التالى :

c:\>link /subsystem:consle filename.obj

الى هنا ينتهى الدرس الاول, الدرس التالى سيكون بعون الله تعلى الاسبوع القادم, و الموضع عن العمليات الحسابيه. ولكن لابد ان ارى مشاركات و اهتمام حتى يكون هناك تواصل, ايضاُ اريد ان اعرف عدد المهتمين بهذا الدرس.

والسلام ختام

احمد غريب

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

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

#2

السلام عليكم

أشكر السيد أحمد على هذه المحاولة وأتمنى أن يكون هناك من يهتم بهذا الجانب من البرمجة وكما أن Masm32 قد سهل البرمجة إلى حد كبير وكما قلت وأقول دائما أن من يعرف برمجة س بطريقة API قد يلج هذه البرمجة بسهولة فهي تسير على نفس المنوال

إلى اللقاء.

#3

السلام عليكم

شكرا على هذا الدرس الجميل

لكن هل من الممكن كتابة مكتبة crtdll.inc

و مكتبة مثل stdio.h

وهل من المكن أن يصرف هذا البرنامج على tasm أو masm

وشكرا جزيلا

#4

السلام عليكم

اولاً اشكرك على المرور, وهذى الدرس سيواصل بعد إنتهاء دروس الاخ عفيف إن شاء الله تعالى.

بالنسبه لل .inc فهى بمثابة ال .h فى لغة c و بالتاكيد يمكن إنشاء مثل هذه المكتبات فى السمبلى, سوف نتطرق لهذا الموضوع لاحقاً إن شاء الله.

هذى الدرس يشرح طريقه البرمجه فى masm32 حيث ان خاصية ال invoke غير متوفره فى لغة Tasm , ولكن تحويله الى هذه الغه سهل جداً مثال على ذالك

invoke printf ,addr szHW

تحول الى Tasm على النحو التالى

mov eax,OFFSET szHW
push eax
call printf

انا شخصياً افضل masm32 لانها تسهل الكثير من الامور, و إمكانيات الماكرو افضل فى ال masm32 بالاضافه الى ان عدد مستخدمى ال masm32 تفوق عدد مستخدمى Tasm, من ما يسهل الحصول على معلومات.

والسلام

تم تعديل هذه المشاركة بواسطة احمد غريب في 13 مايو 2004 في 16:17

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

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

#5

للرفع فقط...

d4baa0.gif
#6

المقال الذي احضر له الان يتناول 32bit لكن هناك بعض الامور في الشرح النظري يتعرقل بسبب الحاجة الى توضيح كافة النقاط.. اعتقد اني ساتقصد ترك بعض الثغرات لنرى من يهتم بها..

قد يتاخر الامر لاني مشغول حاليا.. اسال الله ان يتيح لي الوقت للمتابعة

Do as I say, not as I do

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

#7

اعتقد ايضا من يريد برمجه visual assembly سوف يتوقف كثير مع معلوماته في visual c

وخاصه مع API والتعامل مع النظام وفي masm32 اجد صعوبه بالتفريق بينها وبين high level language وخاصه بنيه اللغه فهي تركبيه اقرب الى الفهم من لغه الآله

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

هناك فرق شاسع بين HLA و masm32 لغة ماسم هى لغة اسمبلى نظيفة ولكنها تتيح لك إستخدام بعض الادوات مثل if وwhile ولكن تستطيع الاستغناء عنها إذا كنت تفضل البرمجة بلغة الاسمبلى فقط, اما HLA فهى اقرب إلى الPascal القديمة ..

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

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

#9

السلام عليكم ،،

يا سلام ,,

درس بسيط ومفيد ،،

جزاك الله كل خير

انا صاري كم يوم قررت ان ابدء بهذه اللغة ،

و الدروس ما شا الله موجودة من قبل المشرفين المتميزين لهذا القسم ،،

سؤال،

ما فائدة هذه الارقام في تعريف المتغير ..

szHW	db "Hello World",13,10,0
MyString  db "Hello World",0

السلام عليكم ،

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#10

13 10 او dh ah معناها Enter, الرقم 10 هو ah بالHex والرقم 13 هو dh .

كما تعرف فأن Enter هي عبارة عن رمزين الرمز الاول هو 13 ويسمي Carriage وهو المسئول عن الدهاب للسطر الاسفل, والرقم 10 ويمسي return وهو المسئول عن العودة لاول السطر...

الرقم 0 يحدد نهاية الجملة وهناك فرق كبير بين "0" و 0 الاول يعتبر رمز يمكن كتابته على الشاشة اما الثاني فهو عبارة عن NULL ....

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

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

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

#11

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

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

هل masm23 قادر على صنع برامج تعمل بمفردها بدون نظام تشغيل؟

و في النهاية عندي طلب بسيط و هو عن كتاب يحتوي على تعليمات المعالج X386 لأنه عندي كتاب يحتوي على تعليمات المعالج X86 في بيئة 16 و أريد أن أتطور إلى بيئة 32 فأرجو أن تساعدني و شكراً

تقســــم الناس دنياهم و فتنتها وقد تفرد من يـهوى بدنياهُ

ما فارق الري قلباً أنت جذوتهُ و لا النعيم محباً أنت سلواهُ

#12

يا اخي فكر قليلاً قبل طرح السؤال..

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

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

http://www.intel.com

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

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

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

#14

مشكور أخي أحمد على الرد بارك الله فيك و لكن كنت أقصد بدون ظام تشغيل أي أن أقوم أنا ببرمجة نظام التشغيل و تحميل نواة النظام و شكراً مجدداً

تقســــم الناس دنياهم و فتنتها وقد تفرد من يـهوى بدنياهُ

ما فارق الري قلباً أنت جذوتهُ و لا النعيم محباً أنت سلواهُ

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

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